Argo CD 保姆級(jí)入門教程

?原文鏈接??:https://icloudnative.io/posts/getting-started-with-argocd/
請(qǐng)復(fù)制粘貼到瀏覽器打開
在上一篇『??GitOps 介紹[1]』中,我介紹了什么是 GitOps,包括 GitOps 的原則和優(yōu)勢(shì),以及 GitOps 與 DevOps 的區(qū)別。本文將介紹用于實(shí)施 GitOps 的工具 Argo CD。
Argo CD 是以 Kubernetes 作為基礎(chǔ)設(shè)施,遵循聲明式 GitOps 理念的持續(xù)交付(continuous delivery, CD)工具,支持多種配置管理工具,包括 ksonnet/jsonnet、kustomize 和 Helm 等。它的配置和使用非常簡(jiǎn)單,并且自帶一個(gè)簡(jiǎn)單易用的可視化界面。
按照官方定義,Argo CD 被實(shí)現(xiàn)為一個(gè) Kubernetes 控制器,它會(huì)持續(xù)監(jiān)控正在運(yùn)行的應(yīng)用,并將當(dāng)前的實(shí)際狀態(tài)與 Git 倉(cāng)庫(kù)中聲明的期望狀態(tài)進(jìn)行比較,如果實(shí)際狀態(tài)不符合期望狀態(tài),就會(huì)更新應(yīng)用的實(shí)際狀態(tài)以匹配期望狀態(tài)。
在正式開始解讀和使用 Argo CD 之前,我們需要先搞清楚為什么需要 Argo CD?它能給我們帶來(lái)什么價(jià)值?
插播一句,8 月 6 日 KubeSphere 將和 SOFAStack 在廣州聯(lián)合主辦一場(chǎng)云原生主題的 Meetup,想和我面基的同學(xué)歡迎報(bào)名??,我在現(xiàn)場(chǎng)等你!

傳統(tǒng) CD 工作流
從上篇文章『??GitOps 介紹[2]』可以知道,目前大多數(shù) CI/CD 工具都使用基于 Push 的部署模式,例如 Jenkins、CircleCI 等。這種模式一般都會(huì)在 CI 流水線運(yùn)行完成后執(zhí)行一個(gè)命令(比如 kubectl)將應(yīng)用部署到目標(biāo)環(huán)境中。

這種 CD 模式的缺陷很明顯:
需要安裝配置額外工具(比如 kubectl); 需要 Kubernetes 對(duì)其進(jìn)行授權(quán); 需要云平臺(tái)授權(quán); 無(wú)法感知部署狀態(tài)。也就無(wú)法感知期望狀態(tài)與實(shí)際狀態(tài)的偏差,需要借助額外的方案來(lái)保障一致性。
下面以 Argo CD 為例,來(lái)看看遵循聲明式 GitOps 理念的 CD 工具是怎么實(shí)現(xiàn)的。
使用 Argo CD 的 CD 工作流
和傳統(tǒng) CI/CD 工具一樣,CI 部分并沒(méi)有什么區(qū)別,無(wú)非就是測(cè)試、構(gòu)建鏡像、推送鏡像、修改部署清單等等。重點(diǎn)在于 CD 部分。
Argo CD 會(huì)被部署在 Kubernetes 集群中,使用的是基于 Pull 的部署模式,它會(huì)周期性地監(jiān)控應(yīng)用的實(shí)際狀態(tài),也會(huì)周期性地拉取 Git 倉(cāng)庫(kù)中的配置清單,并將實(shí)際狀態(tài)與期望狀態(tài)進(jìn)行比較,如果實(shí)際狀態(tài)不符合期望狀態(tài),就會(huì)更新應(yīng)用的實(shí)際狀態(tài)以匹配期望狀態(tài)。

無(wú)論是通過(guò) CI 流水線觸發(fā)更新 K8s 編排文件,還是 DevOps 工程師直接修改 K8s 編排文件,Argo CD 都會(huì)自動(dòng)拉取最新的配置并應(yīng)用到 K8s 集群中。
最終會(huì)得到一個(gè)相互隔離的 CI 與 CD 流水線,CI 流水線通常由研發(fā)人員(或者 DevOps 團(tuán)隊(duì))控制,CD 流水線通常由集群管理員(或者 DevOps 團(tuán)隊(duì))控制。

