Helm3如何将多个secretKeyRef取值拼接为单个环境变量值
问题原因及解决方法
1. 先修复YAML语法错误
你当前的配置存在层级错误:环境变量需要定义在容器的env字段下,不能直接作为initContainers的子项,正确的结构示例如下:
apiVersion: batch/v1 kind: CronJob metadata: name: my-cronjob spec: schedule: {{ .Values.cron }} jobTemplate: spec: template: spec: initContainers: - name: your-init-container-name # 补全实际使用的初始化容器名称 image: your-image # 补全初始化容器使用的镜像 env: # 环境变量必须定义在容器的env字段层级下 - name: PREFIX valueFrom: secretKeyRef: name: {{ .Values.secretName }} key: prefix - name: ENV valueFrom: secretKeyRef: name: {{ .Values.secretName }} key: env - name: SUFFIX valueFrom: secretKeyRef: name: {{ .Values.secretName }} key: suffix - name: URL_FULL value: $(PREFIX)$(ENV)$(SUFFIX) containers: # 后续业务容器配置...
2. 变量替换的时机说明
Kubernetes 原生支持$(VAR_NAME)格式的环境变量插值,这个操作是集群层面的kubelet在启动容器时执行的,并非Helm渲染阶段执行,所以你执行helm template看到输出的URL_FULL是字面量$(PREFIX)$(ENV)$(SUFFIX)是完全正常的,将渲染后的 manifest 部署到Kubernetes集群后,容器启动时会自动完成拼接,得到你预期的完整值。
3. 若需要Helm渲染阶段完成拼接的方案
如果你确实需要在Helm模板渲染阶段就拿到拼接后的值,可以用Helm的lookup函数读取集群中已存在的Secret,再进行字符串拼接,示例如下:
{{- $secret := lookup "v1" "Secret" .Release.Namespace .Values.secretName }} {{- $prefix := $secret.data.prefix | b64dec }} {{- $env := $secret.data.env | b64dec }} {{- $suffix := $secret.data.suffix | b64dec }} # 直接使用拼接后的值 - name: URL_FULL value: {{ printf "%s%s%s" $prefix $env $suffix | quote }}
注意:该方案仅在执行helm install/helm upgrade时生效,因为helm template默认不会访问Kubernetes集群,lookup函数会返回空值。
内容的提问来源于stack exchange,提问作者jrz
相关产品推荐
相关产品推荐

