搭配使用 Config Sync 與 Kustomize 和 Helm

在本教學課程中,您會在存放區中新增參照 Helm 圖表的 Kustomize 設定,然後使用 Config Sync 將叢集與存放區同步。

使用 Config Sync 時,系統會自動算繪您放在 Git 存放區中的 Kustomize 設定和 Helm 圖表。自動算繪功能可帶來下列優點:

  • 您不再需要外部補水管道。如果沒有自動算繪功能,您就必須在工作站上使用 Kustomize 和 Helm 手動算繪設定,或設定步驟,在 CI 系統中觸發補水程序。透過自動轉譯功能,Config Sync 會處理執行作業。

  • 降低維護成本。如果沒有自動轉譯功能,您就必須維護一個含有原始 Kustomize 設定和 Helm 圖表的 Git 存放區,以及另一個含有外部補水作業所產生輸出的 Git 存放區。接著,您必須設定 Config Sync,從 Git 存放區同步處理已算繪的輸出內容。使用自動算繪功能時,您只需要維護一個含有原始設定的存放區。

  • 簡化開發工作流程。如果沒有自動算繪功能,您必須先在原始存放區中審查原始設定的變更,然後在算繪的存放區中再次審查,才能合併變更。透過自動化算繪,算繪的設定檔會由 Config Sync 產生,您只需要檢查原始設定檔的變更。

設定存放區

下列工作說明如何準備含有設定的 Git 存放區,將 Kustomize 設定與 Helm 圖表合併:

  1. 建立或確保有權存取 Git 存放區。由於存放區使用 Kustomize 和 Helm,因此應為非結構化存放區。

  2. 在 Git 存放區的根目錄中,建立名為 kustomization.yaml 的檔案,然後將下列程式碼貼入其中:

    # ./kustomization.yaml
    resources:
    - base
    
    patches:
    - path: ignore-deployment-mutation-patch.yaml
      target:
        kind: Deployment
    

    這個檔案是Kustomize 覆蓋, 指向 Kustomize 基礎。 這個疊加層包含 Helm 圖表基礎的修補程式,可將 client.lifecycle.config.k8s.io/mutation: ignore 註解新增至所有 Deployment 物件。建立物件後,註解會導致 Config Sync 忽略叢集中對該物件的任何衝突變更。

  3. 在 Git 存放區中,建立名為 base 的目錄:

    mkdir base
    
  4. base 目錄中,建立另一個名為 kustomization.yaml 的檔案,並將下列程式碼貼入其中:

    # ./base/kustomization.yaml
    helmCharts:
    - name: cert-manager
      repo: https://charts.jetstack.io
      version: v1.5.3
      releaseName: my-cert-manager
      namespace: cert-manager
    

    這個檔案是 Kustomize 基礎,可轉譯遠端 Helm 圖表。

  5. 返回 Git 存放區的根目錄,建立名為 ignore-deployment-mutation-patch.yaml 的檔案,然後將下列程式碼貼入其中:

    # ./ignore-deployment-mutation-patch.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: any
     annotations:
       client.lifecycle.config.k8s.io/mutation: ignore
    

    這個檔案是套用至基本 Helm chart 的修補程式。它會將 client.lifecycle.config.k8s.io/mutation: ignore 註解新增至基本目錄中的所有部署作業。

  6. 將變更提交至存放區:

    git add .
    git commit -m 'Set up manifests.'
    git push
    

範例存放區提供這類存放區的範例。

預覽及驗證已算繪的設定

在 Config Sync 算繪設定並同步至叢集之前,請先執行 nomos hydrate 預覽算繪的設定,並執行 nomos vet 驗證格式是否正確,確保設定正確無誤。

  1. 使用下列旗標執行下列 nomos hydrate

    nomos hydrate \
        --source-format=unstructured \
        --output=OUTPUT_DIRECTORY
    

    在這個指令中:

    • --source-format=unstructured」可讓「nomos hydrate」處理非結構化存放區。由於您使用 Kustomize 設定和 Helm 圖表,因此必須使用非結構化存放區並新增這個旗標。
    • --output=OUTPUT_DIRECTORY 可讓您定義已算繪設定的路徑。將 OUTPUT_DIRECTORY 替換為要儲存輸出的位置。
  2. 執行 nomos vet 並使用下列旗標,檢查設定的語法和有效性:

    nomos vet \
        --source-format=unstructured \
        --keep-output=true \
        --output=OUTPUT_DIRECTORY
    

    在這個指令中:

    • --source-format=unstructured」可讓「nomos vet」處理非結構化存放區。
    • --keep-output=true 儲存已算繪的設定。
    • --output=OUTPUT_DIRECTORY 是已算繪設定的路徑。

設定從 Git 存放區同步處理

您已建立存放區,並加入要使用的設定,現在可以設定從叢集到存放區的同步作業。

  1. 如要設定 RootSync 物件,請建立 root-sync.yaml 檔案:

    # root-sync.yaml
    apiVersion: configsync.gke.io/v1beta1
    kind: RootSync
    metadata:
      name: root-sync
      namespace: config-management-system
    spec:
      sourceFormat: unstructured
      git:
        repo: YOUR_GIT_REPOSITORY
        branch: main
        auth: none
      override:
        enableShellInRendering: true
    

    YOUR_GIT_REPOSITORY 替換為 Git 存放區的網址。

  2. root-sync.yaml 檔案套用至叢集:

    kubectl apply -f root-sync.yaml
    

驗證安裝

安裝及設定 Config Sync 後,您可以確認安裝是否成功。

  1. 使用 nomos status 確認沒有其他錯誤:

    nomos status
    

    輸出內容範例:

    *CLUSTER_NAME
    --------------------
    <root>   https:/github.com/GoogleCloudPlatform/anthos-config-management-samples.git/helm-component/manifests@init
    SYNCED   fd17dd5a
    
  2. 確認 Helm 元件是否已成功安裝:

    kubectl get all -n cert-manager
    

    輸出內容範例:

    NAME                                              READY   STATUS    RESTARTS   AGE
    pod/my-cert-manager-54f5ccf74-wfzs4               1/1     Running   0          10m
    pod/my-cert-manager-cainjector-574bc8678c-rh7mq   1/1     Running   0          10m
    pod/my-cert-manager-webhook-7454f4c77d-rkct8      1/1     Running   0          10m
    
    NAME                              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
    service/my-cert-manager           ClusterIP   10.76.9.35     <none>        9402/TCP   10m
    service/my-cert-manager-webhook   ClusterIP   10.76.11.205   <none>        443/TCP    10m
    
    NAME                                         READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/my-cert-manager              1/1     1            1           10m
    deployment.apps/my-cert-manager-cainjector   1/1     1            1           10m
    deployment.apps/my-cert-manager-webhook      1/1     1            1           10m
    
    NAME                                                    DESIRED   CURRENT   READY   AGE
    replicaset.apps/my-cert-manager-54f5ccf74               1         1         1       10m
    replicaset.apps/my-cert-manager-cainjector-574bc8678c   1         1         1       10m
    replicaset.apps/my-cert-manager-webhook-7454f4c77d      1         1         1       10m