Chuyển đến nội dung chính

第9課:Helm、GitOps 與 CI/CD

Helm 套件管理器、GitOps 與 Argo CD、Kubernetes CI/CD 管線。 部署策略:Rolling Update、Canary、Blue-Green。

GitOps 工作流程與 Helm 和 Argo CD

1. Helm — Kubernetes 套件管理器

Helm 是 Kubernetes 的套件管理器。Chart 是可重複使用和參數化的 YAML 模板。

Helm Concepts:
  Chart     = Package (templates + default values)
  Release   = Installed instance of a chart in a cluster
  Repository = Collection of charts (ArtifactHub.io)
  Values    = Parameters to customize a chart

$ helm install my-nginx bitnami/nginx --set service.type=LoadBalancer
  └── Release: my-nginx
      ├── templates/deployment.yaml
      ├── templates/service.yaml
      └── values.yaml (overridden)
Helm 命令功能
helm install部署新 Chart(建立 Release)
helm upgrade使用新 Chart/Values 更新 Release
helm rollback回復到之前的版本
helm list列出所有 Release
helm uninstall刪除 Release
helm template渲染模板而不部署

考試重點: Helm 將 Release 歷史記錄儲存在 Kubernetes Secrets 中(不是 ConfigMap)。這使 helm rollback 能夠運作。歷史記錄預設保留 10 個版本。

2. GitOps

GitOps 是以 Git 作為程式碼和基礎設施組態的唯一事實來源的運營框架。

GitOps Flow:
  Developer ──push──► Git Repo (desired state)
                          │
                    GitOps Operator (Argo CD / Flux)
                    - Watches Git repo
                    - Compares with cluster state
                    - Syncs if diff found
                          │
                       K8s Cluster (actual state)
GitOps 原則含義
宣告式系統狀態以 YAML 描述在 Git 中
版本化且不可變Git 歷史記錄 = 稽核軌跡
自動拉取Agent 拉取變更,不需要推送存取叢集
持續協調漂移偵測——叢集與 Git 不同時自動修正

Argo CD

Argo CD 是最受歡迎的 Kubernetes GitOps 控制器(CNCF Incubating → Graduated 2022)。

考試重點: GitOps 使用 Pull-based 部署而非 Push。好處:叢集不需要對外暴露 API,CI 管線不需要 kubeconfig 憑證。

3. Kubernetes CI/CD

CI/CD Pipeline:
  Code Push
      │
  ┌───▼───┐  CI Phase (Build)
  │ Build  │── Unit tests ── Integration tests
  │ Image  │── Security scan (Trivy, Snyk)
  └───┬───┘── Push to Registry (ECR, GCR)
      │
  ┌───▼───┐  CD Phase (Deploy)
  │ Update │── Update Helm values / K8s manifest
  │ Manifest│── Push to GitOps repo
  └───┬───┘── Argo CD picks up and syncs
      │
  ┌───▼────────────────────┐
  │ Kubernetes Cluster     │
  │  Rolling Update        │
  └────────────────────────┘

4. 部署策略

策略運作方式停機時間回滾使用場景
Rolling Update逐步替換 Pod(預設)無kubectl rollout undo無狀態應用、漸進式
Recreate終止所有 v1,然後部署 v2有重新部署 v1有破壞性變更、簡單
Blue-Green同時執行 v1(藍)+ v2(綠),切換流量無即時切回關鍵應用、快速回滾
Canary將小比例流量路由到新版本無重新導向流量分階段發布、A/B 測試
Canary in Kubernetes (Ingress weight):
  ┌─────────────────────────────────┐
  │  Ingress (canary annotation)     │
  │  90% ──────► Deployment v1.0    │
  │  10% ──────► Deployment v1.1    │
  └─────────────────────────────────┘
  → Monitor v1.1 errors → promote to 100% or rollback

5. 速查表

考試問題答案
Helm 將 Release 歷史儲存在哪裡?Kubernetes Secrets
GitOps 的唯一事實來源?Git Repository
GitOps 使用 Pull 還是 Push?Pull-based(Agent 拉取)
無停機時間的部署?Rolling 或 Blue-Green
以 5% 流量測試新版本?Canary 部署
出問題時快速回滾?Blue-Green(即時切換)

6. 練習題

Q1: 團隊希望先將新版應用部署給 10% 的使用者,監控錯誤,然後逐步增加流量。應使用哪種部署策略?

  • A) Recreate
  • B) Rolling Update
  • C) Blue-Green
  • D) Canary ✓

解析:Canary 部署將一小部分流量路由到新版本,讓團隊用真實流量驗證後再全面推出。如果新版本有錯誤,影響範圍最小化。

Q2: 以下哪項最能描述 GitOps 模型?

  • A) CI/CD 管線在測試通過後直接推送到 Kubernetes
  • B) Git Repository 是唯一事實來源;控制器持續協調叢集狀態與 Git ✓
  • C) 開發者從工作站手動執行 kubectl 命令
  • D) 基礎設施定義在關聯式資料庫中以保持一致性

解析:GitOps 使用 Pull-based 模型,控制器(Argo CD、Flux)監視 Git Repository 並確保叢集與 Git 中的宣告一致。這提供稽核軌跡、漂移偵測和安全部署。

Q3: Helm 將 Release 歷史儲存在哪裡以啟用回滾功能?

  • A) Helm 的本地檔案系統(~/.helm)
  • B) 目標 namespace 中的 ConfigMap
  • C) 目標 namespace 中的 Secret ✓
  • D) 獨立的 etcd 資料庫

解析:自 Helm v3 起,Release 中繼資料(歷史、值、Chart 資訊)以 Secret 形式儲存在 Release 的 namespace 中。這使 helm rollback 能讀取先前版本的資料,並允許多個使用者/系統管理同一 Release。