本教學課程說明如何按照 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 時需要使用的工作流程,multi-environments-kustomize 目錄包含可用於自動設定 Config Sync 的指令碼。
- 複製範例存放區: - git clone https://github.com/GoogleCloudPlatform/anthos-config-management-samples.git
- 前往內含本教學課程所需資源的資料夾: - cd anthos-config-management-samples/multi-environments-kustomize/
- 如要執行本教學課程中使用的指令碼,請設定下列變數: - 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 區域
 
- 如要建立兩個叢集,請執行 - ./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.
- 如要將叢集註冊至兩個不同的機群,請執行 - register-clusters.sh指令碼:- ./register-clusters.sh- 這個指令碼會為 GKE 叢集註冊建立 Google Cloud 服務帳戶和金鑰,然後使用 - gcloud container fleet memberships register指令,將- dev和- prod叢集註冊到各自專案中的 GKE。- 輸出內容範例: - 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 現在會將存放區中的設定同步處理至叢集。
驗證您的設定
在本節中,您會檢查叢集是否與存放區中的設定同步:
- 如要檢查 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 ```
- 使用 - kubectl切換至開發叢集:- kubectl config use-context "gke_${DEV_PROJECT}_${DEV_CLUSTER_ZONE}_dev"
- 如要確認資源是否已同步,請取得命名空間。您應該會看到 - 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 專案和環境的開發與正式環境,設定自動設定轉譯功能。