背景。
我们正在使用k8s 1.7。我们使用deployment.yml来维护/更新k8s集群状态。在deployment.yml中,pod的图像设置为${some_image}:latest
。创建部署后,只要代码合并到master中,pod的映像就会更新为${some_image}:${build_num}
。
现在发生的事情是,如果我们需要修改deployment.yml中限制的资源并重新应用它。部署映像也将更新为${some_image} :latest
。我们希望将图像保持在集群状态,而不在deployment.yml中维护实际标记。我们知道replcas可以在文件中省略,默认情况下它从集群状态获取值。
问题,
在1.7上,spec.template.spec.containers [0] .image是必需的。
${some_image}:latest
(--ignore-image-change
之类的参数,或deployment.yml中的特定字段)?如果是这样,怎么样?另外,我在1.10 documentation中看到图片是可选的。
---更新---
CI在每次合并到主服务器上构建和部署新映像。在部署时,CI运行命令kubectl set image deployment/app container=${some_image}:${build_num}
,其中${build_num}
是管道的内部版本号。
要应用deployment.yml,我们运行kubectl apply -f deployment.yml
答案 0 :(得分:0)
您是否知道repo.example.com/some-tag@sha256:...
syntax从docker注册表中提取图片?它几乎完全是为解决您描述的问题而设计的。
从评论更新:
你正在解决错误的问题;该文件仅用于将内容加载到集群中 - 从那一刻开始,元数据的权威副本就在集群中。 kubectl patch
命令可以是改变某些内容而不诉诸sed
(或更糟)的手术方式,但是不应该尝试在群集外部维护群集状态
答案 1 :(得分:0)
但是,在deployment.yml文件中,我们指定了图像的最新标记,因为无法使该字段保持最新
是否可以在不将映像更新到指定文件的情况下更新部署。如果是这样,怎么样?
答案 2 :(得分:0)
如果您不想在CI中的deployment.yaml中处理复杂语法,则可以选择使用模板处理器。例如mustache。它会稍微改变CI过程:
$ mustache env1.yml deployment.mustache > deployment.yaml
$ kubectl apply -f deployment.yaml
主要好处:
env1.yaml
始终包含最新的主构建映像,因此您使用正确的映像创建部署对象。env1.yaml
很容易在CI步骤中更新或生成。deployment.mustache
保持不变,并且您确定最终deployment.yaml
中可能发生的所有变化都是图像版本。还有许多其他模板渲染解决方案,以防胡子不适合你的CI。
答案 3 :(得分:0)
与上面的Const一样,我强烈建议不要在任何docker镜像中使用:latest
,而是使用CI / CD来解决版本问题。
我们在Jenkins X项目中遇到了同样的问题,我们有很多git存储库,当我们更改库或基础docker图像之类的东西时,我们需要更改pom.xml, package.json, Dockerfiles, helm charts
等许多版本。
我们使用一个名为UpdateBot的简单CLI工具,可以自动在所有下游存储库上生成Pull请求。我们倾向于将此视为库和基本图像的持续交付;)。例如这是current Pull Requests that UpdateBot has generated on the Jenkins X organisation repositories
然后我们将在发布新的基本映像时更新Dockerfiles / helm图表: https://github.com/jenkins-x/builder-base/blob/master/jx/scripts/release.sh#L28-L29