Argo CD 的優(yōu)勢(shì)
下面我們來(lái)看看 Argo CD 相較于傳統(tǒng) CD 工具有哪些比較明顯的優(yōu)勢(shì)。
Git 作為應(yīng)用的唯一真實(shí)來(lái)源
所有 K8s 的聲明式配置都保存在 Git 中,并把 Git 作為應(yīng)用的唯一事實(shí)來(lái)源,我們不再需要手動(dòng)更新應(yīng)用(比如執(zhí)行腳本,執(zhí)行 kubectl apply 或者 helm install 命令),只需要通過(guò)統(tǒng)一的接口(Git)來(lái)更新應(yīng)用。
此外,Argo CD 不僅會(huì)監(jiān)控 Git 倉(cāng)庫(kù)中聲明的期望狀態(tài),還會(huì)監(jiān)控集群中應(yīng)用的實(shí)際狀態(tài),并將兩種狀態(tài)進(jìn)行對(duì)比,只要實(shí)際狀態(tài)不符合期望狀態(tài),實(shí)際狀態(tài)就會(huì)被修正與期望狀態(tài)一致。所以即使有人修改了集群中應(yīng)用的狀態(tài)(比如修改了副本數(shù)量),Argo CD 還是會(huì)將其恢復(fù)到之前的狀態(tài)。這就真正確保了 Git 倉(cāng)庫(kù)中的編排文件可以作為集群狀態(tài)的唯一真實(shí)來(lái)源。
當(dāng)然,有時(shí)候我們需要快速更新應(yīng)用并進(jìn)行調(diào)試,通過(guò) Git 來(lái)觸發(fā)更新還是慢了點(diǎn),這也不是沒(méi)有辦法,我們可以修改 Argo CD 的配置,使其不對(duì)手動(dòng)修改的部分進(jìn)行覆蓋或者回退,而是直接發(fā)送告警,提醒管理員不要忘了將更新提交到 Git 倉(cāng)庫(kù)中。
快速回滾
Argo CD 會(huì)定期拉取最新配置并應(yīng)用到集群中,一旦最新的配置導(dǎo)致應(yīng)用出現(xiàn)了故障(比如應(yīng)用啟動(dòng)失?。?,我們可以通過(guò) Git History 將應(yīng)用狀態(tài)快速恢復(fù)到上一個(gè)可用的狀態(tài)。
如果你有多個(gè) Kubernetes 集群使用同一個(gè) Git 倉(cāng)庫(kù),這個(gè)優(yōu)勢(shì)會(huì)更明顯,因?yàn)槟悴恍枰謩e在不同的集群中通過(guò) kubectl delete 或者 helm uninstall 等手動(dòng)方式進(jìn)行回滾,只需要將 Git 倉(cāng)庫(kù)回滾到上一個(gè)可用的版本,Argo CD 便會(huì)自動(dòng)同步。
集群災(zāi)備
如果你在青云[3]北京3區(qū)中的 KubeSphere[4] 集群出現(xiàn)故障,且短期內(nèi)不可恢復(fù),可以直接創(chuàng)建一個(gè)新集群,然后將 Argo CD 連接到 Git 倉(cāng)庫(kù),這個(gè)倉(cāng)庫(kù)包含了整個(gè)集群的所有配置聲明。最終新集群的狀態(tài)會(huì)與之前舊集群的狀態(tài)一致,完全不需要人工干預(yù)。

