使用 Cloud Build 持續部署至 Google Kubernetes Engine (GKE)

1. 總覽

在本研究室中,您將瞭解如何透過 Cloud Build 為 GKE 設定持續推送軟體更新管道。本研究室將重點說明如何針對不同的 Git 事件觸發 Cloud Build 工作,並介紹如何在 GKE 中自動執行初期測試版的簡易模式。

您已完成下列步驟:

  • 建立 GKE 應用程式
  • 自動為 Git 分支版本部署
  • 自動為 Git 主要分支版本部署
  • 自動部署 Git 標記

2. 事前準備

如要查看本參考指南,您需要建立 Google Cloud 專案。您可以建立新專案,或選取已建立的專案:

  1. 選取或建立 Google Cloud 專案。

前往專案選取工具頁面

  1. 啟用專案的計費功能。

啟用計費功能

3. 準備環境

  1. 建立本教學課程中使用的環境變數:
    export PROJECT_ID=$(gcloud config get-value project)
    export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
    
    export ZONE=us-central1-b
    export CLUSTER=gke-progression-cluster
    export APP_NAME=myapp
    
  2. 啟用下列 API:
    • Resource Manager
    • GKE
    • Cloud Source Repositories
    • Cloud Build
    • Container Registry
    gcloud services enable \
        cloudresourcemanager.googleapis.com \
        container.googleapis.com \
        sourcerepo.googleapis.com \
        cloudbuild.googleapis.com \
        containerregistry.googleapis.com \
        --async
    
  3. 複製範例來源並切換至研究室目錄:
    git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git gke-progression
    
    cd gke-progression/labs/gke-progression
    rm -rf ../../.git
    
  4. 將範例存放區中的預留位置值替換為您的 PROJECT_ID:在這個步驟中,您會建立目前環境專屬的各種設定檔執行個體。如要查看要更新範本的範例,請執行下列指令。
    cat k8s/deployments/dev/frontend-dev.yaml.tmpl
    
    執行外部指令,執行替代變數。
    for template in $(find . -name '*.tmpl'); do envsubst '${PROJECT_ID} ${ZONE} ${CLUSTER} ${APP_NAME}' < ${template} > ${template%.*}; done
    
    如要在替換後查看檔案範例,請執行下列指令。
    cat k8s/deployments/dev/frontend-dev.yaml
    
  5. 如果您之前未曾在 Cloud Shell 中使用 Git,請設定要使用的 user.nameuser.email 值:
    git config --global user.email "YOUR_EMAIL_ADDRESS"
    git config --global user.name "YOUR_USERNAME"
    
  6. 將來自 Cloud Source Repositories 範例存放區的程式碼儲存在 Cloud Source Repositories:
    gcloud source repos create gke-progression
    git init
    git config credential.helper gcloud.sh
    git remote add gcp https://source.developers.google.com/p/$PROJECT_ID/r/gke-progression
    git branch -m main
    git add . && git commit -m "initial commit"
    git push gcp main
    
  7. 建立 GKE 叢集。
    gcloud container clusters create ${CLUSTER} \
        --project=${PROJECT_ID} \
        --zone=${ZONE}
    
  8. 將 Cloud Build 權限授予您的叢集。Cloud Build 會將應用程式部署至您的 GKE 叢集,並需要相關權限。
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
        --role=roles/container.developer
    

您的環境已準備就緒!

4. 建立 GKE 應用程式

在本節中,您將建構及部署在本教學課程中使用的初始正式版應用程式。

  1. 使用 Cloud Build 建構應用程式:
    gcloud builds submit --tag gcr.io/$PROJECT_ID/$APP_NAME:1.0.0 src/
    
  2. 手動部署至初期測試環境和實際工作環境:使用 kubectl apply 指令建立實際工作環境和初期測試部署和服務。
    kubectl create ns production
    kubectl apply -f k8s/deployments/prod -n production
    kubectl apply -f k8s/deployments/canary -n production
    kubectl apply -f k8s/services -n production
    
    在這裡部署的服務會將流量轉送至初期測試版本和實際工作環境部署。
  3. 查看執行中的 Pod 數量確認前端有四個 Pod,包括三個用於實際工作環境流量的 Pod,以及一個用於初期測試版的 Pod。也就是說,對初期測試版所做的變更只會影響 4/25% 的使用者。
    kubectl get pods -n production -l app=$APP_NAME -l role=frontend
    
  4. 擷取實際工作環境服務的外部 IP 位址。,瞭解如何調查及移除這項存取權。
    kubectl get service $APP_NAME -n production
    
    負載平衡器傳回 IP 位址後,繼續進行下一個步驟
  5. 儲存外部 IP,以供日後使用。
    export PRODUCTION_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}"  --namespace=production services $APP_NAME)
    
  6. 查看應用程式,檢查服務的版本輸出內容。它應讀取 Hello World v1.0
    curl http://$PRODUCTION_IP
    

恭喜!您已部署範例應用程式!接下來,您需要設定觸發條件來持續部署變更。

5. 自動處理 Git 分支版本的部署作業

