在具備自動轉譯功能的多個環境中使用 Config Sync

本教學課程說明如何按照 Config Sync 最佳做法,為兩個環境 (一個是開發環境,另一個是實際工作環境) 設定 Google Kubernetes Engine 的 Config Sync。

在這個情境中,您是 Foo Corp 平台管理團隊的成員。Foo Corp 應用程式已部署至 GKE,資源則分散在 dev 和 prod 這兩個專案中。dev 專案包含開發 GKE 叢集,prod 專案則包含正式版 GKE 叢集。平台管理員的目標是確保兩個環境都符合 Foo Corp 的政策,並確保 Kubernetes 命名空間和服務帳戶等基本層級資源在兩個環境中保持一致。

本教學課程會運用 Config Sync 的自動轉譯功能,在叢集上轉譯資源。每個叢集都設定為從含有 Kustomization 設定檔的目錄進行同步,這會自動觸發 Config Sync 中的轉譯程序。詳情請參閱「使用含有 Kustomize 設定和 Helm 圖表的存放區」。

在本教學課程中,您會建立下列資源:
  • 兩個 Google Cloud 專案,分別代表開發和正式環境。
  • 兩個 GKE 叢集 (dev 和 prod) 位於不同專案中,且已安裝 Config Sync。

存放區架構

在本教學課程中,您將設定 Config Sync,以便與範例存放區的config-source/ 目錄中的設定同步。這個目錄包含下列目錄和檔案:

config-source/
├── base
│   ├── foo
│   │   ├── kustomization.yaml
│   │   ├── namespace.yaml
│   │   └── serviceaccount.yaml
│   ├── kustomization.yaml
│   ├── pod-creator-clusterrole.yaml
│   └── pod-creator-rolebinding.yaml
├── cloudbuild.yaml
├── overlays
│   ├── dev
│   │   └── kustomization.yaml
│   └── prod
│       └── kustomization.yaml
└── README.md

config-source 目錄包含 base/ 資訊清單,以及 dev/ 和 prod/ Kustomize 疊加層。每個目錄都包含 kustomization.yaml 檔案,其中列出 Kustomize 應管理及套用至叢集的檔案。在 dev/kustomization.yaml 和 prod/kustomization.yaml 中定義一系列修補程式。這些修補程式會操控特定環境的 base/ 資源。

舉例來說,開發人員 RoleBinding 允許所有 Foo Corp 開發人員將 Pod 部署至開發叢集,而生產環境 RoleBinding 只允許持續部署代理程式 deploy-bot@foo-corp.com 將 Pod 部署至生產環境:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
patches:
# ServiceAccount - make name unique per environ
- target:
    kind: ServiceAccount
    name: foo-ksa
  patch: |-
    - op: replace
      path: /metadata/name
      value: foo-ksa-dev
    - op: replace
      path: /metadata/namespace
      value: foo-dev
# Pod creators - give all Foo Corp developers access
- target:
    kind: RoleBinding
    name: pod-creators
  patch: |-
    - op: replace
      path: /subjects/0/name
      value: developers-all@foo-corp.com
commonLabels:
  environment: dev

目標

  • 設定 Config Sync,自動轉譯及同步處理兩個獨立環境的設定。

費用

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

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

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

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

事前準備

開始本教學課程前,請務必完成下列步驟:

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

    前往專案選取器

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

  3. 升級 Google Cloud CLI 至最新版本。

  4. 安裝或升級 nomos 指令

建立及註冊叢集