使用 Git 實(shí)現(xiàn)訪問(wèn)控制
通常在生產(chǎn)環(huán)境中是不允許所有人訪問(wèn) Kubernetes 集群的,如果直接在 Kubernetes 集群中控制訪問(wèn)權(quán)限,必須要使用復(fù)雜的 RBAC 規(guī)則。在 Git 倉(cāng)庫(kù)中控制權(quán)限就比較簡(jiǎn)單了,例如所有人(DevOps 團(tuán)隊(duì),運(yùn)維團(tuán)隊(duì),研發(fā)團(tuán)隊(duì),等等)都可以向倉(cāng)庫(kù)中提交 Pull Request,但只有高級(jí)工程師可以合并 Pull Request。
這樣做的好處是,除了集群管理員和少數(shù)人員之外,其他人不再需要直接訪問(wèn) Kubernetes 集群,只需訪問(wèn) Git 倉(cāng)庫(kù)即可。對(duì)于程序而言也是如此,類似于 Jenkins 這樣的 CI 工具也不再需要訪問(wèn) Kubernetes 的權(quán)限,因?yàn)橹挥?Argo CD 才可以 apply 配置清單,而且 Argo CD 已經(jīng)部署在 Kubernetes 集群中,必要的訪問(wèn)權(quán)限已經(jīng)配置妥當(dāng),這樣就不需要給集群外的任意人或工具提供訪問(wèn)的證書,可以提供更強(qiáng)大的安全保障。

擴(kuò)展 Kubernetes
雖然 Argo CD 可以部署在 Kubernetes 集群中,享受 Kubernetes 帶來(lái)的好處,但這不是 Argo CD 專屬的呀!Jenkins 不是也可以部署在 Kubernetes 中嗎?Argo CD 有啥特殊的嗎?
那當(dāng)然有了,沒(méi)這金剛鉆也不敢攬這瓷器活啊,Argo CD 巧妙地利用了 Kubernetes 集群中的很多功能來(lái)實(shí)現(xiàn)自己的目的,例如所有的資源都存儲(chǔ)在 Etcd 集群中,利用 Kubernetes 的控制器來(lái)監(jiān)控應(yīng)用的實(shí)際狀態(tài)并與期望狀態(tài)進(jìn)行對(duì)比,等等。
這樣做最直觀的好處就是可以實(shí)時(shí)感知應(yīng)用的部署狀態(tài)。例如,當(dāng)你在 Git 倉(cāng)庫(kù)中更新配置清單中的鏡像版本后,Argo CD 會(huì)將集群中的應(yīng)用更新到最新版本,你可以在 Argo CD 的可視化界面中實(shí)時(shí)查看更新狀態(tài)(比如 Pod 創(chuàng)建成功,應(yīng)用成功運(yùn)行并且處于健康狀態(tài),或者應(yīng)用運(yùn)行失敗需要進(jìn)行回滾操作)。
Argo CD 架構(gòu)

