Helm如何将生成的CA证书统一传递给所有子Chart?
如何在Helm中仅生成一次CA并让所有子Chart复用
核心问题分析
你之前的尝试失败,根源在于试图修改只读的.Values.global来存储CA内容——Helm中.Values是从配置文件传入的只读参数,模板内对它的赋值仅在当前模板上下文生效,无法跨Chart传递。子Chart各自渲染时,.Values.global始终为空,因此每个子Chart都会重新调用genCA生成独立的CA。
正确实现步骤
1. 主Chart中生成全局CA并存储到根上下文
在主Chart的templates/_helpers.tpl中定义一个模板,通过$root(Helm全局根上下文)存储CA,确保仅生成一次:
{{- define "main.get-ca" -}} {{- /* 检查根上下文是否已存在CA,不存在则生成 */ -}} {{- if not $root.ca -}} {{- $ca := genCA "cluster-ca" 365 -}} {{/* 自定义CA名称和有效期 */}} {{- $_ := set $root "ca" $ca -}} {{/* 将CA存入全局根上下文 */}} {{- end -}} {{- /* 返回已生成的CA */ -}} {{- $root.ca -}} {{- end -}}
然后在主Chart的templates/ca-secret.yaml中创建存储CA的Secret:
apiVersion: v1 kind: Secret metadata: name: {{ include "main.fullname" . }}-ca labels: {{- include "main.labels" . | nindent 4 }} type: kubernetes.io/tls data: tls.crt: {{ (include "main.get-ca" .).Cert | b64enc }} tls.key: {{ (include "main.get-ca" .).Key | b64enc }}
2. 子Chart中复用主Chart的全局CA
在子Chart的templates/_helpers.tpl中定义模板,直接从$root上下文获取主Chart生成的CA:
{{- define "subchart.get-global-ca" -}} {{- /* 调用主Chart的CA模板,确保CA已生成 */ -}} {{- include "main.get-ca" $root -}} {{- end -}} {{- define "subchart.gen-service-cert" -}} {{- /* 获取全局CA */ -}} {{- $ca := include "subchart.get-global-ca" . | fromYaml -}} {{- /* 用全局CA签名服务证书,可自定义服务名称、IP、域名等 */ -}} {{- $cert := genSignedCert (include "subchart.fullname" .) nil (list (include "subchart.fullname" .) (include "subchart.fullname" .) + ".default.svc.cluster.local") 365 $ca -}} {{- toYaml $cert -}} {{- end -}}
最后在子Chart的templates/service-tls-secret.yaml中创建服务证书Secret:
apiVersion: v1 kind: Secret metadata: name: {{ include "subchart.fullname" . }}-tls labels: {{- include "subchart.labels" . | nindent 4 }} type: kubernetes.io/tls data: tls.crt: {{ (include "subchart.gen-service-cert" .).Cert | b64enc }} tls.key: {{ (include "subchart.gen-service-cert" .).Key | b64enc }} ca.crt: {{ (include "subchart.get-global-ca" .).Cert | b64enc }}
关键原理
$root是Helm模板的全局根上下文,所有主Chart和子Chart都能访问,存储在其中的ca变量会在整个渲染过程中保持唯一。- 首次调用
main.get-ca时生成CA并存入$root.ca,后续所有调用(包括子Chart)都会直接返回已生成的CA,确保genCA仅执行一次。 - 避免修改
.Values,改用全局上下文存储动态生成的内容,解决跨Chart变量传递问题。
内容的提问来源于stack exchange,提问作者nat
相关产品推荐
相关产品推荐

