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 格式和以下部分:
build
deploy
profiles
这些部分定义应如何构建和部署应用,以及每个部署目标的配置文件。
如需详细了解 Skaffold 阶段的完整列表,请参阅 Skaffold 流水线阶段文档。
4. build
build
部分包含用于定义应用应如何构建的配置。在本例中,您可以看到有关如何处理 git
标记的配置,以及定义构成应用的容器映像的 artifacts
部分。
此外,您还可以在本部分中看到用于构建图片的 Dockerfile
的引用。Skaffold 还支持其他构建工具,例如 Jib
、Maven
、Gradle
、云原生 Buildpacks
、Bazel
和自定义脚本。如需详细了解此配置,请参阅 Skaffold Build 文档。
5. 部署
deploy
部分包含用于定义应用部署方式的配置。在本例中,您可以看到一个默认部署示例,该示例会将 Skaffold 配置为使用 Kustomize
工具。
Kustomize
工具提供了用于生成 Kubernetes 清单的功能,该功能通过将一组常见的组件 YAML 文件(位于 base
目录下)与一个或多个通常与一个或多个部署目标(通常是开发、测试、预演和生产或类似目标)对应的“叠加层”相结合来实现。
在此示例中,您可以看到三个目标(dev、staging 和 prod)的两个叠加层。本地开发期间将使用 dev 叠加层,而使用 Skaffold 部署时,系统将使用 staging 和 prod 叠加层。
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"
to:
"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