背景介紹
請回答:你們是如何保證線上部署的服務,從服務版本到參數配置,都是和測試通過的版本是一致的呢?
本文將介紹GitOps的基本原理以及ArgoCD的使用:ArgoCD部署Grafana Loki 到k8s集群。
本文項目地址:郭麻花的Azure Devops argo-cd - Repos (azure.com)
什么是GitOps
GitOps通常作為k8s集群中的一項基礎設施。它將Git倉庫中的服務清單作為唯一版本來源,并且提供自動部署機制。
GitOps提供了高度自動化和審計朔源能力來管理集群服務,大大提高團隊交付效率與安全一致性。
ArgoCD
ArgoCD是一個用于Kubernetes集群的開源且強大的GitOps工具。
ArgoCD可以做什么
- ArgoCD可以管理各種Kubernetes原生資源,如Deployment、Service、ConfigMap、Secret等;
- ArgoCD還可以管理Helm Chart,Kubernetes CRD等;
- ArgoCD還可以管理有狀態服務,如PersistentVolumeClaim等。
總之,你可以將ArgoCD看作是集群的管家,它可以嚴格按照Git倉庫中的清單文件,時刻監視清單與集群資源的差異,并提供自動/手動?同步機制。
ArgoCD Application?
Application是由ArgoCD創建的一種Kubernetes CRD。一個k8s服務通常包含多種資源,例如:deployment, secret, configmap 或者CRD等等,而ArgoCD 可以將這些資源視為一個Application進行管理。
假如你們的服務已經被打包成了Helm Chart,更容易通過ArgoCD Application來進行管理。
注意:ArgoCD在部署Helm Chart時會將Chart重新拆解為各項資源文件進行部署,因此你無法通過Helm來管理ArgoCD部署的Helm Chart。
另外:Application可以包含其它Application。你可以在ArgoCD中對集群中的服務進行邏輯劃分,將多個Application聚合到一個Application下進行管理。
使用Helm安裝ArgoCD
使用helm安裝ArgoCD非常簡單,但是需要注意:
即使在具有充分的Cluster Role的情況下,ArgoCD 默認也只允許資源部署到它所在的命名空間。我們可以通過指定server參數 --application-namespaces="*",讓ArgoCD允許資源部署到其他命名空間。
helm repo add argo https://argoproj.github.io/argo-helmhelm install my-release argo/argo-cd
我們可以通過port-forward argocd-server 8080端口,并使用init-secret中的admin密碼訪問Argocd。
創建Git清單倉庫
Grafana Loki是一個開源的高性能的集群日志聚合服務,它的原理與Promthus相似,與Grafana結合使用,可以獲得與EFK解決方案相同的集群日志聚合可視化能力。
我將使用ArgoCD來部署Grafana Loki到集群中,請參考:?argo-cd - sample (azure.com)
例如,下面是包含了 Loki helm chart的ArgocCD Application:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:name: lokinamespace: argocd
spec:syncPolicy:syncOptions:- ServerSideApply=trueproject: defaultsource:chart: lokirepoURL: https://grafana.github.io/helm-chartstargetRevision: 5.9.2helm:releaseName: lokivalues: |loki:auth_enabled: falsecommonConfig:replication_factor: 1storage:type: 'filesystem'singleBinary:replicas: 1destination:server: "https://kubernetes.default.svc"namespace: loki
添加Repositories和certificates
現在,我們需要將Helm Chart倉庫和Apps Git倉庫以及它們的訪問憑證添加到ArgoCD當中。
我所用到的是公開的Helm Chart倉庫和Git倉庫,假如你使用的是私有倉庫,你需要為它指定連接所必須的憑證。對于Azure Git來說,只需要一個PAT(personal access token)
創建Grafana Loki App
我們用上面創建好的Git Repo地址,創建一個名為grafana-loki的App.
該Application包含了三個Application:Promtail, Loki, Grafana。
此時,這三個App的狀態是Missing,意味著在集群中不存在;如果是集群版本與Git版本不一致,狀態應該是OutSync;集群服務與Git倉庫一致,則是Synced。
Application狀態圖例

讓ArgoCD管理自己
最后,我要介紹一下如何讓ArgoCD管理它自己。我們前面使用Helm安裝了ArgoCD,因此當前集群中ArgoCD服務是由Helm來管理的,這意味著集群服務現在有著兩種不同的管理模式。
1. 我們需要在Git倉庫中創建一個Application表示當前ArgoCD服務:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:name: argo-cdnamespace: argocdfinalizers:- resources-finalizer.argocd.argoproj.io
spec:destination:server: https://kubernetes.default.svcnamespace: argocdproject: defaultsource:chart: argo-cdrepoURL: https://argoproj.github.io/argo-helmtargetRevision: 5.43.3helm:values: |server:extraArgs:- --application-namespaces="*"- --insecuresyncPolicy:automated:prune: trueselfHeal: true
2. 如上,使用上面的Application yaml,在ArgoCD中為它自己創建一個App。?
3. 等待app狀態自己變為Synced,我們可以看到ArgoCD相關的pod將被重新創建出來,之后ArgoCD將管理它自己的狀態。
4. 移除ArgoCD的Helm標記,之后我們將無法再通過Helm管理集群中的ArgoCD服務,而是由ArgoCD自己來管理自己。
kubectl delete secret -l owner=helm,name=argo-cd -n argocd
總結?
當然,能夠實現GitOps的技術還有很多,GitOps的價值也不僅僅是自動化,可溯源。
例如:我們還可以使用ArgoCD的ApplicationSet為不同環境下的app定制不同的參數;我們也可以利用Git倉庫的分支和pr策略,在CI階段進行smoke test,或者其它更有價值的Actions。
總之,我們應盡可能采取科學的,優雅的技術來不斷優化軟件工程。