搭配使用 Config Sync 與 Kustomize 和 Helm

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

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

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

  • 降低維護成本。如果沒有自動轉譯功能,您就必須維護一個 Git 存放區,其中包含原始的 Kustomize 設定和 Helm 資訊套件,以及另一個 Git 存放區,其中包含外部 Hydration 作業產生的輸出內容。然後,您必須設定 Config Sync,從含有已算繪輸出的 Git 存放區同步處理。使用自動算繪功能時,您只需要維護一個含有原始設定的存放區。

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

目標

  • 使用 Kustomize 設定設定存放區,並參照 cert-manager 的現成 Helm 圖表。cert-manager 是 Kubernetes 的工具,可協助您管理憑證。
  • 預覽及驗證您建立的設定。
  • 使用 Config Sync 自動轉譯圖表,並將叢集同步至存放區。
  • 確認安裝是否成功。

費用

在本文件中,您會使用下列 Google Cloud的計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator

初次使用 Google Cloud 的使用者可能符合免費試用期資格。

完成本文所述工作後,您可以刪除建立的資源,避免繼續計費,詳情請參閱「清除所用資源」。

事前準備

  1. 在 Google Cloud 控制台的專案選擇器頁面中,選取或建立 Google Cloud 專案。

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您已獲授角色,即可選取任何專案。
    • 建立專案:如要建立專案,您需要具備專案建立者角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色

    前往專案選取器

  2. 確認專案已啟用計費功能 Google Cloud

  3. 建立或確保您有權存取符合 Config Sync 需求的叢集,並使用下列 Config Sync 設定:
  4. 將叢集註冊機群
  5. 安裝 nomos 指令列工具。 如果已安裝 nomos 工具,請務必升級至 1.9.0 以上版本。
  6. 安裝 Helm

此外,熟悉 Git、Kustomize 和 Helm 也很有幫助。

設定存放區

下列工作說明如何準備含有設定的 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
    

清除所用資源

為避免因為本教學課程所用資源,導致系統向 Google Cloud 收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。

刪除專案

  1. 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。

    前往「Manage resources」(管理資源)

  2. 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)
  3. 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。

刪除個別資源

刪除存放區中的資訊清單

為避免誤刪,Config Sync 不允許您在單一提交中移除所有命名空間或叢集範圍資源。請按照下列操作說明,以正常方式解除安裝元件,並在個別提交中移除命名空間:

  1. 從存放區中移除 cert-manager 元件:

    git rm -rf manifests/cert-manager \
        && git commit -m "uninstall cert-manager" \
        && git push origin BRANCH
    

    BRANCH 替換為您建立存放區的分支。

  2. 刪除 cert-manager 命名空間:

    git rm manifests/namespace-cert-manager.yaml \
        && git commit -m "remove the cert-manager namespace" \
        && git push origin BRANCH
    
  3. 確認 cert-manager 命名空間不存在:

    kubectl get namespace cert-namespace
    

    輸出內容範例:

    Error from server (NotFound): namespaces "cert-namespace" not found
    

刪除叢集

如要刪除叢集,請完成下列指令:

控制台

如要使用 Google Cloud 控制台刪除叢集,請完成下列工作:

  1. 前往 Google Cloud 控制台的 GKE 頁面。

    前往 GKE

  2. 按一下要刪除的叢集旁的「Actions」(動作),然後按一下「Delete」(刪除)

  3. 系統提示您進行確認時,再按一下 [Delete] (刪除)

gcloud

如要使用 Google Cloud CLI 刪除叢集,請執行下列指令:

gcloud container clusters delete CLUSTER_NAME

詳情請參閱 gcloud container clusters delete 說明文件。

後續步驟