本文档介绍如何开始在 Cloud Deploy 中使用 Skaffold,其中包括以下内容:
- 配置 Skaffold 以与 Cloud Deploy 交付流水线搭配使用
- 将 Skaffold 和 Cloud Deploy 与第三方渲染工具(例如 Helm 和 Kustomize)搭配使用
- (可选)使用 Skaffold 进行本地开发
- (可选)使用 Skaffold 实现持续集成和持续部署 (CI/CD)
为何选择 Skaffold?
想知道 Cloud Deploy 使用 Skaffold 的原因以及为何需要管理 Skaffold 配置?请继续阅读。
我熟悉 CI/CD,但目前不使用 Skaffold
Skaffold 是一种开源命令行工具,可提高开发者的工作效率。它可编排持续开发、持续集成 (CI) 和持续交付 (CD)。
Skaffold 使用可插入架构提供声明性可移植配置,让您可以在渲染阶段使用不同的工具。
创建版本后,Cloud Deploy 会调用 Skaffold 以呈现您的清单。在部署时,Cloud Deploy 会再次调用 Skaffold 以应用这些清单,以将您的应用部署到进度中的每个目标。部署后,Skaffold 会执行健康检查,以监控目标运行时是否成功部署。
通过 Skaffold 实现持续开发
当您使用 Skaffold 持续开发时,系统会在您更改代码时构建和测试映像,并将其部署到集群(或 Minikube)。Cloud Code for VS Code 和 Cloud Code for IntelliJ IDE 扩展程序将 Skaffold 集成到 Visual Studio Code 和 JetBrains IDE 中,以进行持续开发。
通过 Skaffold 实现持续交付
您还可以使用 Skaffold 实现持续交付,其中包含构建、部署、渲染和应用步骤。Cloud Deploy 使用 Skaffold 的渲染和应用功能。如需使用 Cloud Deploy,您至少需要一个有效的 skaffold.yaml
配置文件。
通过 Skaffold,您还可以与第三方清单管理工具集成,例如 Helm 和 Kustomize。以这种方式使用 Skaffold 可让您使用这些工具的功能来呈现清单。kubectl
仍然是这些清单的deployer。
我刚开始接触 Kubernetes
借助 Skaffold,您可以为所有部署配置一组基本的清单。然后,您可以通过 Cloud Deploy 使用 Skaffold 的渲染引擎,通过其中一个基本清单渲染和部署每个部署特定清单。
详细了解如何管理清单,包括将 Skaffold 和 Cloud Deploy 与常用清单模板工具(如 Helm 和 Kustomize)搭配使用的示例。
为了使 Cloud Deploy 正常运行,需要具备哪些条件?
如需使用基本的 Cloud Deploy 交付流水线,skaffold.yaml
配置文件至少需要具有以下配置:
所有
skaffold.yaml
配置都需要的标头信息:apiVersion: skaffold/v4beta7 kind: Config
适用于 GKE、GKE Enterprise 或 Cloud Run 的
manifests
节,其中会列出所有原始 Kubernetes 清单(除非您使用 Helm 或 Kustomize 等清单管理工具)。下面是一个使用原始 Kubernetes 清单的示例:
manifests: rawYaml: - deployment.yaml
如果您打算使用 Helm 或 Kustomize 等渲染程序来呈现清单,请参阅向 skaffold.yaml 添加 Helm 支持和向 skaffold.yaml 添加 Kustomize 支持,以了解如何配置 Skaffold 以使用这些工具。
如需查看 Helm 和 Kustomize 示例,请参阅管理清单
deploy
节,包含deploy.kubectl
(用于部署到 GKE 或 GKE Enterprise)或deploy.cloudrun
(用于部署到 Cloud Run)。对于 GKE 和 GKE Enterprise 目标:
deploy: kubectl: {}
部署节会部署清单节中提供的应用清单。
对于 Cloud Run 目标:
deploy: cloudrun: {}
部署节会部署清单节中提供的应用清单。
如果您使用的是自定义目标,则 skaffold.yaml
必须包含标头(apiVersion
和 kind:
),以及自定义目标类型尚未引用远程 Skaffold 配置时自定义目标将使用的自定义操作。
创建 skaffold.yaml
文件
Cloud Deploy 使用 Skaffold 渲染和部署应用。
对于每个版本,您都需要提供至少一个 skaffold.yaml
文件,用于标识要使用的清单。如需了解此文件需要包含哪些内容的指导,请参阅上一部分。
让 Cloud Deploy 生成您的 skaffold.yaml
如果您没有 skaffold.yaml
文件,但有一个 Kubernetes 清单或 Cloud Run 服务定义文件,则 Cloud Deploy 可以为您生成 skaffold.yaml
文件。
发布完成后,您可以在 Cloud Storage 源暂存目录中找到生成的 Skaffold 文件。
以下命令包含 --from-k8s-manifest
标志,用于传递 Kubernetes 清单。Cloud Deploy 使用清单中的信息生成 skaffold.yaml
,然后将其用于版本。
gcloud deploy releases create RELEASE_NAME --delivery-pipeline=PIPELINE_NAME --from-k8s-manifest=MANIFEST --region=REGION
如需从 Cloud Run 服务 YAML 生成 skaffold.yaml
,请使用同一命令,但要用 --from-run-manifest
而不是 --from-k8s-manifest
将其中任一标志与 --skaffold-file
标志或 --source
标志结合使用都会引发错误。
使用生成的 skaffold.yaml
文件
生成的 skaffold.yaml
适用于新手入门、学习和演示 Cloud Deploy。熟悉 Cloud Deploy 后,对于生产工作负载,您可能需要 Skaffold 配置(使用 Skaffold 配置文件区分不同的目标)。
使用生成的 skaffold.yaml
文件作为基础来创建您自己的差异化 Skaffold 配置时,请确保在渲染来源归档文件(而不是渲染文件)中使用该文件。您可以从 **版本详情 **页面上的工件标签页下载渲染来源。
生成的
skaffold.yaml
包含在存储在 Cloud Storage 存储桶中的渲染源中。如需查看此文件,您可以下载
.tar.gz
文件并将其解压缩。渲染的
skaffold.yaml
可在 Target 工件中找到。在目标工件部分中,点击查看工件。
使用 Skaffold 进行本地开发
Skaffold 的优势之一在于,您可以使用它进行本地开发和 CI/CD。在 dev
模式下,Skaffold 会监控源文件,并在检测到更改时,Skaffold 会重新构建映像、重新测试,以及将容器重新部署到本地机器上的 minikube 集群等位置。
以这种方式使用 Skaffold 时,您可以在本地使用与远程部署相同的命令。
如果您使用 Skaffold 进行本地开发,则可以为目标定义单独的 Skaffold 配置文件,并为本地开发定义一个默认部署节。
当您停止 dev
模式时,Skaffold 会从集群中清理已部署的工件。
使用 Skaffold 实现 CI/CD
除了使用 Skaffold 进行持续本地构建和部署之外,您还可以使用 Skaffold 实现 CI/CD。通过使用 Cloud Build 等 CI 工具和 Artifact Registry 等映像注册表构建的容器映像,Cloud Deploy 使用 Skaffold 中的 CI/CD 功能来渲染和应用清单,并将应用部署到指定的目标。
渲染、部署和应用
Skaffold 会将清单呈现过程与部署分开。
Cloud Deploy 调用 skaffold render
来渲染清单,调用 skaffold apply
以将其应用到目标。
通过将渲染与应用区分开来,您可以在配置中捕获应用的完整声明状态,以便可以安全、可重复地应用状态(例如,针对回滚)。这种方法还可以简化审批过程。由于系统会在首次发布之前为所有目标呈现清单,因此您可以看到将应用于每个目标的已渲染 YAML。
Cloud Deploy 不支持使用其他部署者部署您的应用。不过,您可以使用 Helm 或 Kustomize 等工具进行渲染。
如需详细了解 Cloud Deploy 如何使用 kubectl
作为部署者进行部署,请参阅 Cloud Deploy 服务架构。
Skaffold 配置文件简介
您可以创建单独的 Skaffold 配置文件(在 skaffold.yaml
的 profiles:
节中标识)。
将 Skaffold 配置文件与 Cloud Deploy 搭配使用时,您可以为所有或部分目标创建单独的配置文件。例如,dev
、staging
和 prod
的不同配置文件。
要在 Cloud Deploy 中使用 Skaffold 并非必需,配置文件对于在目标中定义清单自定义很有用,例如为每个目标使用不同的 Kustomize kustomization.yaml
文件。
为您的skaffold.yaml
添加 Kustomize 支持
如需将 Kustomize 配置与 Cloud Deploy/Skaffold 配置集成,您需要具备以下各项:
在您的配置文件中添加一个
kustomization.yaml
文件。您可以将配置文件存储在本地目录或 Cloud Storage 存储桶中。
在
skaffold.yaml
文件中,为每个配置文件创建一个deploy
节。如果您未使用配置文件或用于未与配置文件关联的默认部署配置,则还可以在任何已定义的配置文件之外添加
deploy
节。以下是 Skaffold 配置示例,每个配置文件显示
deploy
节,并使用一个名为my-app
的虚构示例应用:apiVersion: skaffold/v4beta7 kind: Config build: artifacts: - image: my-app-web-profiles context: my-app-web-profiles - image: my-app-application-profiles context: my-app-application-profiles googleCloudBuild: projectId: ${PROJECT_ID} profiles: - name: local manifests: kustomize: paths: - my-app-application-profiles/kubernetes/local - name: test manifests: kustomize: paths: - my-app-application-profiles/kubernetes/test - name: staging manifests: kustomize: paths: - my-app-application-profiles/kubernetes/staging - name: prod manifests: kustomize: paths: - my-app-application-profiles/kubernetes/prod deploy: kubectl: {}
此处显示的 Skaffold 配置具有针对
test
、staging
和prod
目标的单独配置文件。它还显示了用于本地开发的配置文件。每个配置文件中都有一个deploy.kustomize
节,其中的路径指向要用于该目标的 kustomization 位置。
向 skaffold.yaml
添加 Helm 支持
您可以使用 Helm 呈现清单。Cloud Deploy 不使用 Helm 部署应用,并且仅支持 kubectl
作为部署者。
如需使用 Helm,您需要存储在 skaffold.yaml
中可引用的任何位置的 Helm 图表。此位置可以位于文件系统、代码库中(可能与您的 skaffold.yaml
一起)或开放容器计划 (OCI) 代码库中。
如需使用 Helm 图表,请将 helm
节添加到 skaffold.yaml
文件中。
apiVersion: skaffold/v4beta7
kind: Config
build:
artifacts:
- image: skaffold-helm-image
manifests:
helm:
releases:
- name: skaffold-helm-image
chartPath: charts
deploy:
kubectl: {}
skaffold.yaml
参考文档展示了此 helm
节需要的内容。
不支持的 Skaffold 功能
Skaffold 的以下功能无法在 Cloud Deploy 中使用:
-
不支持使用
--module=
为build
、render
、apply
等选择特定模块。支持静态模块。 在 Helm 中,创建命名空间(如果命名空间不存在)。
后续步骤
访问 Skaffold 网站,了解其工作原理以及用途。
通过 Kustomize 和 Skaffold 配置文件使用 Cloud Deploy 进行练习。
了解 Cloud Deploy 如何选择要使用的 Skaffold 版本、Skaffold 版本何时发生更改,以及如何确定正在使用的版本。
了解如何将 Skaffold 配置文件与 Helm、Kustomize 和 kpt 等高级清单管理工具搭配使用。