使用 kubectl roll outs 更新我的图像,但还需要将我的部署对象保留在版本控制中
Using kubectl roll outs to update my images, but need to also keep my deployment object in version control
在我的 CICD 中,我是:
正在生成带有唯一标签的新图像。 foo:dev-1339 并将其推送到我的图片库 (ECR)。
然后我使用滚动更新来更新我的部署。
kubectl rolling-update frontend --image=foo:dev-1339
但是我这里有冲突。
如果我还需要更新存储在 deployment.yaml 文件中的部署对象的某些部分怎么办?让我们说加强健康检查或添加参数?
然后,当我重新 apply
我的部署对象作为一个整体时,它不会与当前副本集同步,标签将被还原,我将丢失集群中存在的图像更新.
如何避免这种竞争情况?
很遗憾,没有解决方案,无论是从命令行还是通过 yaml 文件
根据 doc here, "...a Deployment is a higher-level controller that automates rolling updates of applications declaratively, and therefore is recommended" over the use of Replication Controllers and kubectl rolling-update
. Updating Deployment 的映像将触发 Deployment 的推出。
一种方法可能是在源代码库中的版本控制下更新部署配置 yaml(或 json),并apply
将更改的部署配置从版本控制更新到集群。
命令式与声明式工作流
有两种使用 kubectl
将更改应用到集群的基本方法。 命令式[=37=] 方式,当您执行 命令时 是实验和开发环境的好方法。 kubectl rolling-updated
是 命令式命令 的一个例子。参见 Managing Kubernetes using Imperative Commands。
对于生产环境,建议使用 声明式 工作流程,通过编辑清单文件,将它们存储在 Git 存储库中。当您 commit 或 merge 时自动启动 CICD 工作。 kubectl apply -f <file>
或更有趣的 kubectl apply -k <file>
是此工作流程的一个示例。参见 Declarative Management using Config files or more interesting Declarative Management using Kustomize
用于构建映像和部署的 CICD
从源代码(包括容器映像)构建工件 可以在 CICD 管道中完成。 管理应用程序配置并将其应用 到 Kubernetes 集群也可以在 CICD 管道中完成。您可能希望将其全部自动化,例如用于执行 Continuous Deployment 并将两个管道合并为一个长管道。这是一个更复杂的设置,没有关于如何操作的单一答案。构建部件完成后,它可能会触发更新 app 配置存储库 中的 image 字段以触发配置管道。
此处的典型解决方案是使用模板层,例如 Helm or Kustomize。
在 Helm 中,您可以将 Kubernetes YAML 规范保存在一个名为 chart 的目录结构中,但可以使用可选的模板。您可以指定
image: myname/myapp:{{ .Values.tag | default "latest" }}
然后使用
部署图表
helm install myapp --name myapp --set tag=20191211.01
Helm 跟踪这些值(在集群中的 Secret 对象中),因此它们不会在源代码管理中被跟踪。您可以签入带有设置的 YAML 格式文件,然后使用 helm install -f
来引用该文件。
在 Kustomize 中,您的 CI 工具需要为每个部署设置创建一个 kustomize.yaml
文件,但随后可以 set
images:
- name: myname/myapp
newTag: 20191211.01
如果您信任 CI 工具提交到源代码管理,那么它可以将此修改后的文件作为其部署序列的一部分检入。
在我的 CICD 中,我是:
正在生成带有唯一标签的新图像。 foo:dev-1339 并将其推送到我的图片库 (ECR)。 然后我使用滚动更新来更新我的部署。
kubectl rolling-update frontend --image=foo:dev-1339
但是我这里有冲突。
如果我还需要更新存储在 deployment.yaml 文件中的部署对象的某些部分怎么办?让我们说加强健康检查或添加参数?
然后,当我重新 apply
我的部署对象作为一个整体时,它不会与当前副本集同步,标签将被还原,我将丢失集群中存在的图像更新.
如何避免这种竞争情况?
很遗憾,没有解决方案,无论是从命令行还是通过 yaml 文件
根据 doc here, "...a Deployment is a higher-level controller that automates rolling updates of applications declaratively, and therefore is recommended" over the use of Replication Controllers and kubectl rolling-update
. Updating Deployment 的映像将触发 Deployment 的推出。
一种方法可能是在源代码库中的版本控制下更新部署配置 yaml(或 json),并apply
将更改的部署配置从版本控制更新到集群。
命令式与声明式工作流
有两种使用 kubectl
将更改应用到集群的基本方法。 命令式[=37=] 方式,当您执行 命令时 是实验和开发环境的好方法。 kubectl rolling-updated
是 命令式命令 的一个例子。参见 Managing Kubernetes using Imperative Commands。
对于生产环境,建议使用 声明式 工作流程,通过编辑清单文件,将它们存储在 Git 存储库中。当您 commit 或 merge 时自动启动 CICD 工作。 kubectl apply -f <file>
或更有趣的 kubectl apply -k <file>
是此工作流程的一个示例。参见 Declarative Management using Config files or more interesting Declarative Management using Kustomize
用于构建映像和部署的 CICD
从源代码(包括容器映像)构建工件 可以在 CICD 管道中完成。 管理应用程序配置并将其应用 到 Kubernetes 集群也可以在 CICD 管道中完成。您可能希望将其全部自动化,例如用于执行 Continuous Deployment 并将两个管道合并为一个长管道。这是一个更复杂的设置,没有关于如何操作的单一答案。构建部件完成后,它可能会触发更新 app 配置存储库 中的 image 字段以触发配置管道。
此处的典型解决方案是使用模板层,例如 Helm or Kustomize。
在 Helm 中,您可以将 Kubernetes YAML 规范保存在一个名为 chart 的目录结构中,但可以使用可选的模板。您可以指定
image: myname/myapp:{{ .Values.tag | default "latest" }}
然后使用
部署图表helm install myapp --name myapp --set tag=20191211.01
Helm 跟踪这些值(在集群中的 Secret 对象中),因此它们不会在源代码管理中被跟踪。您可以签入带有设置的 YAML 格式文件,然后使用 helm install -f
来引用该文件。
在 Kustomize 中,您的 CI 工具需要为每个部署设置创建一个 kustomize.yaml
文件,但随后可以 set
images:
- name: myname/myapp
newTag: 20191211.01
如果您信任 CI 工具提交到源代码管理,那么它可以将此修改后的文件作为其部署序列的一部分检入。