【问题标题】:Helm concatenate secretKeyRef into one env varHelm 将 secretKeyRef 连接到一个环境变量中
【发布时间】:2021-12-29 07:04:21
【问题描述】:

我正在使用 helm 3,并希望将 3 个 secretRefKeys 连接成一个 Env Var 值。

这是我的 cronjob.yaml 文件:

apiVersion: batch/v1
kind: CronJob 
metadata:
  name: my-cronjob
spec:
  schedule: {{ .Values.cron }}
  jobTemplate:
    spec:
      template:
        spec:
          initContainers:
                - 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:
           .
           .
           .
           .
           .

我希望URL_FULL 的值是prefix env suffix 的实际值。

但是我用helm template 命令得到的实际上是我在值中写的:

            - name: URL_FULL
              value: $(PREFIX)$(ENV)$(SUFFIX)

提前致谢。

【问题讨论】:

    标签: kubernetes kubernetes-helm helm3


    【解决方案1】:

    没错;当您将 pod 规范提交给 Kubernetes API 时,它将包含包含 $(...) 引用的文字字符串(以及 secretRef: 块而不是秘密的值)。

    当 Kubernetes 创建 Pod 并启动容器时,集群本身将填充所有环境变量并进行字符串连接。如果这是一个部署,您可以通过运行来验证这一点

    kubectl exec deployment/my-deployment -it -- \
      sh -c 'echo $URL_FULL'
    

    (在 Job 或 CronJob 中,您可能必须检测服务本身才能看到这一点。)

    【讨论】:

    • 谢谢。你可以参考我下面的评论吗?看起来URL_FULL 仍在使用值的字符串,而不是其他环境变量的值。
    【解决方案2】:

    helm template 不会解析那些环境变量,它只会渲染模板,正如文档所述。

    您将需要部署图表。我做了一个简单的例子:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
    
      volumes:
        - name: shared-volume
          emptyDir: {}
      initContainers:
        - name: busybox
          image: busybox
          volumeMounts:
            - name: shared-volume
              mountPath: /nginx-data
          command: ["/bin/sh"]
          # sleep so that we could exec into it
          args: ["-c", "sleep 6000"]
    
          env:
            - name: PROP_ONE
              valueFrom:
                secretKeyRef:
                  key: one
                  name: secret-sample
            - name: PROP_TWO
              valueFrom:
                secretKeyRef:
                  key: two
                  name: secret-sample
            - name: PROP_THREE
              value: $(PROP_ONE)
      containers:
        - name: nginx
          image: nginx
          volumeMounts:
            - name: shared-volume
              mountPath: /usr/share/nginx/html
    

    然后您可以发出:

    helm install foo  .
    

    然后发出helm ls 以查看它是否在集群中。

    即使你现在做一个:

    kubectl describe pod nginx | grep PROP_THREE
    

    你会看到引用是:

    PROP_THREE:  $(PROP_ONE)
    

    如果你真的想看到那个环境变量,你将不得不执行到容器中(我不知道另一种方式):

    kubectl exec -it nginx -c busybox -- /bin/sh
    

    然后:

       env | grep PROP_THREE
       PROP_THREE=bar
    

    查看是否正确解析。

    【讨论】:

    • 谢谢。我明白这一点,我部署了 cronjob。按照您描述的方式(exec 然后 env | grep),我能够看到 PREFIX、ENV 和 SUFFIX 的实际值。但是,URL_FULL 仍显示为 $(PREFIX)$(ENV)$(SUFFIX)。
    猜你喜欢
    • 2022-08-17
    • 2020-02-25
    • 1970-01-01
    • 2021-04-06
    • 2020-10-20
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多