本文介紹使用GitOps時的常見問題及解決方案。
GitOps如何連接私有Git倉庫?
私有Git倉庫通常會因安全問題而不能開通公網訪問,所以要使用ACK One GitOps連接私有Git倉庫發布應用,最主要的問題是解決網絡連通問題,其次是如何配置連接。
步驟一、配置域名解析,使GitOps可訪問私有Git倉庫
以下示例以Git倉庫域名git.abc.cn
為例進行配置。
連通云下和云上ACK One VPC網絡。連接方式,請參見連接本地IDC和云上VPC。
使用內網DNS解析來實現VPC內域名解析。
登錄云解析 DNS控制臺,在內網DNS解析 (PrivateZone)頁面單擊用戶域名頁簽,然后單擊添加域名(Zone),在彈出的面板中配置以下參數,單擊確定。
內置權威域名 (Zone):abc.cn(以Git倉庫域名
git.abc.cn
為例)子域名遞歸解析代理:開啟
:選擇ACK One綁定的VPC
在域名列表中找到剛剛創建的PrivateZone,在其操作列單擊解析記錄,進入解析記錄頁面。
在解析記錄頁面單擊添加記錄,在彈出的面板中配置以下參數,然后單擊確定。
記錄類型:A
主機記錄:git(以Git倉庫域名
git.abc.cn
為例)記錄值:填寫內部Git倉庫的IP地址
完成配置后,ACK One GitOps可以訪問到上面配置的私有Git倉庫,您可以通過GitOps控制臺/CLI連接倉庫,用于發布應用。
步驟二、通過控制臺或CLI連接Git倉庫
域名解析配置完成后,ACK One GitOps就可以訪問到對應的私有Git倉庫,您可以通過GitOps控制臺/CLI連接Git倉庫,用于發布應用。具體操作,請參見Private Repositories。
GitOps控制臺上的Applications如何展示分組?
當GitOps控制臺上的Applications數量較多時,通過分組展示可以獲得更好的使用體驗。
在GitOps控制臺左側菜單欄,您可根據Favorites Only、SYNC STATUS、HEALTH STATUS進行篩選,也可以通過LABELS、PROJECTS、CLUSTERS、NAMESPACES和AUTO SYNC進行分組展示。
運維人員如何控制應用發布?
在應用發布過程中,尤其在自動化CI/CD流水線中,往往需要控制發布,您可以通過以下方式進行控制:
使用
ManualSync
模式的應用。運維人員在代碼推送后,檢查和確認應用是否符合要求,符合要求后手動點擊Sync
同步應用到目標集群。修改應用部署倉庫中的鏡像版本:在非自動化監測鏡像倉庫鏡像變化時,運維人員需要對鏡像進行確認。確認無誤后,可以手動修改應用部署倉庫中的鏡像版本,以自動觸發ArgoCD的應用同步。
建立code review機制:在自動化CI/CD流水線中,對業務代碼倉庫建立code review機制。運維人員code review通過后合并代碼,自動觸發CI build&push鏡像,ArgoCD自動監測鏡像變更,并自動發布到配置
AutoSync
的環境,您也可以手動發布到ManualSync
的環境。
AgroCD的repo-server出現Out of diskspace
報錯怎么辦?
問題現象
通過kubectl -nargocd logs xxxx
命令查看日志,看到repo-server出現如下報錯信息:
'git checkout --force xxx' failed exit status 128: error: unable to write file templates/deployment.yaml\nfat al: sha1 file '/tmp/_argocd-repo/xxx/.git/index.lock' write error. Out of diskspace...
解決方案
該問題可通過增加ACK One GitOps ArgoCD組件的Pod的臨時存儲來解決。
當前ACK One GitOps ArgoCD組件使用ECI運行,默認具有30GiB的臨時存儲空間,增加臨時存儲空間的步驟如下,具體費用請參見臨時存儲空間計費。
從ACK One控制臺獲取艦隊實例的KubeConfig,并通過Kubectl連接至艦隊實例。具體操作,請參見通過kubectl連接Kubernetes集群。
在對應Deployment的Pod Template中,為Pod添加annotation
k8s.aliyun.com/eci-extra-ephemeral-storage: "20Gi"
,其中臨時存儲空間大小可自定義。如果GitOps處于默認模式,在Deployment argocd-server中添加。
kubectl edit deployment -nargocd argocd-server
如果GitOps處于高可用模式,在Deployment argocd-dex-imageupdate-repo-server中添加。
kubectl edit deployment -nargocd argocd-dex-imageupdate-repo-server
apiVersion: apps/v1 kind: Deployment metadata: ... ... spec: template: metadata: annotations: ## 在30GiB的基礎上增加20GiB,共50GiB。增加的臨時存儲空間大小可自定義。 k8s.aliyun.com/eci-extra-ephemeral-storage: "20Gi" ... ... ...
如何避免GitOps Application跟蹤到非應用資源?
背景信息
Argo CD使用labelapp.kubernetes.io/instance
來追蹤K8s資源,當資源有這個label,并且值和Application Name一致,就會被Application追蹤到,造成應用的狀態一直處于OutOfSync
,也可能會一直刪除這個非應用資源,為了避免這類非預期行為,有以下兩種解決方案。
解決方案
方案1:在艦隊的
argocd/argocd-cm
中添加resource.exclusions
來忽略被追蹤到的非應用資源,如下配置可忽略CiliumIdentity
資源。
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
labels:
app.kubernetes.io/name: argocd-cm
app.kubernetes.io/part-of: argocd
data:
...
resource.exclusions: |
- apiGroups:
- cilium.io
kinds:
- CiliumIdentity
clusters:
- "*"
方案2:在艦隊的
argocd/argocd-cm
中添加自定義標簽application.instanceLabelKey: argocd.argoproj.io/instance
。添加后,使用Argo CD下發的應用的資源則會包含labelargocd.argoproj.io/instance
,從而不會追蹤到僅有labelapp.kubernetes.io/instance
的資源。配置生效后,現有的Application狀態可能顯示為OutOfSync
。apiVersion: v1 kind: ConfigMap metadata: name: argocd-cm labels: app.kubernetes.io/name: argocd-cm app.kubernetes.io/part-of: argocd data: ... application.instanceLabelKey: argocd.argoproj.io/instance