為了讓您專注於為多個環境設定 Config Sync 時需要使用的工作流程,multi-environments-kustomize 目錄包含可用於自動設定 Config Sync 的指令碼。

  1. 複製範例存放區:

    git clone https://github.com/GoogleCloudPlatform/anthos-config-management-samples.git
    
  2. 前往內含本教學課程所需資源的資料夾:

    cd anthos-config-management-samples/multi-environments-kustomize/
    
  3. 如要執行本教學課程中使用的指令碼,請設定下列變數:

    export DEV_PROJECT="DEV_PROJECT_ID"
    export PROD_PROJECT="PROD_PROJECT_ID"
    export DEV_CLUSTER_ZONE="DEV_CLUSTER_ZONE"
    export PROD_CLUSTER_ZONE="PROD_CLUSTER_ZONE"
    export CM_CONFIG_DIR="config-sync-rendering"
    

    更改下列內容:

    • DEV_PROJECT_ID:您要用做開發專案的Google Cloud 專案 ID
    • PROD_PROJECT_ID:您要用做正式版專案的Google Cloud 專案 ID
    • DEV_CLUSTER_ZONE:要建立開發叢集的 Compute Engine 區域。例如:us-central1-c。
    • PROD_CLUSTER_ZONE:您要在其中建立正式版叢集的 Compute Engine 區域
  4. 如要建立兩個叢集,請執行 ./create-clusters.sh 指令碼:

    ./create-clusters.sh
    

    這個指令碼會在開發專案中建立一個名為 dev 的 GKE 叢集,並在正式版專案中建立一個名為 prod 的 GKE 叢集。這個指令碼也會啟用 GKE API,並連線至 dev 和 prod 叢集,讓您使用 kubectl 存取這些叢集的 API。

    輸出內容範例:

    kubeconfig entry generated for dev.
    Fetching cluster endpoint and auth data.
    kubeconfig entry generated for prod.
    ⭐️ Done creating clusters.
    
  5. 如要將叢集註冊至兩個不同的機群,請執行 register-clusters.sh 指令碼:

    ./register-clusters.sh
    

    這個指令碼會建立服務帳戶和金鑰,用於註冊 GKE 叢集,然後使用 gcloud container fleet memberships register 指令,將 dev 和 prod 叢集註冊至各自專案中的 GKE。 Google Cloud

    輸出內容範例:

    Waiting for Feature Config Management to be created...done.
    ⭐️ Done registering clusters.
    

設定 Config Sync

建立及註冊叢集後,您就可以安裝 Config Sync 並驗證安裝作業。

安裝 Config Sync

如要安裝 Config Sync,請在開發和正式環境叢集上執行 install-config-sync.sh 指令碼:

./install-config-sync.sh

預期輸出內容:

🔁 Installing ConfigSync on the dev cluster...
Updated property [core/project].
Switched to context "DEV_CLUSTER".
Waiting for Feature Config Management to be updated...done.
🔁 Installing ConfigSync on the prod cluster...
Updated property [core/project].
Switched to context "PROD_CLUSTER".
Waiting for Feature Config Management to be updated...done.

Config Sync 現在會將存放區中的設定同步處理至叢集。

驗證您的設定

在本節中,您會檢查叢集是否與存放區中的設定同步:

  1. 如要檢查 Config Sync 安裝狀態,請執行 nomos status 指令:

    nomos status
    

    您應該會看到開發和正式版叢集現在都已同步至各自的存放區:

    gke_DEV_PROJECT_ID_us-central1-c_dev
      --------------------
      <root>   https://github.com/GoogleCloudPlatform/anthos-config-management-samples/multi-environments-kustomize/config-source/overlays/dev@main
      SYNCED   8f2e196f
      Managed resources:
         NAMESPACE   NAME                                                 STATUS
                     clusterrole.rbac.authorization.k8s.io/pod-creator    Current
                     namespace/default                                    Current
                     namespace/foo                                        Current
         default     rolebinding.rbac.authorization.k8s.io/pod-creators   Current
         foo         serviceaccount/foo-ksa-dev                           Current
    
    *gke_PROD_PROJECT_ID_us-central1-c_prod
       --------------------
       <root>   https://github.com/GoogleCloudPlatform/anthos-config-management-samples/multi-environments-kustomize/config-source/overlays/prod@main
       SYNCED   c91502ee
       Managed resources:
          NAMESPACE   NAME                                                 STATUS
                      clusterrole.rbac.authorization.k8s.io/pod-creator    Current
                      namespace/default                                    Current
                      namespace/foo                                        Current
          default     rolebinding.rbac.authorization.k8s.io/pod-creators   Current
          foo         serviceaccount/foo-ksa-prod                          Current
    
      ```
    
  2. 使用 kubectl 切換至開發叢集:

    kubectl config use-context "gke_${DEV_PROJECT}_${DEV_CLUSTER_ZONE}_dev"
    
  3. 如要確認資源是否已同步,請取得命名空間。您應該會看到 foo 命名空間。

    kubectl get namespace
    

    輸出內容範例:

    NAME                           STATUS   AGE
    config-management-monitoring   Active   9m38s
    config-management-system       Active   9m38s
    default                        Active   47h
    foo                            Active   9m5s
    kube-node-lease                Active   47h
    kube-public                    Active   47h
    kube-system                    Active   47h
    resource-group-system          Active   9m30s
    

    您現在已為多個 Google Cloud 專案和環境的開發與正式環境,設定自動設定轉譯功能。

清除所用資源

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

刪除所有資源

如要刪除在本教學課程中建立的資源,但保留開發和正式版專案,請執行清除指令碼:

./cleanup.sh

刪除專案

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

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

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

後續步驟