将多个k8s秘密组合到一个env变量中

met*_*bed 2 kubernetes kubernetes-helm

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

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: my-database-credentials
data:
  hostname: ...
  port: ...
  database: ...
  username: ...
  password: ...
Run Code Online (Sandbox Code Playgroud)

A Deployment需要以略有不同的格式注入这些值:

...

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
Run Code Online (Sandbox Code Playgroud)

DATABASE_URL需要的组成了hostnameport从以前定义的秘密“database`。

有什么办法可以做这个组合吗?

met*_*bed 6

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)

...
Run Code Online (Sandbox Code Playgroud)

请注意$(...)用于变量扩展的圆括号。