You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 17:35:18