1

我正在使用 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)

提前致谢。

4

2 回答 2

1

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  .

然后发出 ahelm 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

看看它是否被正确解决。

于 2021-11-18T15:01:48.133 回答
1

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

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

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

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

于 2021-11-18T14:06:11.180 回答