瞭解 Skaffold

1. 目標

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

在本教學課程中,您將瞭解 Skaffold 的一些核心概念,並使用該工具自動化內部開發循環,然後部署應用程式。

您將學會以下內容:

  • 設定並啟用 Skaffold 以便本機開發
  • 建構並執行簡單的 Go 應用程式
  • 使用 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 管道的頂層設定檔。

請注意 YAML 中的 Kubernetes 格式和以下部分:

  • build
  • deploy
  • profiles

這些區段會定義應用程式的建構和部署方式,以及每個部署目標的設定檔。

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

4. 建構

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

除了這項資訊外,您還可以在本節中看到 Dockerfile 的參照,用於建構圖片。Skaffold 還支援其他建構工具,例如 JibMavenGradle、雲端原生 BuildpacksBazel 和自訂指令碼。如要進一步瞭解這項設定,請參閱 Skaffold 建構說明文件

5. 部署

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

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

在這個範例中,您可以看到三個目標的兩個疊加層,分別是devstagingproddev 疊加層會在本機開發期間使用,stagingprod 疊加層則會在使用 Skaffold 部署時使用。

6. 設定檔

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. 接著,在 IDE 窗格中的「app > main.go」檔案中,變更這行程式碼:
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