瞭解 Skaffold

1. 目標

Skaffold 這項工具可處理建構、推送及部署應用程式的工作流程。您可以使用 Skaffold 輕鬆設定本機開發工作區、簡化內部開發迴圈,並整合 KustomizeHelm 等其他工具,以便管理 Kubernetes 資訊清單。

在本教學課程中,您將瞭解 Skaffold 的一些核心概念,以此自動化內部開發迴圈,然後部署應用程式。

您將學會以下內容:

  • 設定並啟用 Skaffold 以進行本機開發作業
  • 建構及執行簡單的 Golang 應用程式
  • 使用 Skaffold 管理本機應用程式部署作業
  • 轉譯資訊清單及部署應用程式

2. 事前準備

正在準備工作區

  1. 前往以下網址開啟 Cloud Shell 編輯器:
https://shell.cloud.google.com

允許第三方 Cookie。按一下「網站無法運作」然後再選擇 [允許 Cookie]

7b702066a2135a3d.png

3394f82132eb4fd4.png

  1. 如果尚未在終端機視窗中使用以下指令複製應用程式來源,請先執行此操作:
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git
  1. 變更為複製的存放區目錄:
cd software-delivery-workshop/labs/understanding-skaffold/getting-started
  1. 執行下列指令,將 Cloud Shell 工作區設為目前的目錄:
cloudshell workspace .

正在準備專案

  1. 執行下列指令,確保 Google Cloud 專案設定正確:
gcloud config set project {{project-id}}

3. 開始使用 Skaffold

  1. 執行下列指令,建立頂層 Skaffold 設定檔 skaffold.yaml
cat <<EOF > skaffold.yaml
apiVersion: skaffold/v2beta21
kind: Config
metadata:
  name: getting-started-kustomize
build:
  tagPolicy:
    gitCommit:
      ignoreChanges: true
  artifacts:
  - image: skaffold-kustomize
    context: app
    docker:
      dockerfile: Dockerfile
deploy:
  kustomize:
    paths:
    - overlays/dev
profiles:
- name: staging
  deploy:
    kustomize:
      paths:
      - overlays/staging
- name: prod
  deploy:
    kustomize:
      paths:
      - overlays/prod
EOF
  1. 在 IDE 窗格中開啟 skaffold.yaml 檔案。這是定義 Skaffold 管道的頂層設定檔。

請注意類似 Kubernetes 的 YAML 格式,以及 YAML 中的下列部分:

  • build
  • deploy
  • profiles

這些章節將定義應如何建構及部署應用程式,並定義各個部署目標的設定檔。

如要進一步瞭解 Skaffold 管道階段的完整清單,請參閱說明文件

4. 建構

build 區段包含定義應用程式建構方式的設定。在這個情況下,您可以查看 git 標記的處理方式設定,以及定義構成應用程式的容器映像檔的 artifacts 區段。

本節也提供 Dockerfile 的參照,可用來建構映像檔。Skaffold 還支援其他建構工具,例如 JibMavenGradle、雲端原生 BuildpacksBazel 和自訂指令碼。如要進一步瞭解這項設定,請參閱 Skaffold 建構說明文件

5. 部署

deploy 區段包含定義應用程式部署方式的設定。在這個情況下,您可以查看將 Skaffold 使用 Kustomize 工具的預設部署作業範例。

Kustomize 工具可將一組常見的元件 YAML 檔案 (位於 base 目錄下) 與一或多個「疊加層」結合,藉此產生 Kubernetes 資訊清單。通常會對應至一或多個部署目標,通常是 devteststagingProduction 或類似的項目。

在此範例中,您會看到有 devstagingprod 三個目標的兩個疊加層。本機開發期間會使用 dev 疊加層,而在使用 Skaffold 部署時則會使用 stagingprod 疊加層。

6. Google 個人資料

profiles 區段包含設定,可針對不同情境定義建構、測試和部署設定。不同情境通常是應用程式部署管道中的不同環境,例如本例中的 stagingprod。這表示您可以輕鬆管理內容在不同目標環境中內容差異的資訊清單,無需重複樣板設定。

profiles 區段的設定可以取代或修補主要設定中的任何項目 (例如 buildtestdeploy 區段)。

例如,開啟 overlays > prod > deployment.yaml 檔案。請注意,這裡的應用程式備用資源數量已設為三個,並覆寫基礎設定。

  1. 在 IDE 窗格中開啟下列檔案 app > main.go。這個簡單的 golang 應用程式每秒都會將字串寫入 stdout
  2. 請注意,應用程式也會輸出其執行所在的 Kubernetes Pod 名稱。

查看 Dockerfile

  1. 在 IDE 窗格中開啟 app > Dockerfile 檔案。這個檔案包含一系列指令,用於建構 main.go 檔案的應用程式容器映像檔,系統會在頂層 skaffold.yaml 檔案中參照這些指令。

7. 使用 Skaffold 進行開發

設定 Kubernetes 環境

  1. 執行下列指令,確保本機 Kubernetes 叢集正在執行並設定:
minikube start

