同YAML文件内Deployment如何引用ConfigMap配置checksum注解
答案
不能直接实现,原因和可行方案如下:
- 你代码里写的
{{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}是Helm模板语法,该语法的引用维度是独立的模板文件,不是同一个YAML内用---分隔的资源块。这个语句的逻辑是加载当前模板目录下名为configmap.yaml的独立文件内容计算哈希,根本不会识别同文件里写的ConfigMap块。 - 原生Kubernetes本身没有同清单文件内跨资源块引用的能力:用
---分隔的多个资源在提交时会被拆成独立对象逐个发送给API Server处理,对象之间没有绑定关系,不存在“同文件资源互访”的内置逻辑。
可落地的实现方式
- 标准Helm实践:把ConfigMap拆分到同目录下独立的
configmap.yaml文件,Deployment单独放在deployment.yaml,你原来写的checksum注解就可以正常工作——ConfigMap内容变更时哈希值自动变化,触发Deployment滚动更新,这也是生产环境最常用的写法。 - 单文件Helm写法:如果一定要把三个资源放在同一个文件里,可以先把ConfigMap内容定义为Helm具名模板,分别在ConfigMap资源声明、checksum注解处引用这个模板,示例:
{{- define "app.config" -}} # 此处填写ConfigMap完整配置 apiVersion: v1 kind: ConfigMap data: test.conf: | key=value {...} {{- end -}} --- apiVersion: apps/v1 kind: Deployment spec: template: metadata: annotations: checksum/config: {{ include "app.config" . | sha256sum }} {...} --- apiVersion: v1 kind: Service {...} --- {{ include "app.config" . }}
- Kustomize方案:如果不用Helm,可以用Kustomize内置的
configMapGenerator,它会自动为ConfigMap生成带内容哈希的名称,自动同步到Deployment的引用配置,ConfigMap变更时会自动触发Pod滚动更新,不需要手动维护checksum注解。
内容的提问来源于stack exchange,提问作者mbxzxz
相关产品推荐
相关产品推荐