從功能架構(gòu)來(lái)看,Argo CD 主要有三個(gè)組件:API Server、Repository Server 和 Application Controller。從 GitOps 工作流的角度來(lái)看,總共分為 3 個(gè)階段:檢索、調(diào)諧和呈現(xiàn)。
檢索 -- Repository Server
檢索階段會(huì)克隆應(yīng)用聲明式配置清單所在的 Git 倉(cāng)庫(kù),并將其緩存到本地存儲(chǔ)。包含 Kubernetes 原生的配置清單、Helm Chart 以及 Kustomize 配置清單。履行這些職責(zé)的組件就是 Repository Server。
調(diào)諧 -- Application Controller
調(diào)諧(Reconcile)階段是最復(fù)雜的,這個(gè)階段會(huì)將 Repository Server 獲得的配置清單與反映集群當(dāng)前狀態(tài)的實(shí)時(shí)配置清單進(jìn)行對(duì)比,一旦檢測(cè)到應(yīng)用處于 OutOfSync 狀態(tài),Application Controller 就會(huì)采取修正措施,使集群的實(shí)際狀態(tài)與期望狀態(tài)保持一致。
呈現(xiàn) -- API Server
最后一個(gè)階段是呈現(xiàn)階段,由 Argo CD 的 API Server 負(fù)責(zé),它本質(zhì)上是一個(gè) gRPC/REST Server,提供了一個(gè)無(wú)狀態(tài)的可視化界面,用于展示調(diào)諧階段的結(jié)果。同時(shí)還提供了以下這些功能:
應(yīng)用管理和狀態(tài)報(bào)告; 調(diào)用與應(yīng)用相關(guān)的操作(例如同步、回滾、以及用戶自定義的操作); Git 倉(cāng)庫(kù)與集群憑證管理(以 Kubernetes Secret 的形式存儲(chǔ)); 為外部身份驗(yàn)證組件提供身份驗(yàn)證和授權(quán)委托; RBAC 增強(qiáng); Git Webhook 事件的監(jiān)聽器/轉(zhuǎn)發(fā)器。
部署 Argo CD
Argo CD 有兩種不同的部署模式:
多租戶
Argo CD 最常用的部署模式是多租戶,一般如果組織內(nèi)部包含多個(gè)應(yīng)用研發(fā)團(tuán)隊(duì),就會(huì)采用這種部署模式。用戶可以使用可視化界面或者 argocd CLI 來(lái)訪問(wèn) Argo CD。argocd CLI 必須先通過(guò) argocd login <server-host> 來(lái)獲取 Argo CD 的訪問(wèn)授權(quán)。
$ argocd login SERVER [flags]
## Login to Argo CD using a username and password
$ argocd login cd.argoproj.io
## Login to Argo CD using SSO
$ argocd login cd.argoproj.io --sso
## Configure direct access using Kubernetes API server
$ argocd login cd.argoproj.io --core
多租戶模式提供了兩種不同的配置清單:
非高可用
推薦用于測(cè)試和演示環(huán)境,不推薦在生產(chǎn)環(huán)境下使用。有兩種部署清單可供選擇:
install.yaml[5] - 標(biāo)準(zhǔn)的 Argo CD 部署清單,擁有集群管理員權(quán)限??梢允褂?Argo CD 在其運(yùn)行的集群內(nèi)部署應(yīng)用程序,也可以通過(guò)接入外部集群的憑證將應(yīng)用部署到外部集群中。 namespace-install.yaml[6] - 這個(gè)部署清單只需要 namespace 級(jí)別的權(quán)限。如果你不需要在 Argo CD 運(yùn)行的集群中部署應(yīng)用,只需通過(guò)接入外部集群的憑證將應(yīng)用部署到外部集群中,推薦使用此部署清單。還有一種花式玩法,你可以為每個(gè)團(tuán)隊(duì)分別部署單獨(dú)的 Argo CD 實(shí)例,但是每個(gè) Argo CD 實(shí)例都可以使用特殊的憑證(例如 argocd cluster add <CONTEXT> --in-cluster --namespace <YOUR NAMESPACE>)將應(yīng)用部署到同一個(gè)集群中(即kubernetes.svc.default,也就是內(nèi)部集群)。
???注意:namespace-install.yaml 配置清單中并不包含 Argo CD 的 CRD,需要自己提前單獨(dú)部署:
kubectl apply -k https://github.com/argoproj/argo-cd/manifests/crds\?ref\=stable。
高可用
與非高可用部署清單包含的組件相同,但增強(qiáng)了高可用能力和彈性能力,推薦在生產(chǎn)環(huán)境中使用。
ha/install.yaml[7] - 與上文提到的 install.yaml 的內(nèi)容相同,但配置了相關(guān)組件的多個(gè)副本。 ha/namespace-install.yaml[8] - 與上文提到的 namespace-install.yaml 相同,但配置了相關(guān)組件的多個(gè)副本。
Core
Core 模式也就是最精簡(jiǎn)的部署模式,不包含 API Server 和可視化界面,只部署了每個(gè)組件的輕量級(jí)(非高可用)版本。
用戶需要 Kubernetes 訪問(wèn)權(quán)限來(lái)管理 Argo CD,因此必須使用下面的命令來(lái)配置 argocd CLI:
$ kubectl config set-context --current --namespace=argocd # change current kube context to argocd namespace
$ argocd login --core
也可以使用命令 argocd admin dashboard 手動(dòng)啟用可視化界面。
具體的配置清單位于 Git 倉(cāng)庫(kù)中的 core-install.yaml[9]。
除了直接通過(guò)原生的配置清單進(jìn)行部署,Argo CD 還支持額外的配置清單管理工具。
Kustomize
Argo CD 配置清單也可以使用 Kustomize 來(lái)部署,建議通過(guò)遠(yuǎn)程的 URL 來(lái)調(diào)用配置清單,使用 patch 來(lái)配置自定義選項(xiàng)。
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: argocd
resources:
- https://raw.githubusercontent.com/argoproj/argo-cd/v2.0.4/manifests/ha/install.yaml
Helm
Argo CD 的 Helm Chart 目前由社區(qū)維護(hù),地址:https://github.com/argoproj/argo-helm/tree/master/charts/argo-cd[10]。
下面演示一下部署過(guò)程。如果沒(méi)有現(xiàn)成的 Kubernetes 環(huán)境,可以通過(guò) KubeSphere Cloud 托管集群服務(wù)[11]快速創(chuàng)建一個(gè),免費(fèi)體驗(yàn)時(shí)間為 2 小時(shí),到期后集群會(huì)自動(dòng)刪除,可不限次重建。
創(chuàng)建 Kubernetes 集群的過(guò)程很簡(jiǎn)單,首先注冊(cè)登錄 https://kubesphere.cloud[12] 控制臺(tái),然后點(diǎn)擊 托管集群服務(wù) 打開 新建 Kubernetes 集群 頁(yè)面,填寫集群名稱,選擇運(yùn)行環(huán)境,點(diǎn)擊 新建 菜單即可創(chuàng)建集群。

