使用 Argo CD 探索 GitOps,你學(xué)會(huì)了嗎?
Argo CD 是一個(gè)用于 Kubernetes 的聲明式 GitOps 持續(xù)交付工具。
管理 Kubernetes 集群的復(fù)雜性可能是一項(xiàng)艱巨的任務(wù),尤其是在跨多個(gè)環(huán)境部署和同步應(yīng)用程序時(shí)。為了研究如何更好地應(yīng)對(duì)此類(lèi)挑戰(zhàn),我決定研究流行的 GitOps 持續(xù)交付工具 Argo CD。Argo CD 是一款開(kāi)源 GitOps 持續(xù)交付工具,可為 Kubernetes 集群管理帶來(lái)便利性和自動(dòng)化。借助此工具,工程師可以利用 GitOps 的強(qiáng)大功能,以聲明方式定義 Git 存儲(chǔ)庫(kù)中 Kubernetes 集群的所需狀態(tài),從而實(shí)現(xiàn)高效、自動(dòng)化的應(yīng)用程序部署。
讓我們通過(guò)回顧 Argo CD 在自己的項(xiàng)目文檔中的解釋來(lái)開(kāi)始這篇文章。
https://argoproj.github.io/
Argo CD 被實(shí)現(xiàn)為 Kubernetes 控制器,它持續(xù)監(jiān)控正在運(yùn)行的應(yīng)用程序并將當(dāng)前的實(shí)時(shí)狀態(tài)與所需的目標(biāo)狀態(tài)進(jìn)行比較。Argo CD 報(bào)告并可視化差異,同時(shí)提供自動(dòng)或手動(dòng)將實(shí)時(shí)狀態(tài)同步回所需目標(biāo)狀態(tài)的方法。對(duì) Git 存儲(chǔ)庫(kù)中所需目標(biāo)狀態(tài)所做的任何修改都可以自動(dòng)應(yīng)用并反映在指定的目標(biāo)環(huán)境中。
換句話(huà)說(shuō),Argo CD 是 Kubernetes 的聲明式 GitOps 持續(xù)交付工具。讓我們更深入地了解這實(shí)際上意味著什么。
GitOps 是一種軟件開(kāi)發(fā)和交付流程,強(qiáng)調(diào)使用 Git 存儲(chǔ)庫(kù)作為定義系統(tǒng)所需狀態(tài)(例如云基礎(chǔ)設(shè)施或軟件應(yīng)用程序)的事實(shí)來(lái)源。在這個(gè)持續(xù)交付過(guò)程中,整個(gè)交付流程(從代碼提交到部署)都是使用 Git 實(shí)現(xiàn)自動(dòng)化和版本控制的。系統(tǒng)的所需狀態(tài)(包括基礎(chǔ)設(shè)施、配置和/或應(yīng)用程序源)被定義為代碼并捕獲為存儲(chǔ)庫(kù)中的提交。一旦提交,聲明的系統(tǒng)狀態(tài)可以使用 GitOps 部署工具與系統(tǒng)實(shí)時(shí)持續(xù)同步。其結(jié)果是一個(gè)可靠的持續(xù)交付流程,使 DevOps 團(tuán)隊(duì)能夠以自動(dòng)化和可審核的方式快速、自信地部署代碼更改。
Argo CD 是一個(gè)基于 GitOps 的持續(xù)交付工具,在同步系統(tǒng)狀態(tài)時(shí)采用“pull”模式。“pull”模式是目標(biāo)環(huán)境從源代碼控制存儲(chǔ)庫(kù)“pull”最新提交并根據(jù)聲明的系統(tǒng)狀態(tài)自動(dòng)更新自身。這與“push”模式相反,“push”模式將更改從開(kāi)發(fā)環(huán)境推送到目標(biāo)環(huán)境。
持續(xù)交付的“pull”模型如下所示:
圖片
這里的意義在于,“push”模式要求交付機(jī)制提供對(duì)目標(biāo)環(huán)境的入站網(wǎng)絡(luò)訪問(wèn),而“pull”模式僅需要出站網(wǎng)絡(luò)訪問(wèn)。出站連接被認(rèn)為風(fēng)險(xiǎn)較小,因?yàn)閮?nèi)部網(wǎng)絡(luò)通常通過(guò)對(duì)發(fā)起網(wǎng)絡(luò)通信的受信任實(shí)體授予最小權(quán)限的訪問(wèn)控制來(lái)保護(hù)自身。入站連接會(huì)帶來(lái)更大的安全風(fēng)險(xiǎn),因?yàn)樗鼈冊(cè)醋酝獠?、不受信任的網(wǎng)絡(luò),并且可能包含惡意流量。
在更高層面上,Argo CD 部署過(guò)程按以下方式工作:
- 開(kāi)發(fā)人員向受監(jiān)控的 Git 存儲(chǔ)庫(kù)進(jìn)行提交。
- Argo CD 識(shí)別提交,克隆存儲(chǔ)庫(kù),將當(dāng)前系統(tǒng)狀態(tài)與提交中聲明的系統(tǒng)狀態(tài)進(jìn)行比較,然后將所需的更改應(yīng)用于集群的配置。
- Kubernetes 會(huì)將應(yīng)用清單中包含的配置與當(dāng)前資源進(jìn)行協(xié)調(diào),并進(jìn)行所需的更改以實(shí)現(xiàn)所需的集群狀態(tài)。
- Argo CD 將持續(xù)監(jiān)控當(dāng)前狀態(tài)與受監(jiān)控存儲(chǔ)庫(kù)中聲明的狀態(tài)的同步狀態(tài)。
請(qǐng)注意,此工作流程總結(jié)遺漏了通常執(zhí)行持續(xù)集成的重要步驟。持續(xù)集成流程用于自動(dòng)構(gòu)建和測(cè)試應(yīng)用程序代碼,以確保在生產(chǎn)部署之前滿(mǎn)足要求和標(biāo)準(zhǔn)。除了這個(gè)簡(jiǎn)單的定義之外,我將在另一個(gè)時(shí)間點(diǎn)對(duì)此主題進(jìn)行更深入的討論。
讓我們繼續(xù)快速瀏覽一下構(gòu)成 Argo CD 架構(gòu)的三個(gè)主要組件。
API 和Web服務(wù)器
API 服務(wù)器是一個(gè) gRPC/REST 服務(wù)器,它公開(kāi) Web UI、CLI 和 CI/CD 系統(tǒng)使用的 API。
存儲(chǔ)庫(kù)服務(wù)器
存儲(chǔ)庫(kù)服務(wù)器是一項(xiàng)內(nèi)部服務(wù),用于維護(hù)保存應(yīng)用程序清單的 Git 存儲(chǔ)庫(kù)的本地緩存。它負(fù)責(zé)生成和返回 Kubernetes 清單。
應(yīng)用控制器
應(yīng)用控制器是一個(gè) Kubernetes 控制器,它持續(xù)監(jiān)視正在運(yùn)行的應(yīng)用程序,并將當(dāng)前的實(shí)時(shí)狀態(tài)與所需的目標(biāo)狀態(tài)(如存儲(chǔ)庫(kù)中指定的)進(jìn)行比較。它檢測(cè)偏離聲明配置的應(yīng)用程序狀態(tài),并可以選擇采取糾正措施。它負(fù)責(zé)為生命周期事件(PreSync、Sync、PostSync)調(diào)用任何用戶(hù)定義的鉤子。
圖片
Argo CD 支持以下聲明格式:
- Helm Charts
- Jsonnet Documents
- Kubernetes Manifests
- Kustomize Templates
我們將在本文中使用標(biāo)準(zhǔn) Kubernetes Manifests。你將看到 Argo CD 文檔將這些源作為“字典”。
現(xiàn)在我們已經(jīng)了解了 Argo CD 是什么、它提供的價(jià)值以及它的構(gòu)建方式,讓我們開(kāi)始安裝它,以便更好地了解它如何用于管理 Kubernetes 工作負(fù)載。
本演練的先決條件如下:
- 對(duì) Kubernetes 的集群提升訪問(wèn)權(quán)限
- Git 存儲(chǔ)庫(kù)
- kubectl 命令行工具
我們將從安裝“argocd”命令行工具開(kāi)始。執(zhí)行以下 CLI 命令來(lái)完成此操作
curl -L 'https://github.com/argoproj/argo-cd/releases/download/v2.5.8/argocd-linux-amd64' > /usr/local/sbin/argocd
chmod 0755 /usr/local/sbin/argocd
我們現(xiàn)在需要?jiǎng)?chuàng)建一個(gè)命名空間供 Argo CD 在其中運(yùn)行。執(zhí)行以下 CLI 命令來(lái)完成此操作。
kubectl create namespace argocd
接下來(lái),我們將下載安裝manifests并將其應(yīng)用到我們的 Kubernetes 集群。
curl -L 'https://raw.githubusercontent.com/argoproj/argo-cd/v2.6.0/manifests/ha/install.yaml' > argocd-ha-install.yaml
kubectl apply -n argocd -f argocd-ha-install.yaml
請(qǐng)注意,這是高可用安裝類(lèi)型。如果你的系統(tǒng)資源不足,你可以使用非 HA 版本。只需使用以下一組 CLI 命令即可。
curl -L 'https://raw.githubusercontent.com/argoproj/argo-cd/v2.6.0/manifests/install.yaml' > argocd-install.yaml
kubectl apply -n argocd -f argocd-install.yaml
安裝過(guò)程完成后,你需要獲取管理員密碼。執(zhí)行以下 CLI 命令來(lái)完成此操作。
kubectl get secrets argocd-initial-admin-secret -n argocd -o json | jq -rM '.data.password' | base64 -d
這是一個(gè)高度敏感的信息。將此信息存儲(chǔ)在安全的地方。尤其是在生產(chǎn)系統(tǒng)中工作時(shí)。
有了這些信息,我們現(xiàn)在可以使用 Web 瀏覽器連接到 UI。但首先,讓我們將內(nèi)部 Argo CD 服務(wù)端口轉(zhuǎn)發(fā)到外部地址。執(zhí)行以下 CLI 命令來(lái)完成此操作。
kubectl port-forward svc/argocd-server -n argocd 8443:443 --address='0.0.0.0'
這里需要注意的一個(gè)重要警告是,我在我的家庭實(shí)驗(yàn)室網(wǎng)絡(luò)中運(yùn)行的裸機(jī) Kubernetes 集群中工作,并且不擔(dān)心有威脅的訪問(wèn)者訪問(wèn)這個(gè)開(kāi)放端口。如果你的集群暴露在互聯(lián)網(wǎng)上,我強(qiáng)烈建議你采取必要的預(yù)防措施。此配置超出了本文章的范圍,因此,你將承擔(dān)保護(hù)集群訪問(wèn)的責(zé)任。
我運(yùn)行此命令的服務(wù)器的 IP 地址恰好是 192.168.0.161。這讓我訪問(wèn)以下 URL 來(lái)訪問(wèn) Argo CD Web 界面:
https://192.168.0.161:8443
使用“admin”作為用戶(hù)名和我們之前檢索到的密碼登錄后,你應(yīng)該看到類(lèi)似以下內(nèi)容:
圖片
現(xiàn)在讓我們使用 Argo CD 命令行工具登錄。執(zhí)行以下命令來(lái)完成此操作:
argocd login 192.168.0.161:8443
同樣,192.168.0.161 是我的網(wǎng)絡(luò)中的 IP 地址。這會(huì)和你的不一樣。
你可以使用以下 CLI 命令更改管理員密碼。如果在生產(chǎn)環(huán)境中工作,這樣做可能是個(gè)好主意。
argocd account update-password
在這里,我們?cè)谂cArgo CD 和 Kubernetes 集群交互時(shí)將主要使用 CLI。讓我們繼續(xù)創(chuàng)建我們的第一個(gè) Argo CD 應(yīng)用程序。我們將通過(guò)執(zhí)行以下 CLI 命令來(lái)完成此操作。
argocd app create foo-app --repo https://github.com/trek10inc/exploring-gitops-with-argo --path part1/app1 --dest-server https://kubernetes.default.svc --dest-namespace default
請(qǐng)注意,此命令使用公共存儲(chǔ)庫(kù)創(chuàng)建應(yīng)用程序。使用私有存儲(chǔ)庫(kù)創(chuàng)建應(yīng)用程序超出了本文章的范圍。你可以通過(guò)以下鏈接閱讀有關(guān)如何完成此操作的更多信息:
https://argo-cd.readthedocs.io/en/stable/user-guide/private-repositories/
此外,還要注意 CLI 命令中提供的“路徑”屬性。這就是告訴 Argo CD 在哪里尋找 Kubernetes 清單的信息。此屬性允許你在單個(gè)存儲(chǔ)庫(kù)中存儲(chǔ)多個(gè)應(yīng)用程序。
命令執(zhí)行完成后,我們將使用以下 CLI 命令列出新創(chuàng)建的 Argo CD 應(yīng)用程序:
argocd app get foo-app
你應(yīng)該看到類(lèi)似以下內(nèi)容:
Name: argocd/foo-app
Project: default
Server: https://kubernetes.default.svc
Namespace: default
URL: https://192.168.0.161:8443/applications/foo-app
Repo: https://github.com/trek10inc/exploring-gitops-with-argo
Target:
Path: part1/app1
SyncWindow: Sync Allowed
Sync Policy: <none>
Sync Status: OutOfSync from (37b85c8)
Health Status: Missing
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service default foo-svc OutOfSync Missing
apps Deployment default foo-app OutOfSync Missing
記下“Service”和“Deployment”資源的“OutOfSync”狀態(tài)。應(yīng)用程序狀態(tài)最初處于“OutOfSync”狀態(tài),因?yàn)閼?yīng)用程序尚未部署,這意味著尚未創(chuàng)建 Kubernetes 資源。
要同步(部署)應(yīng)用程序,請(qǐng)執(zhí)行以下 CLI 命令:
argocd app sync foo-app
使用此命令,Argo CD 將從受監(jiān)控的存儲(chǔ)庫(kù)檢索最新提交,并使用其包含的清單執(zhí)行“kubectl apply”。
“foo-app”應(yīng)用程序現(xiàn)在應(yīng)該正在運(yùn)行中。你可以查看其資源組件、日志、歷史記錄和評(píng)估的健康狀態(tài)。
argocd app get foo-app
Name: argocd/foo-app
Project: default
Server: https://kubernetes.default.svc
Namespace: default
URL: https://192.168.0.161:8443/applications/foo-app
Repo: https://github.com/trek10inc/exploring-gitops-with-argo
Target:
Path: part1/app1
SyncWindow: Sync Allowed
Sync Policy: <none>
Sync Status: Synced to (37b85c8)
Health Status: Healthy
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service default foo-svc Synced Healthy service/foo-svc created
apps Deployment default foo-app Synced Healthy deployment.apps/foo-app created
—------
argocd app logs foo-app
waiting 0
Starting application server
Web server is running on port 80
waiting 0
Starting application server
Web server is running on port 80
waiting 0
Starting application server
Web server is running on port 80
—--
argocd app history foo-app
ID DATE REVISION
0 2023-02-08 15:15:33 -0700 MST (37b85c8)
請(qǐng)注意,Argo CD 不會(huì)自動(dòng)部署我們應(yīng)用程序的最新提交版本。我們必須手動(dòng)將本地系統(tǒng)狀態(tài)與存儲(chǔ)在存儲(chǔ)庫(kù)中的遠(yuǎn)程聲明同步。由于利用 Argo CD 的全部目的是自動(dòng)化部署過(guò)程,因此我們希望啟用 Argo CD 所謂的“自動(dòng)同步策略”。
當(dāng) Argo CD 檢測(cè)到 Git 中所需的清單與集群中的實(shí)時(shí)狀態(tài)之間的差異時(shí),它能夠自動(dòng)同步應(yīng)用程序。
使用以下 CLI 命令啟用我們的應(yīng)用程序的自動(dòng)同步:
argocd app set foo-app --sync-policy automated
你可以通過(guò)以下 URL 了解有關(guān)同步策略可以利用的附加功能的更多信息。
https://argocd.readthedocs.io/en/stable/user-guide/auto\_sync/
https://argocd.readthedocs.io/en/stable/user-guide/sync-options/
現(xiàn)在讓我們?cè)L問(wèn)我們通過(guò)部署“foo-app”應(yīng)用程序創(chuàng)建的 NodePort 服務(wù)上運(yùn)行的 Web 服務(wù)器。我們首先需要找到集群節(jié)點(diǎn)的 IP 地址以及“foo-svc”服務(wù)正在偵聽(tīng)的端口。
你可以通過(guò)以下 CLI 命令獲取集群節(jié)點(diǎn)的 IP 地址:
kubectl get nodes -o json | jq -rM '.items[].status.addresses[] | select(.type == "InternalIP") | .address' | tee /tmp/nodes.txt
你可以通過(guò)以下 CLI 命令獲取“foo-svc”服務(wù)正在偵聽(tīng)的端口:
kubectl get svc foo-svc -o json | jq -rM '.spec.ports[].nodePort' | tee /tmp/port.txt
有了這些信息,我們將向每個(gè)集群節(jié)點(diǎn)上的服務(wù)的頂端路由發(fā)出請(qǐng)求,以驗(yàn)證我們的應(yīng)用程序是否正常運(yùn)行。執(zhí)行以下 CLI 命令來(lái)完成此操作。
PORT=$(cat /tmp/port.txt)
cat /tmp/nodes.txt | while read IP; do curl http://${IP}:${PORT}; done
你應(yīng)該看到以下輸出:
{ "version": "1.0.0" }
{ "version": "1.0.0" }
{ "version": "1.0.0" }
{ "version": "1.0.0" }
現(xiàn)在,我們將更改存儲(chǔ)庫(kù)中的清單之一,通過(guò)對(duì)“part1/app1/deployment.yaml”進(jìn)行輕微編輯來(lái)強(qiáng)制更改系統(tǒng)狀態(tài)。這是通過(guò)編輯“CONTENT”環(huán)境變量使其讀取“1.0.1”然后提交更改來(lái)完成的。
name: foo-app
env:
- name: CONTENT
value: '{ "version": "1.0.1" }'
短暫等待后,我們將看到我們的應(yīng)用程序已自動(dòng)更新。請(qǐng)注意,默認(rèn)同步間隔設(shè)置為 3 分鐘。
使用以下 CLI 命令查看“foo-app”應(yīng)用程序的運(yùn)行狀況和同步狀態(tài)。
argocd app get foo-app | grep Status
你應(yīng)該看到類(lèi)似以下內(nèi)容:
Sync Status: Synced to (5c8fe96)
Health Status: Healthy
使用以下 CLI 命令查看“foo-app”應(yīng)用程序的歷史記錄。
argocd app history foo-app
這應(yīng)該會(huì)產(chǎn)生如下所示的結(jié)果。提交 ID 將不同。
ID DATE REVISION
0 2023-02-08 15:15:33 -0700 MST (37b85c8)
1 2023-02-08 15:19:25 -0700 MST (5c8fe96)
我們還可以在 Web UI 中查看“foo-app”應(yīng)用程序的漂亮的圖形展示。請(qǐng)注意健康同步狀態(tài)、修訂號(hào)和副本集。
圖片
知道應(yīng)用程序已成功同步后,讓我們?cè)俅蜗蛎總€(gè)集群節(jié)點(diǎn)上的“foo-svc”服務(wù)發(fā)出請(qǐng)求。我們將重用之前的命令。
PORT=$(cat /tmp/port.txt)
cat /tmp/nodes.txt | while read IP; do curl http://${IP}:${PORT}; done
這次我們應(yīng)該看到以下內(nèi)容。
{ "version": "1.0.1" }
{ "version": "1.0.1" }
{ "version": "1.0.1" }
{ "version": "1.0.1" }
至此,我們使用稱(chēng)之為 Argo CD 的持續(xù)交付工具成功且安全地自動(dòng)化了應(yīng)用程序的部署!恭喜!
你可以通過(guò)執(zhí)行以下 CLI 命令來(lái)刪除 Argo CD 應(yīng)用程序及其生成的所有資源。
argocd app delete foo-app
Argo CD 是一個(gè)強(qiáng)大的持續(xù)交付解決方案,其功能遠(yuǎn)遠(yuǎn)超出了本文章中強(qiáng)調(diào)的功能。如果你覺(jué)得這篇文章很有趣并且打算在生產(chǎn)環(huán)境中使用 Argo CD,我強(qiáng)烈建議你訪問(wèn)以下鏈接以了解有關(guān)該工具豐富功能集的更多信息。
https://argocd.readthedocs.io/en/stable/
當(dāng)你這樣做時(shí),查看他們的安全文檔會(huì)對(duì)你更有幫助!
https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/security.md
如有相關(guān)問(wèn)題,請(qǐng)?jiān)谖恼潞竺娼o小編留言,小編安排作者第一時(shí)間和您聯(lián)系,為您答疑解惑。
原文鏈接:
https://www.trek10.com/blog/exploring-gitops-with-argo-cd