去年,我透過 GitLab CI 實現了 Push-based 的 GitOps,能自動將 Git Repo 中的 YAML 部署到 Kubernetes。
雖然 Push 模式實現簡單且架構輕量,但仍有幾個問題需要改善:
安全性風險:Push 模式需要暴露 Cluster 的 API server,增加了公開網絡中的安全風險。
難以擴展:隨著 Cluster 數量增加,Push 模式在多 Cluster 管理,特別是跨網域時,變得困難。
一致性問題:如果有人為操作 Kubernetes,可能導致 Cluster 與 Git Repo 狀態不同步
一致性問題:如果有人為操作 Kubernetes,可能導致 Cluster 與 Git Repo 狀態不同步
ArgoCD 是一款基於 Pull-based GitOps 模型的 Kubernetes 持續交付工具。當 Git Repo 中的 YAML 文件更新時,ArgoCD 會自動將這些變更同步到 Kubernetes,並持續監控 Kubernetes 與 Git Repo 的狀態,確保雙方狀態一致。
ArgoCD 提供了豐富的開箱即用功能:
廢話不多說,我們直接來體驗一下 ArgoCD
根據官方安裝文件,使用 Kustomize 的 Remote Resource 安裝 ArgoCD
# argoCD-demo/infra/argoCD/kustomization.yml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: argocd
resources:
- https://raw.githubusercontent.com/argoproj/argo-cd/v2.7.2/manifests/install.yaml
接著將 ArgoCD 部署到 Kubernetes 中:
# pwd
# /day19/argoCD-demo <- current folder
# install
kubectl create namespace argocd
kubectl apply -k infra/argoCD
Mac 可以直接透過 Homebrew 安裝,其他平台的安裝方法可參考 官方文件
# Mac
brew install argocd
# check the install is successful
argocd version
ArgoCD 的 Web UI 運行於 Kubernetes 的 Pod 中,使用 kubectl port-forward
將 Web 服務轉發到本地的 8080 端口,方便 Demo 存取:
kubectl port-forward svc/argocd-server -n argocd 8080:443
ArgoCD 的 Web UI 運行於 Kubernetes 的 Pod 中,使用 kubectl port-forward
將 Web 服務轉發到本地的 8080 端口,方便 Demo 存取:
透過 argocd
CLI,取得初始化密碼
argocd admin initial-password -n argocd
# output
w4sgE3j7Mb97NEzB
This password must be only used for first time login. We strongly recommend you update the password using `argocd account update-password`.
⚠️ 此密碼僅用於首次登入。建議讀者參閱 官方文件 來修改密碼。
使用 admin
帳號與剛取得的密碼登入
我們可以使用前幾天的 Kustomize 配置來部署服務。在此之前,先清理環境並重新創建 ithome namespace,以便觀察 ArgoCD 的部署行為:
# 環境清理
kubectl delete namespace ithome
kubectl create namespace ithome
建立 Apps
點選 NEW APP 按鈕
填寫 Application 基本資料
argocd-demo
default
Automatic
並勾選 SELF HEAL
https://github.com/YihongGao/iThome_30Day_2024
main
resources/day19/argoCD-demo/apps/overlays/production
Cluster URL:https://kubernetes.default.svc
(代表部署到與 ArgoCD 同一 Kubernetes Cluster)
Namespace:ithome
全部填寫完成後,點選上方 CREATE 按鈕
到這裡,我們已經在 ArgoCD 上配置了
在 UI 介面上,能看到名為 argocd-demo
的 Application
能看到 argocd-demo
Application 的 Status 欄位,可以看到兩個主要狀態:
App Health 表示 ArgoCD 管理的 Kubernetes 資源運行情況,主要有以下幾個狀態:
- Healthy:所有資源運行正常,並通過健康檢查(如 Pod 通過 liveness 和 readiness 檢查)。
- Progressing:資源正在部署或更新中,部分資源尚未完全啟動或達到健康狀態。
- Degraded:部分資源運行異常,可能有 Pod 啟動失敗或 CrashLoopBackOff 等問題。
Sync Status:表示 Application 的狀態是否與 Git Repo 同步:
- Synced(已同步):Kubernetes 狀態與 Git Repo 完全一致,所有變更已成功應用到 Cluster。
- OutOfSync(不同步):Application 的狀態與 Git Repo 不一致,可能是變更尚未同步到 Cluster 或部分資源不符預期。
我們使用 kubectl 來檢查 Kubernetes 是否如 App Status 所示運作正常:
kubectl get pod
# output
NAME READY STATUS RESTARTS AGE
app-backend-7b8d5c4cd7-ntkhw 1/1 Running 0 2m35s
app-backend-7b8d5c4cd7-rnxfs 1/1 Running 0 2m24s
product-backend-5564f9975c-8c4k9 1/1 Running 0 2m9s
product-backend-5564f9975c-8m2lg 1/1 Running 0 2m30s
product-schedule-7ccf4f66ff-vfs27 1/1 Running 0 2m27s
可以看到,Git Repo 中的 YAML 已成功部署到 Kubernetes。接下來,我們嘗試刪除一個 Resource(例如 Deployment
)來測試自動恢復功能:
kubectl delete deployment app-backend
📘 若沒有自動建立回來,請檢查
argocd-demo
中的 SYNC POLICY 是否有 EnableAUTOMATED
與SELF HEAL
這時可以看到該 Deployment 會自動被重建。這正是 Pull-based GitOps 的優勢所在:
如果讀者的公司規範不適合使用全自動化作業,ArgoCD 也支援半自動化模式,並提供直觀的 Diff 介面來檢視 Kubernetes 與 Git Repo 之間的差異。
讀者能透過以下操作體驗半自動化的流程
SELF HEAL
# 從 1.0 改為 latest
kubectl set image deployment/app-backend apps=luciferstut/app-backend-for-ithome2024:latest
OutOfSync
今天我們初步體驗了 ArgoCD 的功能,特別是其自動保持 Git Repo 與 Kubernetes 狀態一致的能力。這大幅提升了在使用 GitOps 管理 Kubernetes 時的信心和可維護性,避免 Git Repo 與 Kubernetes 狀態脫鉤太久,導致操作風險上升。
明天,我們將深入介紹 ArgoCD 的架構與運作原理。