1. 目标
Skaffold 是一种可处理用于构建、推送和部署应用的工作流的工具。您可以使用 Skaffold 轻松配置本地开发工作区,简化内部开发循环,并与其他工具(例如 Kustomize 和 Helm)集成,以帮助管理 Kubernetes 清单。
在本教程中,您将学习 Skaffold 的一些核心概念,使用它来自动执行内部开发循环,然后部署应用。
您将学习以下内容:
- 配置并启用 Skaffold 以进行本地开发
- 构建并运行简单的 GoLang 应用
- 使用 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 的 YAML 格式和以下部分:
builddeployprofiles
这些部分定义了如何构建和部署应用,以及每个部署目标的配置文件。
如需详细了解 Skaffold 阶段的完整列表,请参阅 Skaffold 流水线阶段文档。
4. 构建
build 部分包含用于定义应用构建方式的配置。在本例中,您可以看到有关如何处理 git 标记的配置,以及定义构成应用的容器映像的 artifacts 部分。
此外,您还可以在本部分中看到用于构建映像的 Dockerfile 的引用。Skaffold 还支持其他构建工具,例如 Jib、Maven、Gradle、云原生 Buildpacks、Bazel 和自定义脚本。如需详细了解此配置,请参阅 Skaffold build 文档。
5. 部署
deploy 部分包含用于定义应用部署方式的配置。在这种情况下,您可以查看默认部署的示例,该示例配置了 Skaffold 以使用 Kustomize 工具。
Kustomize 工具通过将一组通用组件 YAML 文件(位于 base 目录下)与一个或多个通常对应于一个或多个部署目标(通常为 dev、test、staging 和 production 或类似目标)的“叠加层”相结合,提供生成 Kubernetes 清单的功能。
在此示例中,您可以看到三个目标(dev、staging 和 prod)的两个叠加层。dev 叠加层将在本地开发期间使用,而 staging 和 prod 叠加层将在使用 Skaffold 进行部署时使用。
6. 个人资料
profiles 部分包含用于为不同上下文定义构建、测试和部署配置的配置。不同的上下文通常是指应用部署流水线中的不同环境,例如本例中的 staging 或 prod。这意味着,您可以轻松管理内容需要因不同的目标环境而异的清单,而无需重复样板配置。
profiles 部分中的配置可以替换或修补主配置(例如 build、test 或 deploy 部分)中的任何项。
举例来说,打开文件 overlays > prod > deployment.yaml。请注意,此处已将应用的副本数配置为 3,从而替换了基本配置。
浏览应用源代码。
- 在 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 已从服务中移除,只剩下一个。
- 最后,在终端窗口中按
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