【问题标题】:Can an OpenShift template env variable be used in the name of a secretKeyRef?可以在 secretKeyRef 的名称中使用 OpenShift 模板环境变量吗?
【发布时间】:2021-03-09 20:39:29
【问题描述】:

我有一个模板和一个部署,我的部署的环境变量之一是来自一个秘密的值,其中包含刚刚使用该模板的命名空间的名称。 secret 必须包含命名空间的名称,我无法更改。

我知道可以使用环境变量作为不同环境变量的值。看起来像这样:

env:
  - name: MY_NAMESPACE
    valueFrom:
      fieldRef:
        apiVersion: v1
        fieldPath: metadata.namespace
  - name: FULL_NAME
    value: ${MY_NAME}.$(MY_NAMESPACE)

这样,如果我的命名空间的名称是 app 并且 MY_NAME 参数是 dan

echo $FULL_NAME
> dan.app

但我想使用该名称作为对秘密名称的引用。像这样:

env:
  - name: MY_NAMESPACE
    valueFrom:
      fieldRef:
        apiVersion: v1
        fieldPath: metadata.namespace
  - name: FULL_NAME_SECRET
    valueFrom:
      secretKeyRef:
        name: ${MY_NAME}.$(MY_NAMESPACE)
        key: app_name

我收到一个事件:

Pod“test-0”无效[spec.containers[0].env[1].valueFrom.secretKeyRef.name:无效值:“dan.$(MY_NAMESPACE)”:DNS-1123 子域必须包含小写字母数字字符,“-”或“.”,并且必须以字母数字字符开头

基本上它不会将 $(MY_NAMESPACE) 转换为其 env 变量的实际值。

【问题讨论】:

    标签: kubernetes openshift


    【解决方案1】:

    secretKeyRef: 秘密名称必须是固定字符串。变量扩展只发生在 pod 规范中的几个地方(在 env: 值、command:args: 中,但没有其他地方)。

    对于您的直接问题,识别 Pod 和任何匹配的 Secret 必须在同一个命名空间中可能会有所帮助。您不需要在 Secret 名称中包含命名空间名称,如果需要,也无法在不同的命名空间中引用 Secret。

    - name: FULL_NAME_SECRET
      valueFrom:
        secretKeyRef:
          name: dan       # always in the same namespace
          key: app_name
    

    更广泛地说,您可以使用Helm 之类的工具从模板中填写其中一些值。这些可以使用安装时已知的数据来构造可以提交给 Kubernetes 的“固定字符串”。

    {{/* In a Helm chart's templates/deployment.yaml */}}
    - name: FULL_NAME_SECRET
      valueFrom:
        secretKeyRef:
          name: {{ include "dan.name" . }}.{{ .Release.Namespace }}
          key: app_name
    

    这里花括号{{ ... }} 中的部分由Helm 的模板引擎扩展。 .Release.Namespace 是您要安装的命名空间。 include "dan.name" . 调用构造“dan”名称的帮助模板,以支持同一命名空间中的多个安装。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多