Helm环境下跨Chart共享ConfigMap的三类技术问题咨询
在同命名空间Helm部署服务间共享ConfigMap的问题
背景信息
- 服务A、B处于同一Kubernetes命名空间
- 二者均通过Helm Chart部署
- 存在需要存入同一ConfigMap的公共配置项
- A、B各自拥有独立的私有配置,无需共享
已完成操作
- 在A、B所在命名空间创建了名为
ABCommons的Helm仓库 - 通过
ABCommons仓库部署了包含公共配置的ConfigMap(名称假设为ab-commons-config)
咨询问题
- 如何在服务A、B中引用并使用
ABCommons部署的ConfigMap? - 当
ABCommons的ConfigMap更新时,如何利用Helm的自动滚动部署特性重启分属不同仓库的A、B? - 如何将
ABCommons的ConfigMap与服务A的私有ConfigMap合并,供A使用?
问题解答
1. 引用共享ConfigMap的方法
在服务A、B的Helm Chart中,有两种常见方式引用已存在的ab-commons-config ConfigMap:
方式1:挂载为环境变量
直接导入整个ConfigMap的键值对作为环境变量:
containers: - name: service-a envFrom: - configMapRef: name: ab-commons-config
若只需导入部分键值对,使用env结合valueFrom:
containers: - name: service-a env: - name: COMMON_DB_URL valueFrom: configMapKeyRef: name: ab-commons-config key: db_url
方式2:挂载为配置文件
将共享ConfigMap挂载为容器内的配置文件目录:
containers: - name: service-a volumeMounts: - name: common-config-volume mountPath: /app/config/common volumes: - name: common-config-volume configMap: name: ab-commons-config
2. ConfigMap更新时触发A、B滚动重启
由于A、B与ABCommons分属不同Helm仓库,需通过注入ConfigMap哈希值到Deployment的注解/标签,让Helm检测变化触发滚动更新:
步骤1:在A、B的Chart中添加配置项
在values.yaml中定义共享ConfigMap的名称:
sharedConfig: name: ab-commons-config
步骤2:注入ConfigMap哈希到Deployment
在Deployment模板中,利用Kubernetes的lookup函数获取共享ConfigMap并计算哈希,添加到Pod模板的注解中:
apiVersion: apps/v1 kind: Deployment metadata: name: service-a spec: template: metadata: annotations: config.hash/ab-commons: {{ include "service-a.configHash" . }} # ... 容器配置内容
同时在Chart的_helpers.tpl中添加哈希计算模板:
{{- define "service-a.configHash" -}} {{- $config := lookup "v1" "ConfigMap" .Release.Namespace .Values.sharedConfig.name -}} {{- if $config -}} {{- $config.data | toYaml | sha256sum -}} {{- else -}} {{- "" -}} {{- end -}} {{- end -}}
当ab-commons-config更新时,哈希值会变化,执行helm upgrade时Helm会检测到Pod模板变化,自动触发A、B的滚动重启。
注意事项
- 确保Helm有权限读取目标命名空间的ConfigMap资源
- 可将哈希计算模板抽象为公共模板,在A、B的Chart中复用
3. 合并共享与私有ConfigMap
有两种实现方式:
方式1:同目录多Volume挂载
将共享ConfigMap和私有ConfigMap挂载到容器内的同一目录,Kubernetes会自动合并文件(同名文件则私有配置覆盖共享配置):
containers: - name: service-a volumeMounts: - name: common-config mountPath: /app/config - name: private-config mountPath: /app/config volumes: - name: common-config configMap: name: ab-commons-config - name: private-config configMap: name: service-a-private-config
方式2:Helm模板中合并生成新ConfigMap
在A的Chart中读取共享ConfigMap数据,与私有配置合并后生成新的ConfigMap:
apiVersion: v1 kind: ConfigMap metadata: name: service-a-combined-config data: {{- $sharedConfig := lookup "v1" "ConfigMap" .Release.Namespace .Values.sharedConfig.name }} {{- if $sharedConfig -}} {{- range $k, $v := $sharedConfig.data }} {{ $k }}: {{ $v | quote }} {{- end }} {{- end }} # 添加私有配置项 private_key_1: {{ .Values.privateConfig.key1 | quote }} private_key_2: {{ .Values.privateConfig.key2 | quote }}
之后在Deployment中挂载这个合并后的ConfigMap即可。此方式需确保Helm有权限读取共享ConfigMap,且共享配置更新后需执行helm upgrade来同步合并后的ConfigMap。
内容的提问来源于stack exchange,提问作者Emre Acar
相关产品推荐
相关产品推荐