在本節中,您將設定觸發條件,在修訂 main 以外的任何分支版本時執行 Cloudbuild 工作。在這裡使用的 Cloud Build 檔案,會自動為任何現有或新的分支版本建立命名空間和部署作業,讓開發人員先預覽程式碼,再與主要分支版本整合。

  1. 設定觸發條件:此觸發條件的關鍵元件是使用 branchName 參數來比對 main,以及將 invertRegex 參數設為 true,並調整 branchName 模式以符合 main 以外的任何項目。以下 build/branch-trigger.json 內有以下幾行供您參考。
      "branchName": "main",
      "invertRegex": true
    
    此外,與這項觸發條件搭配使用的 Cloud Build 檔案的最後幾行內容會建立以觸發工作的分支版本命名的命名空間,然後在新的命名空間中部署應用程式與服務。以下 build/branch-cloudbuild.yaml
      kubectl get ns ${BRANCH_NAME} || kubectl create ns ${BRANCH_NAME}
      kubectl apply --namespace ${BRANCH_NAME} --recursive -f k8s/deployments/dev
      kubectl apply --namespace ${BRANCH_NAME} --recursive -f k8s/services
    
    檔案提供以下幾行供您參考: 現在您已瞭解使用中的機制,不妨利用以下 gcloud 指令建立觸發條件。
    gcloud beta builds triggers create cloud-source-repositories \
      --trigger-config build/branch-trigger.json
    
  2. 如要查看觸發條件,請前往控制台中的 Cloud Build Triggers 頁面。前往觸發條件
  3. 建立新的分支版本:
    git checkout -b new-feature-1
    
  4. 修改程式碼以表示 1.1 版。請編輯 src/app.py,並將回應從 1.0 變更為 1.1
    @app.route('/')
    def hello_world():
        return 'Hello World v1.1'
    
  5. 提交變更並推送至遠端存放區:
    git add . && git commit -m "updated" && git push gcp new-feature-1
    
  6. 如要查看進行中的建構作業,請前往控制台的 Cloud Build 記錄頁面前往建構作業。建構作業完成後,請前往下一個步驟。
  7. 擷取新部署的分支版本服務的外部 IP 位址。,瞭解如何調查及移除這項存取權。
    kubectl get service $APP_NAME -n new-feature-1
    
    負載平衡器傳回 IP 位址後,繼續進行下一個步驟
  8. 儲存外部 IP,以供日後使用。
    export BRANCH_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}"  --namespace=new-feature-1 services $APP_NAME)
    
  9. 查看應用程式檢查服務的版本輸出內容。它應讀取 Hello World v1.0
    curl http://$BRANCH_IP
    

6. 自動處理 Git 主要分支版本的部署作業

發布程式碼前,通常會先將程式碼釋出給一小部分即時流量,然後再將所有流量遷移至新的程式碼集。

在本節中,您將實作在程式碼提交至主要分支版本時啟用的觸發條件。觸發條件會部署初期測試部署,以便將 25% 的即時流量傳送到新的修訂版本。

  1. 為主要分支版本設定觸發條件:
    gcloud beta builds triggers create cloud-source-repositories \
      --trigger-config build/main-trigger.json
    
  2. 如要查看新的觸發條件,請前往控制台的 Cloud Build Triggers 頁面。前往觸發條件
  3. 將分支版本合併至主要行,並推送至遠端存放區:
    git checkout main
    git merge new-feature-1
    git push gcp main
    
  4. 如要查看進行中的建構作業,請前往控制台的 Cloud Build 記錄頁面前往建構作業後,請前往下一個步驟。
  5. 查看伺服器的多個回應。執行下列指令,並注意大約 25% 的回應是「Hello World v1.1」的新回應
    while true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1;  done
    
    準備好繼續時,請按 Ctrl+c 退出迴圈。

7. 自動部署 Git 標記

初期測試部署通過一小部分流量的驗證後,您會將部署發布到其餘的即時流量。

在本節中,您將設定觸發條件,在存放區中建立代碼時啟用。觸發條件會為映像檔加上合適的標記標籤,然後將更新部署至實際工作環境,確保 100% 的流量都存取已加上標記的映像檔。

  1. 設定代碼觸發條件:
    gcloud beta builds triggers create cloud-source-repositories \
      --trigger-config build/tag-trigger.json
    
  2. 如要查看新的觸發條件,請前往控制台的 Cloud Build Triggers 頁面。前往觸發條件
  3. 建立新標記並推送至遠端存放區:
    git tag 1.1
    git push gcp 1.1
    
  4. 如要查看進行中的建構作業,請前往控制台的 Cloud Build 記錄頁面前往「建構作業」
  5. 查看伺服器的多個回應執行下列指令。請注意,100% 的回應都會顯示 Hello World v1.1 的新回應。1 這項作業可能需要一些時間才能完成,因為系統已部署新的 Pod,並在 GKE 中檢查健康狀態
    while true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1;  done
    
    準備好繼續時,請按 Ctrl+c 退出迴圈。恭喜!您已在 Cloud Build 中為分支版本和標記建立 CI/CD 觸發條件,以便將應用程式部署至 GKE。

8. 清除

刪除專案

  1. 在 Cloud 控制台中,前往「管理資源」頁面
  2. 在專案清單中選取要刪除的專案,然後點按「刪除」。
  3. 在對話方塊中輸入專案 ID,然後按一下「Shut down」(關閉) 即可刪除專案。