幾秒鐘之后便會(huì)創(chuàng)建完畢,并顯示集群基本信息。下載 kubeconfig,便可使用 kubectl 來(lái)訪問(wèn)集群。

接下來(lái)開始部署 Argo CD:
$ kubectl create namespace argocd
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
查看部署結(jié)果:
$ kubectl -n argocd get pod
argocd-applicationset-controller-69879c47c-pcbkg 1/1 Running 0 26m
argocd-notifications-controller-6b4b74d8d8-s7mrz 1/1 Running 0 26m
argocd-redis-65596bf87-2hzcv 1/1 Running 0 26m
argocd-dex-server-78c9764884-6lcww 1/1 Running 0 26m
argocd-repo-server-657d46f8b-87rzq 1/1 Running 0 26m
argocd-application-controller-0 1/1 Running 0 26m
argocd-server-6b48df79dd-b7bkw 1/1 Running 0 26m
訪問(wèn) Argo CD
部署完成后,可以通過(guò) Service argocd-server 來(lái)訪問(wèn)可視化界面。
$ kubectl -n argocd get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-applicationset-controller ClusterIP 10.105.250.212 <none> 7000/TCP,8080/TCP 5m10s
argocd-dex-server ClusterIP 10.108.88.97 <none> 5556/TCP,5557/TCP,5558/TCP 5m10s
argocd-metrics ClusterIP 10.103.11.245 <none> 8082/TCP 5m10s
argocd-notifications-controller-metrics ClusterIP 10.98.136.200 <none> 9001/TCP 5m9s
argocd-redis ClusterIP 10.110.151.108 <none> 6379/TCP 5m9s
argocd-repo-server ClusterIP 10.109.131.197 <none> 8081/TCP,8084/TCP 5m9s
argocd-server ClusterIP 10.98.23.255 <none> 80/TCP,443/TCP 5m9s
argocd-server-metrics ClusterIP 10.103.184.121 <none> 8083/TCP 5m8s
如果你的客戶端可以直連 Service IP,那就直接可以通過(guò) argocd-server 的 Cluster IP 來(lái)訪問(wèn)?;蛘呖梢灾苯油ㄟ^(guò)本地端口轉(zhuǎn)發(fā)來(lái)訪問(wèn):
$ kubectl port-forward svc/argocd-server -n argocd 8080:443
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
初始密碼以明文形式存儲(chǔ)在 Secret argocd-initial-admin-secret 中,可以通過(guò)以下命令獲取:
$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
也可以通過(guò)以下命令來(lái)修改登錄密碼:
$ argocd account update-password --account admin --current-password xxxx --new-password xxxx
登錄后的界面:

Argo CD 核心概念
在正式開始使用 Argo CD 之前,需要先了解兩個(gè)基本概念。
Argo CD Application

