首页 > 解决方案 > 将多个 k8s 机密组合到一个环境变量中

问题描述

我的 k8s 命名空间包含一个Secret在部署时创建的 (by svcat),因此这些值是事先不知道的。

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: my-database-credentials
data:
  hostname: ...
  port: ...
  database: ...
  username: ...
  password: ...

ADeployment需要以稍微不同的格式注入这些值:

...

containers:
  env:
  - name: DATABASE_URL
    valueFrom:
      secretKeyRef:
        name: my-database-credentials
        key: jdbc:postgresql:<hostname>:<port>/<database> // ??

  - name: DATABASE_USERNAME
    valueFrom:
      secretKeyRef:
        name: my-database-credentials
        key: username

  - name: DATABASE_PASSWORD
    valueFrom:
      secretKeyRef:
        name: my-database-credentials
        key: password

DATABASE_URL需要由先前定义的秘密中的hostnameport数据库”组成。

有没有办法做这个组合?

标签: kuberneteskubernetes-helm

解决方案


Kubernetes 允许您将先前定义的环境变量用作配置中其他地方的后续环境变量的一部分。来自Kubernetes API 参考文档

变量引用 $(VAR_NAME) 使用容器中先前定义的环境变量和任何服务环境变量进行扩展。

因此,您可以首先将所需的秘密值提取到环境变量中,然后DATABASE_URL与这些变量组合。

...

containers:
  env:
  - name: DB_URL_HOSTNAME               // part 1
    valueFrom:
      secretKeyRef:
        name: my-database-credentials
        key: hostname

  - name: DB_URL_PORT                   // part 2
    valueFrom:
      secretKeyRef:
        name: my-database-credentials
        key: port

  - name: DB_URL_DBNAME                 // part 3
    valueFrom:
      secretKeyRef:
        name: my-database-credentials
        key: database

  - name: DATABASE_URL                  // combine
    value: jdbc:postgresql:$(DB_URL_HOSTNAME):$(DB_URL_PORT)/$(DB_URL_DBNAME)

...

请注意$(...)用于变量扩展的圆括号 - 它是Kubernetes因变量表示法


推荐阅读