我如何自动化Kubernetes部署YAML而不依赖:最新?

我如何自动化Kubernetes部署YAML而不依赖:最新?,kubernetes,Kubernetes,我有一个带有Kubernetes部署YAML的存储库。管道在每次提交时运行,该提交生成一个映像并将其推送到我们的存储库中,并使用提交进行版本控制(例如,myu项目:bm4a83)。然后我正在更新部署映像 kubectl set image deployment/my_deployment my_deployment=my_project:bm4a83 这是可行的,但我还希望将部署YAML规范的其余部分保留在版本控制中 我想我可以把它保存在同一个存储库中,但这意味着我的更改可能只是基础结构(例如,

我有一个带有Kubernetes部署YAML的存储库。管道在每次提交时运行,该提交生成一个映像并将其推送到我们的存储库中,并使用提交进行版本控制(例如,
myu项目:bm4a83
)。然后我正在更新部署映像

kubectl set image deployment/my_deployment my_deployment=my_project:bm4a83

这是可行的,但我还希望将部署YAML规范的其余部分保留在版本控制中

我想我可以把它保存在同一个存储库中,但这意味着我的更改可能只是基础结构(例如,更改
副本
)会触发新的构建,而不会更改代码

感觉最有意义的是将部署YAML保存在一个完全独立的存储库中。我想我可以从那里管理所有的值,独立于实际的代码更改。唯一的问题是
图像
键需要保持最新。唯一的解决方法是使用一些浮动的
:最新的
类型的版本,但我认为这并不理想

管理这一点的合理工作流程是什么?我完全错过了什么吗

管理这一点的合理工作流程是什么?我完全错过了什么吗

一些答案取决于你在任何过程中试图降低的风险类型。如果是“集群被飓风摧毁,我需要恢复描述符”,那么这是一个很好的解决方案。如果风险更“以人为中心”,那么IMHO您将不得不在锁定所有东西和削弱kubernetes提供给团队的非常灵活、授权的工具之间走一条非常谨慎的路线。该模型在您的模型上运行的一个具体示例是:当开发人员编辑部署但不(记住|知道)更新repo中的描述符时会发生什么?那么您是否撤销了编辑权限?使用一些差异式逻辑来检测集群配置中的更改

具体来说:提交描述符更改只是为了调整
(部署|复制控制器|状态集)
的大小,这是一个极不理想的想法。另外,构建良好的CI管道还可以理解是否没有可构建工件发生更改和退出(如果CI工具如此智能,可以提前,甚至不触发构建)

最后,如果您确实想继续当前的情况,那么我能想到的最佳实践是在应用描述符之前进行文本替换:

$ grep "image: " the-deployment.yml
    image: example.com/something:#CI_PIPELINE_IID#
$ sed -i'' -e "s/#CI_PIPELINE_IID#/${CI_PIPELINE_IID}/" the-deployment.yml
$ kubectl apply -f the-deployment.yml
因此,repo中的副本在文本上保持原始状态,并且不会无意中实际应用,因为它实际上不会导致可运行的部署

但我还希望将部署YAML规范的其余部分保留在版本控制中

是的,你想这么做。将所有内容置于版本控制之下是实现不变基础架构的一个好做法

如果您希望部署具有单独的元数据(无论出于何种审核/更改跟踪原因),为什么不能利用Kubernetes
metadata

metadata:
  name: my_deployment
  commit: bm4a83

然后通过Jinja、Ruby ERBs、Go模板等注入此类信息。

我想我已经决定按照您的建议更新图像。我将保留所有扩展配置,并在单独的存储库中进行管理。我们的CI工具(目前使用Bitbucket管道)没有任何处理未更改工件的魔法。我把所有东西都保存在存储库中的迂腐作风,仅次于推出不必要的部署。谢谢