Argo CD 中的 Application 定義了 Kubernetes 資源的來(lái)源(Source)和目標(biāo)(Destination)。來(lái)源指的是 Git 倉(cāng)庫(kù)中 Kubernetes 資源配置清單所在的位置,而目標(biāo)是指資源在 Kubernetes 集群中的部署位置。
來(lái)源可以是原生的 Kubernetes 配置清單,也可以是 Helm Chart 或者 Kustomize 部署清單。
目標(biāo)指定了 Kubernetes 集群中 API Server 的 URL 和相關(guān)的 namespace,這樣 Argo CD 就知道將應(yīng)用部署到哪個(gè)集群的哪個(gè) namespace 中。
簡(jiǎn)而言之,Application 的職責(zé)就是將目標(biāo) Kubernetes 集群中的 namespace 與 Git 倉(cāng)庫(kù)中聲明的期望狀態(tài)連接起來(lái)。
Application 的配置清單示例:

如果有多個(gè)團(tuán)隊(duì),每個(gè)團(tuán)隊(duì)都要維護(hù)大量的應(yīng)用,就需要用到 Argo CD 的另一個(gè)概念:項(xiàng)目(Project)。
Argo CD Project
Argo CD 中的項(xiàng)目(Project)可以用來(lái)對(duì) Application 進(jìn)行分組,不同的團(tuán)隊(duì)使用不同的項(xiàng)目,這樣就實(shí)現(xiàn)了多租戶環(huán)境。項(xiàng)目還支持更細(xì)粒度的訪問(wèn)權(quán)限控制:
限制部署內(nèi)容(受信任的 Git 倉(cāng)庫(kù)); 限制目標(biāo)部署環(huán)境(目標(biāo)集群和 namespace); 限制部署的資源類型(例如 RBAC、CRD、DaemonSets、NetworkPolicy 等); 定義項(xiàng)目角色,為 Application 提供 RBAC(與 OIDC group 或者 JWT 令牌綁定)。
Demo 演示
最后通過(guò)一個(gè)簡(jiǎn)單的示例來(lái)展示 Argo CD 的工作流程。
準(zhǔn)備 Git 倉(cāng)庫(kù)
在 GitHub 上創(chuàng)建一個(gè)項(xiàng)目,取名為 argocd-lab[13],為了方便實(shí)驗(yàn)將倉(cāng)庫(kù)設(shè)置為公共倉(cāng)庫(kù)。在倉(cāng)庫(kù)中新建 dev 目錄,在目錄中創(chuàng)建兩個(gè) YAML 配置清單,分別是 deployment.yaml 和 service.yaml。

配置清單內(nèi)容如下:
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
selector:
matchLabels:
app: myapp
replicas: 2
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: nginx:latest
ports:
- containerPort: 80
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- port: 80
protocol: TCP
targetPort: 80
接下來(lái)在倉(cāng)庫(kù)根目錄中創(chuàng)建一個(gè) Application 的配置清單:
# application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp-argo-application
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/yangchuansheng/argocd-lab.git
targetRevision: HEAD
path: dev
destination:
server: https://kubernetes.default.svc
namespace: myapp
syncPolicy:
syncOptions:
- CreateNamespace=true
automated:
selfHeal: true
prune: true
參數(shù)解釋:
syncPolicy : 指定自動(dòng)同步策略和頻率,不配置時(shí)需要手動(dòng)觸發(fā)同步。
syncOptions : 定義同步方式。
CreateNamespace=true : 如果不存在這個(gè) namespace,就會(huì)自動(dòng)創(chuàng)建它。 automated : 檢測(cè)到實(shí)際狀態(tài)與期望狀態(tài)不一致時(shí),采取的同步措施。
selfHeal : 當(dāng)集群世紀(jì)狀態(tài)不符合期望狀態(tài)時(shí),自動(dòng)同步。 prune : 自動(dòng)同步時(shí),刪除 Git 中不存在的資源。
Argo CD 默認(rèn)情況下每 3 分鐘會(huì)檢測(cè) Git 倉(cāng)庫(kù)一次,用于判斷應(yīng)用實(shí)際狀態(tài)是否和 Git 中聲明的期望狀態(tài)一致,如果不一致,狀態(tài)就轉(zhuǎn)換為 OutOfSync。默認(rèn)情況下并不會(huì)觸發(fā)更新,除非通過(guò) syncPolicy 配置了自動(dòng)同步。
如果嫌周期性同步太慢了,也可以通過(guò)設(shè)置 Webhook 來(lái)使 Git 倉(cāng)庫(kù)更新時(shí)立即觸發(fā)同步。具體的使用方式會(huì)放到后續(xù)的教程中,本文不再贅述。
創(chuàng)建 Application
現(xiàn)在萬(wàn)事具備,只需要通過(guò) application.yaml 創(chuàng)建 Application 即可。
$ kubectl apply -f application.yaml
application.argoproj.io/myapp-argo-application created
在 Argo CD 可視化界面中可以看到應(yīng)用已經(jīng)創(chuàng)建成功了。