這可能需要幾分鐘的時間。如果叢集已順利啟動,您應該會看見下列輸出內容:

Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
  1. 執行下列指令,為 devstagingprod 建立 Kubernetes 命名空間:
kubectl apply -f namespaces.yaml

您應該會看到以下的輸出內容:

namespace/dev created
namespace/staging created
namespace/prod created

使用 Skaffold 進行本機開發

  1. 執行下列指令,建構應用程式並部署至在 Cloud Shell 中執行的本機 Kubernetes 叢集:
skaffold dev

您應該會看到應用程式容器建構程序正在執行,接著可能需要一分鐘,接著應用程式輸出內容會每秒重複執行:

[skaffold-kustomize] Hello world from pod skaffold-kustomize-dev-xxxxxxxxx-xxxxx

請注意,正確的 Pod 名稱會與上述的一般輸出內容不同。

變更應用程式

現在應用程式已在本機 Kubernetes 叢集中執行,您可以變更程式碼,Skaffold 將自動重新建構應用程式,並重新部署至叢集。

  1. 在 IDE 窗格中開啟 app > main.go 檔案,然後變更輸出字串:
"Hello world from pod %s!\n"

收件者:

"Hello Skaffold world from pod %s!\n"

完成變更之後,Skaffold 應會重新建構映像檔並重新部署至叢集,終端機視窗中會顯示輸出內容的變更。

  1. 現在同樣位於「app >」檔案中main.go&quot;在 IDE 窗格中變更下列程式碼:
time.Sleep(time.Second * 1)

time.Sleep(time.Second * 10)

您應該會再次看到應用程式已重新建構並重新部署,輸出行每 10 秒都會顯示一次。

變更 Kubernetes 設定

接下來,您將變更 Kubernetes 設定,之後會有更多 Skaffold 自動重新部署。

  1. 在 IDE 中開啟 base > deployment.yaml 檔案,然後變更以下一行:
replicas: 1

replicas: 2

重新部署應用程式後,畫面上應該會顯示兩個 Pod 正在執行,每個 Pod 的名稱皆不同。

  1. 現在,將 base > deployment.yaml 檔案中的同一行改回:
replicas: 1

您應該會看到一個 Pod 已從服務中移除,因此只剩下一個 Pod。

  1. 最後,在終端機視窗中按下 Ctrl-C,即可停止 Skaffold 本機開發作業。

剪輯版本

接下來,您將建構發布映像檔並部署至叢集,藉此建立版本。

  1. 執行下列指令來建構版本:
skaffold build --file-output artifacts.json

這個指令會建構最終映像檔 (如有必要),並將版本詳細資料輸出至 artifacts.json 檔案。

如果您要使用 Cloud Deploy 等工具部署至叢集,這個檔案會包含版本資訊。這表示,在現行的路徑中,構件無法變更。

  1. 執行下列指令,查看 artifacts.json 檔案的內容:
cat artifacts.json | jq

請注意,檔案內含要在最終部署中使用的映像檔參照。

部署至測試環境

  1. 執行下列指令,使用 staging 設定檔部署版本:
skaffold deploy --profile staging --build-artifacts artifacts.json --tail

部署完成後,您應該會看到來自兩個類似以下的 Pod 的輸出內容:

[skaffold-kustomize] Hello world from pod skaffold-kustomize-staging-xxxxxxxxxx-xxxxx!
  1. 在終端機視窗中按下 Ctrl-C 鍵,停止輸出 Skaffold 輸出內容。
  2. 執行下列指令,觀察您的應用程式在叢集中是否正在執行:
kubectl get all --namespace staging

您應該會看到兩個不同的 Pod 名稱,因為應用程式的 staging 設定檔指定部署中應有兩個備用資源。

部署至實際工作環境

  1. 接著執行下列指令,使用 prod 設定檔部署版本:
skaffold deploy --profile prod --build-artifacts artifacts.json --tail

部署完成後,您應該會看到來自以下三個 Pod 的輸出內容:

[skaffold-kustomize] Hello world from pod skaffold-kustomize-prod-xxxxxxxxxx-xxxxx!
  1. 在終端機視窗中按下 Ctrl-C 鍵,停止輸出 Skaffold 輸出內容。

您應該會看到三個不同的 pod 名稱,因為應用程式的 prod 設定檔指定部署中應該要有三個備用資源。

  1. 執行下列指令,觀察您的應用程式在叢集中是否正在執行:
kubectl get all --namespace prod

您應該會看見包含類似下列幾行程式碼的輸出,顯示了實際工作環境的部署:

NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/skaffold-kustomize-prod   3/3     3            3           16m

您應該會看到三個執行中的應用程式 Pod。

NAME                                           READY   STATUS    RESTARTS   AGE
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m

8. 恭喜!

恭喜!您已完成「Understanding Skaffold」研究室,也瞭解如何設定及使用 Skaffold 進行本機開發和應用程式部署。

下一步:

進一步瞭解 Skaffold:

清除所用資源

  1. 執行下列指令,關閉本機叢集:
minikube delete