了解 Skaffold

1. 目标

Skaffold 是一款工具,用于处理应用的构建、推送和部署工作流。您可以使用 Skaffold 轻松配置本地开发工作区,简化内部开发循环,并集成 KustomizeHelm 等其他工具,以帮助管理您的 Kubernetes 清单。

在本教程中,您将了解 Skaffold 的一些核心概念,使用该 Skaffold 自动执行内部开发循环,然后部署一个应用。

您将学习以下内容:

  • 配置并启用 Skaffold 用于本地开发
  • 构建并运行简单的 golang 应用
  • 使用 Skaffold 管理本地应用部署
  • 渲染清单并部署您的应用

2. 开始前须知

准备工作区

  1. 访问以下网址,打开 Cloud Shell 编辑器:
https://shell.cloud.google.com

允许第三方 Cookie。点击“网站无法访问”和“允许 Cookie”

7b702066a2135a3d

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 阶段的完整列表,请参阅 Skaffold 流水线阶段文档

4. 构建

build 部分包含定义应如何构建应用的配置。在本例中,您可以看到有关如何处理 git 标记的配置,以及定义构成应用的容器映像的 artifacts 部分。

除此之外,在本部分中,您还可以看到对用于构建映像的 Dockerfile 的引用。Skaffold 还支持其他构建工具,例如 JibMavenGradle、云原生 BuildpacksBazel 和自定义脚本。如需详细了解此配置,请参阅 Skaffold Build 文档

5. 部署

deploy 部分包含用于定义应如何部署应用的配置。在本例中,您可以看到将 Skaffold 配置为使用 Kustomize 工具的默认部署示例。

Kustomize 工具通过将一组常见的组件 YAML 文件(位于 base 目录下)与一个或多个“叠加层”相结合,来提供用于生成 Kubernetes 清单的功能。通常对应于一个或多个部署目标:通常是 devteststagingproduction 或类似部署目标。

在此示例中,您可以看到三个目标(devstagingprod)的两个叠加层。dev 叠加层将在本地开发期间使用,stagingprod 叠加层则用于使用 Skaffold 进行部署。

6. 个人资料

profiles 部分包含用于为不同上下文定义构建、测试和部署配置的配置。不同的上下文通常是应用部署流水线中的不同环境,例如本例中的 stagingprod。这意味着您可以轻松管理内容需要针对不同目标环境不同的清单,而无需重复样板配置。

profiles 部分中的配置可以替换或修补主配置(例如 buildtestdeploy 部分)中的任何项。

例如,打开文件 overlays > prod > deployment.yaml。请注意,应用的副本数量在此处配置为 3,覆盖了基本配置。

  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"

to:

"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 已从 Service 中移除,因此只剩一个 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

您应该会看到输出内容,其中包含类似于以下内容的行,其中显示了 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