點(diǎn)進(jìn)去可以看到應(yīng)用的同步詳情和各個(gè)資源的健康狀況。

如果你更新了 deployment.yaml 中的鏡像,Argo CD 會(huì)自動(dòng)檢測(cè)到 Git 倉(cāng)庫(kù)中的更新,并且將集群中 Deployment 的鏡像更新為 Git 倉(cāng)庫(kù)中最新設(shè)置的鏡像版本。
KubeSphere 從 3.3.0 開始[14]也提供了基于 GitOps 的 CD方案,引入 Argo CD 作為 CD 的后端,而且可視化界面更加炫酷,感興趣的小伙伴可以試試使用 KubeSphere 來(lái)創(chuàng)建管理 Application。


總結(jié)
本文介紹了 Argo CD 的優(yōu)勢(shì)、架構(gòu)和工作原理,并通過(guò)一個(gè)簡(jiǎn)單的示例對(duì)其功能進(jìn)行演示,比如修改 Git 倉(cāng)庫(kù)內(nèi)容后,可以自動(dòng)觸發(fā)更新。還可以通過(guò) Event Source 和 Trigger 實(shí)現(xiàn)更多自動(dòng)化部署的需求。
在部署 Kubernetes 資源時(shí),Argo CD 還支持 Kustomize、Helm、Ksonnet 等資源描述方式,包括其他更高級(jí)的使用方式都會(huì)在后續(xù)的教程中為大家一一道來(lái),敬請(qǐng)期待。
引用鏈接
GitOps 介紹: https://icloudnative.io/
[2]GitOps 介紹: https://icloudnative.io/
[3]青云: https://www.qingcloud.com/
[4]KubeSphere: https://kubesphere.com.cn
[5]install.yaml: https://github.com/argoproj/argo-cd/blob/master/manifests/install.yaml
[6]namespace-install.yaml: https://github.com/argoproj/argo-cd/blob/master/manifests/namespace-install.yaml
[7]ha/install.yaml: https://github.com/argoproj/argo-cd/blob/master/manifests/ha/install.yaml
[8]ha/namespace-install.yaml: https://github.com/argoproj/argo-cd/blob/master/manifests/ha/namespace-install.yaml
[9]core-install.yaml: https://github.com/argoproj/argo-cd/blob/master/manifests/core-install.yaml
[10]https://github.com/argoproj/argo-helm/tree/master/charts/argo-cd: https://github.com/argoproj/argo-helm/tree/master/charts/argo-cd
[11]KubeSphere Cloud 托管集群服務(wù): https://kubesphere.cloud/console/resource/
[12]https://kubesphere.cloud: https://kubesphere.cloud/
[13]argocd-lab: https://github.com/yangchuansheng/argocd-lab
[14]KubeSphere 從 3.3.0 開始: https://kubesphere.com.cn/news/kubesphere-3.3.0-ga-announcement/


你可能還喜歡
點(diǎn)擊下方圖片即可閱讀
2022-07-29
2022-07-28
2022-07-28
2022-07-19

云原生是一種信仰 ??
關(guān)注公眾號(hào)
后臺(tái)回復(fù)?k8s?獲取史上最方便快捷的 Kubernetes 高可用部署工具,只需一條命令,連 ssh 都不需要!


點(diǎn)擊 "閱讀原文" 獲取更好的閱讀體驗(yàn)!
發(fā)現(xiàn)朋友圈變“安靜”了嗎?

