1. 目標
Skaffold 是一種工具,可處理建構、推送及部署應用程式的工作流程。您可以使用 Skaffold 輕鬆設定本機開發工作區、簡化內部開發迴圈,並整合 Kustomize 和 Helm 等其他工具,以便管理 Kubernetes 資訊清單。
在本教學課程中,您將瞭解 Skaffold 的一些核心概念,並使用該工具自動化內部開發循環,然後部署應用程式。
您將學會以下內容:
- 設定並啟用 Skaffold 以便本機開發
- 建構並執行簡單的 Go 應用程式
- 使用 Skaffold 管理本機應用程式部署作業
- 算繪資訊清單並部署應用程式
2. 事前準備
準備工作區
- 請前往下列網址開啟 Cloud Shell 編輯器:
https://shell.cloud.google.com
允許第三方 Cookie。依序按一下「網站無法正常運作」和「允許 Cookie」。
- 如果您尚未這麼做,請在終端機視窗中使用下列指令複製應用程式來源:
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git
- 變更為複製的存放區目錄:
cd software-delivery-workshop/labs/understanding-skaffold/getting-started
- 執行下列指令,將 Cloud Shell 工作區設為目前的目錄:
cloudshell workspace .
準備專案
- 執行下列指令,確認 Google Cloud 專案設定正確無誤:
gcloud config set project {{project-id}}
3. 開始使用 Skaffold
- 執行下列指令,建立頂層 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
- 在 IDE 窗格中開啟檔案
skaffold.yaml
。這是定義 Skaffold 管道的頂層設定檔。
請注意 YAML 中的 Kubernetes 格式和以下部分:
build
deploy
profiles
這些區段會定義應用程式的建構和部署方式,以及每個部署目標的設定檔。
如要進一步瞭解 Skaffold 階段的完整清單,請參閱 Skaffold 管道階段說明文件。
4. 建構
build
區段包含設定,可定義應用程式的建構方式。在這種情況下,您可以查看如何處理 git
標記的設定,以及定義應用程式容器映像檔的 artifacts
部分。
除了這項資訊外,您還可以在本節中看到 Dockerfile
的參照,用於建構圖片。Skaffold 還支援其他建構工具,例如 Jib
、Maven
、Gradle
、雲端原生 Buildpacks
、Bazel
和自訂指令碼。如要進一步瞭解這項設定,請參閱 Skaffold 建構說明文件。
5. 部署
deploy
區段包含定義應用程式部署方式的設定。在這種情況下,您可以查看預設部署作業的範例,該範例會將 Skaffold 設定為使用 Kustomize
工具。
Kustomize
工具提供產生 Kubernetes 資訊清單的功能,方法是將一組常見元件 YAML 檔案 (位於 base
目錄下) 與一或多個「疊加層」結合,這些疊加層通常會對應至一或多個部署目標,通常是dev、test、staging 和production 或類似項目。
在這個範例中,您可以看到三個目標的兩個疊加層,分別是dev、staging 和 prod。dev 疊加層會在本機開發期間使用,staging 和 prod 疊加層則會在使用 Skaffold 部署時使用。
6. 設定檔
profiles
區段包含設定,可針對不同情境定義建構、測試和部署設定。不同的內容通常是應用程式部署管道中的不同環境,例如本例中的 staging
或 prod
。這表示您可以輕鬆管理內容需要因不同目標環境而異的資訊清單,而無須重複使用樣板設定。
profiles
區段中的設定可取代或修補主設定中的任何項目 (例如 build
、test
或 deploy
區段)。
舉例來說,請開啟檔案 overlays > prod > deployment.yaml
。請注意,應用程式的備用資源數量在此處設為三個,會覆寫基本設定。
瀏覽應用程式原始碼。
- 在 IDE 窗格中開啟以下檔案
app > main.go
。這是一個簡單的 golang 應用程式,每秒會將字串寫入stdout
。 - 請注意,應用程式也會輸出其執行所在的 Kubernetes Pod 名稱。
查看 Dockerfile
- 在 IDE 窗格中開啟檔案
app > Dockerfile
。這個檔案包含一連串指令,可為main.go
檔案建構應用程式容器映像檔,並在頂層skaffold.yaml
檔案中參照。
7. 使用 Skaffold 進行開發
設定 Kubernetes 環境
- 執行下列指令,確認本機 Kubernetes 叢集已啟動及設定:
minikube start
這可能需要幾分鐘的時間。如果叢集已成功啟動,您應該會看到下列輸出內容:
Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
- 執行下列指令,為
dev
、staging
和prod
建立 Kubernetes 命名空間:
kubectl apply -f namespaces.yaml
您應該會看到以下的輸出內容:
namespace/dev created namespace/staging created namespace/prod created
使用 Skaffold 進行本機開發
- 執行下列指令,建構應用程式並部署至在 Cloud Shell 中執行的本機 Kubernetes 叢集:
skaffold dev
您應該會看到應用程式容器建構程序執行 (可能需要一分鐘的時間),然後應用程式輸出內容每秒重複一次:
[skaffold-kustomize] Hello world from pod skaffold-kustomize-dev-xxxxxxxxx-xxxxx
請注意,Pod 的確切名稱會與上述通用輸出內容不同。
修改應用程式
應用程式現在在本機 Kubernetes 叢集中執行,您可以修改程式碼,Skaffold 會自動重建應用程式並重新部署至叢集。
- 在 IDE 窗格中開啟檔案
app > main.go
,然後變更輸出字串:
"Hello world from pod %s!\n"
收件者:
"Hello Skaffold world from pod %s!\n"
變更完成後,您應該會看到 Skaffold 重新建構映像檔,並將其重新部署至叢集,而輸出內容的變更內容也會顯示在終端機視窗中。
- 接著,在 IDE 窗格中的「app > main.go」檔案中,變更這行程式碼:
time.Sleep(time.Second * 1)
到
time.Sleep(time.Second * 10)
您應該會再次看到應用程式重建及重新部署,輸出行每 10 秒出現一次。
變更 Kubernetes 設定
接下來,您將變更 Kubernetes 設定,Skaffold 就會再次自動重新部署。
- 在 IDE 中開啟
base > deployment.yaml
檔案,然後變更該行:
replicas: 1
到
replicas: 2
應用程式重新部署後,您應該會看到兩個執行中的 Pod,每個 Pod 都有不同的名稱。
- 現在,請將
base > deployment.yaml
檔案中的同行程式碼變更回:
replicas: 1
您應該會看到一個 Pod 已從服務中移除,因此只剩下一個 Pod。
- 最後,請在終端機視窗中按下
Ctrl-C
,停止 Skaffold 本機開發。
切割版本
接下來,您將建立版本,方法是建構版本映像檔,然後將其部署至叢集。
- 執行下列指令來建構版本:
skaffold build --file-output artifacts.json
這個指令會建構最終映像檔 (如有必要),並將版本詳細資料輸出至 artifacts.json
檔案。
如果您想使用 Cloud Deploy 等工具將應用程式部署至叢集,這個檔案會包含版本資訊。這表示在直播路徑中,產物是無法變更的。
- 執行下列指令,查看
artifacts.json
檔案的內容:
cat artifacts.json | jq
請注意,該檔案包含最終部署作業中會使用的映像檔參照。
部署至測試環境
- 執行下列指令,使用
staging
設定檔部署版本:
skaffold deploy --profile staging --build-artifacts artifacts.json --tail
部署完成後,您應該會看到來自兩個類似以下的 Pod 的輸出內容:
[skaffold-kustomize] Hello world from pod skaffold-kustomize-staging-xxxxxxxxxx-xxxxx!
- 在終端機視窗中按下 Ctrl-C 鍵即可停止 Skaffold 輸出。
- 執行下列指令,觀察您的應用程式在叢集中是否正在執行:
kubectl get all --namespace staging
您應該會看到兩個不同的 Pod 名稱,因為應用程式的 staging
設定檔指定部署中應有兩個備用資源。
部署至正式環境
- 現在執行下列指令,使用
prod
設定檔部署版本:
skaffold deploy --profile prod --build-artifacts artifacts.json --tail
部署完成後,您應該會看到三個 Pod 的輸出內容,類似以下內容:
[skaffold-kustomize] Hello world from pod skaffold-kustomize-prod-xxxxxxxxxx-xxxxx!
- 在終端機視窗中按下 Ctrl-C 鍵,即可停止 Skaffold 輸出內容。
您應該會看到三個不同的 Pod 名稱,因為應用程式的 prod
設定檔已指定部署中應有三個複本。
- 執行下列指令,觀察應用程式是否在叢集中啟動及執行:
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:
清除所用資源
- 執行下列指令,關閉本機叢集:
minikube delete