本教學課程說明如何在使用 Google Kubernetes Engine 叢集時,透過 Cloud Build 驗證設定。只要稍做變更,相同的設定就能在任何其他以容器為基礎的 CI/CD 系統 (例如 CircleCI) 中運作。
除了執行 nomos vet 指令檢查設定是否有效,我們也建議您在 CI/CD 管道中驗證所有設定變更。
目標
- 建立 Cloud Build 設定檔,指示 Config Sync 在存放區的設定中,使用
nomos vet。 - 建立 Cloud Build 自動建構觸發條件,以便在開發分支版本有變更時檢查設定。
費用
在本文件中,您會使用下列 Google Cloud的計費元件:
如要根據預測用量估算費用,請使用 Pricing Calculator。
完成本文所述工作後,您可以刪除建立的資源,避免繼續計費,詳情請參閱「清除所用資源」。
事前準備
- 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Build API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Build API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.- 建立或存取符合 Config Sync 需求的 GKE 叢集。如要瞭解如何建立這類叢集,請參閱「開始使用 Config Sync」。
授予 Cloud Build 服務帳戶權限
授予 Cloud Build 服務帳戶存取 GKE 叢集的權限。
gcloud
如要將 Kubernetes Engine Developer 角色新增至 Cloud Build 服務帳戶,請執行下列指令:
PROJECT_ID=$(gcloud config get-value project)
PROJECT_NUM=$(gcloud projects list --filter="$PROJECT_ID" --format="value(PROJECT_NUMBER)")
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member=serviceAccount:$PROJECT_NUM@cloudbuild.gserviceaccount.com \
--role=roles/container.developer
控制台
在 Google Cloud 控制台中開啟「IAM」頁面。
在「成員」欄中,找出 Cloud Build 服務帳戶所在的資料列:
PROJECT_NUMBER@cloudbuild.gserviceaccount.com在該資料列中,按一下 「Edit principal」(編輯主體)。
按一下 [Add another role] (新增其他角色)。
在「Select a role」(選取角色) 清單中,選取
Kubernetes Engine Developer,然後按一下「Save」(儲存)。
建立 Cloud Build 設定
建立 Cloud Build 設定檔,並儲存在包含設定檔的存放區根目錄中 (例如 my-repo/cloudbuild.yaml)。
steps:
- name: 'gcr.io/cloud-builders/kubectl'
args: ['config', 'current-context']
volumes:
- name: 'kube'
path: '/kube'
env:
- 'KUBECONFIG=/kube/config'
- 'CLOUDSDK_COMPUTE_ZONE=ZONE'
- 'CLOUDSDK_CONTAINER_CLUSTER=CLUSTER_NAME'
- 'CLOUDSDK_CONTAINER_USE_APPLICATION_DEFAULT_CREDENTIALS=true'
- name: 'bash'
args: ['chmod', '444', '/kube/config']
volumes:
- name: 'kube'
path: '/kube'
- name: 'gcr.io/config-management-release/nomos:stable'
args: ['nomos', 'vet', '--path', '/workspace/POLICY_DIR']
volumes:
- name: 'kube'
path: '/kube'
env:
- 'KUBECONFIG=/kube/config'
timeout: 30s
更改下列內容:
ZONE:叢集執行的區域CLUSTER_NAME:叢集名稱POLICY_DIR:Git 存放區中的路徑,代表要同步處理的存放區頂層
這項設定分為三個步驟:
- 執行
kubectl config current-context,產生向my-clusterGKE 叢集驗證所需的 kubeconfig 檔案。超級使用者會產生這個檔案,但權限受限。 - 執行
chmod 444 /kube/config,讓這個檔案可在下一個步驟中讀取。 - 在 Git 存放區上執行
nomos vet,該存放區會自動複製到/workspace。如果您是使用非結構化存放區,請改為執行nomos vet --source-format=unstructured。
建立自動建構觸發條件
以下範例會建立觸發條件,針對提交至 Cloud Source Repositories 存放區 master 分支版本的每個修訂內容執行作業。
在 Google Cloud 控制台中開啟「觸發條件」頁面。
按一下 [Connect repository] (連結存放區)。
選取「GitHub (已鏡像)」,然後按一下「繼續」。
選取存放區,然後按一下「連結存放區」。
按一下 [Add trigger] (新增觸發條件)。
在下表所述的每個欄位中,輸入或選取對應項目:
欄位 項目 事件 推送至分支版本 分支版本 ^master$ 設定 Cloud Build 設定檔 (YAML 或 JSON) Cloud Build 建構設定檔位置 / cloudbuild.yaml 按一下「建立」即可儲存自動建構觸發條件。
測試自動建構觸發條件
手動執行觸發條件,測試設定:
在 Google Cloud 控制台中開啟「觸發條件」頁面。
找出您建立的觸發條件,然後按一下「執行觸發條件」。
系統會顯示「Build started on master branch」(已在主要分支啟動建構作業) 訊息。
按一下「顯示」。
如果設定正確,Cloud Build 步驟會顯示為綠色。
Cloud Build 設定無效
如果 Cloud Build 建構設定檔無效,觸發條件就無法執行。
如要測試這項功能,請使用下列檔案更新存放區中的 Cloud Build 設定。請注意第 6 行的無效縮排:
steps:
- name: 'gcr.io/cloud-builders/kubectl'
args: ['config', 'current-context']
volumes:
- name: 'kube'
path: '/kube'
env:
- 'KUBECONFIG=/kube/config'
- 'CLOUDSDK_COMPUTE_ZONE=ZONE'
- 'CLOUDSDK_CONTAINER_CLUSTER=CLUSTER_NAME'
- 'CLOUDSDK_CONTAINER_USE_APPLICATION_DEFAULT_CREDENTIALS=true'
- name: 'bash'
args: ['chmod', '444', '/kube/config']
volumes:
- name: 'kube'
path: '/kube'
- name: 'gcr.io/nomos-release/nomos:stable'
args: ['nomos', 'vet', '--path', '/workspace/POLICY_DIR']
volumes:
- name: 'kube'
path: '/kube'
env:
- 'KUBECONFIG=/kube/config'
timeout: 30s
如果您再次手動執行觸發程序,會收到以下錯誤訊息,因為第 6 行的 path: 未正確縮排:
Failed to trigger build: failed unmarshalling build config cloudbuild.yaml:
unknown field "path" in cloudbuild_go_proto.BuildStep.
如要修正這項設定,請將第 6 行的 path: 縮排至與第 5 行的 name: 相同層級。如要進一步瞭解 Cloud Build 設定檔的結構,請參閱「建立基本 Cloud Build 設定」。
清除所用資源
刪除專案
刪除 Google Cloud 專案:
gcloud projects delete PROJECT_ID
刪除個別資源
如要刪除個別資源,請完成下列步驟:
- 刪除 Cloud Build 設定檔。
- 刪除您建立的 Cloud Build 自動建構觸發條件。
- 刪除您在本教學課程中使用的叢集。