13.1 GitOps 持續部署:ArgoCD 實戰#
GitOps 一句話:Git 是唯一的真理來源#
傳統 kubectl apply 是「人說了算」:誰敲了什麼命令,集群就變成什麼樣,事後無從審計。GitOps 反過來:Git 倉庫裡的 YAML 就是期望狀態,ArgoCD 負責讓集群持續對齊它。人只改 Git,不直連集群。
flowchart LR
DEV[開發者改 Git] --> REPO[Git 倉庫 YAML]
REPO --> ARGO[ArgoCD<br/>對比+同步]
ARGO --> K8S[K8s 集群實際狀態]
K8S -.漂移檢測.-> ARGO
ARGO -->|自動糾偏/告警| K8SArgoCD 實戰:從安裝到 Application#
# 1. 安裝 ArgoCD(生產請用 HA 版 + 獨立 namespace)
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 2. 取初始密碼並登入
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
kubectl port-forward svc/argocd-server -n argocd 8080:443
# 3. Application:聲明「哪個 Git 路徑 -> 哪個集群 namespace」
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: shop-prod
namespace: argocd
spec:
project: default
source:
repoURL: https://git/shop/manifests.git
targetRevision: main
path: overlays/prod # Kustomize 目錄
destination:
server: https://kubernetes.default.svc
namespace: prod
syncPolicy:
automated: # 自動同步
prune: true # Git 刪了就刪集群資源
selfHeal: true # 手工 kubectl 改了會被糾回
syncOptions:
- CreateNamespace=true
金絲雀與漸進交付:Argo Rollouts#
ArgoCD 管「對齊」,Argo Rollouts 管「漸進」:金絲雀、藍綠、自動回滾。
# Rollout:v2 先放 10% 流量,分析通過再全量
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: product-page
spec:
replicas: 10
strategy:
canary:
steps:
- setWeight: 10
- pause: {duration: 5m}
- analysis: # 自動看 Prometheus 指標
templates:
- templateName: success-rate
args:
- name: service
value: product-page
- setWeight: 50
- pause: {duration: 5m}
- setWeight: 100
| 能力 | ArgoCD | Argo Rollouts | Flagger |
|---|---|---|---|
| 期望狀態同步 | 支援 | 不負責 | 不負責 |
| 金絲雀/藍綠 | 基礎 | 強(含分析) | 強(綁定網格) |
| 自動回滾 | 同步回滾 | 指標失敗自動回滾 | 支援 |
| 適用 | 所有 GitOps 場景 | K8s 漸進交付首選 | Istio/Linkerd 用戶 |
多環境與目錄結構#
manifests/
├── base/ # 共用底座
│ ├── deployment.yaml
│ └── kustomization.yaml
└── overlays/
├── staging/ # 測試:鏡像 tag=main,副本 1
└── prod/ # 正式:tag=版本號,副本 10 + HPA
配合分支策略:main 分支對 staging 自動同步,release/* 打 tag 才同步 prod——發布 = 合併 PR,天然有審計與回滾(revert 即回滾)。
本章小結#
- GitOps:Git 即期望狀態,ArgoCD 負責對比、同步、漂移糾偏
- Application 三要素:repo+path、destination、syncPolicy(prune/selfHeal)
- 漸進交付用 Argo Rollouts:金絲雀步進 + 指標分析 + 自動回滾
- 多環境用 Kustomize overlays;發布即合併,回滾即 revert
想一想#
- selfHeal=true 解決了什麼問題?沒有它時「有人手動 kubectl 改了集群」會怎樣?
- 金絲雀分析(success-rate)為什麼要接 Prometheus?人工盯著看有什麼風險?
- 為什麼說「回滾即 revert」比傳統「重新部署舊版」更可靠?