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

Kubernetes 将多个k8s秘密组合到一个env变量中,kubernetes,kubernetes-helm,Kubernetes,Kubernetes Helm,我的k8s命名空间包含一个在部署时创建的Secret(通过svcat),因此这些值事先不知道 apiVersion: v1 kind: Secret type: Opaque metadata: name: my-database-credentials data: hostname: ... port: ... database: ... username: ... password: ... 部署需要以稍微不同的格式注入这些值: ... containers:

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

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: my-database-credentials
data:
  hostname: ...
  port: ...
  database: ...
  username: ...
  password: ...
部署
需要以稍微不同的格式注入这些值:

...

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
。。。
容器:
环境:
-名称:数据库地址
价值来源:
secretKeyRef:
名称:我的数据库凭据
关键字:jdbc:postgresql::/??
-名称:数据库\用户名
价值来源:
secretKeyRef:
名称:我的数据库凭据
关键字:用户名
-名称:数据库密码
价值来源:
secretKeyRef:
名称:我的数据库凭据
密钥:密码
数据库的URL
需要由
主机名
端口
,“数据库”组成,这些数据来自先前定义的机密


有没有办法写这篇作文

有几种方法可供选择(按复杂性增加的顺序):

  • 在将参数放入机密文件之前,请先对其进行修改(扩展用于在其中插入信息的内容)

  • 将脚本添加到Pod/容器中,以将传入参数(环境变量或命令参数)转换为所需的参数。如果您不能或不想拥有自己的容器映像,可以将额外脚本作为卷添加到容器中,然后

  • 在Kubernetes中添加一个工具,在“幕后”进行自动损坏:您可以添加一个来进行损坏,或者您可以创建一个并添加一个(CRD会告诉操作员哪些机密需要监视更改,操作员会读取值并生成您想要的任何其他条目)


  • 你可以做一些我能想到的事情:

  • 使用并创建一个从卷中读取机密的启动脚本,然后使用
    数据库URL
    环境变量启动应用程序

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
      - name: mypod
        image: your_db_container
        command: [ "yourscript.sh" ]
        volumeMounts:
        - name: mycreds
          mountPath: "/etc/credentials"
      volumes:
      - name: mycreds
        secret:
          secretName: my-database-credentials
          defaultMode: 256
    
  • 在容器规范的
    命令
    键中传递env变量:

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
      - name: mypod
        image: your_db_container
        command: [ "/bin/sh", "-c", "DATABASE_URL=jdbc:postgresql:<hostname>:<port>/<database>/$(DATABASE_USERNAME):$(DATABASE_PASSWORD) /start/yourdb" ]
    
        env:
        - name: DATABASE_USERNAME
          valueFrom:
            secretKeyRef:
              name: my-database-credentials
              key: username
        - name: DATABASE_PASSWORD
          valueFrom:
            secretKeyRef:
            name: my-database-credentials
            key: password
    
    apiVersion:v1 种类:豆荚 元数据: 姓名:mypod 规格: 容器: -姓名:mypod 图:您的_db_容器 命令:[“/bin/sh”、“-c”、“DATABASE\u URL=jdbc:postgresql:://$(DATABASE\u USERNAME):$(DATABASE\u PASSWORD)/start/yourdb”] 环境: -名称:数据库\用户名 价值来源: secretKeyRef: 名称:我的数据库凭据 关键字:用户名 -名称:数据库密码 价值来源: secretKeyRef: 名称:我的数据库凭据 密钥:密码

  • Kubernetes允许您使用先前定义的环境变量作为配置中其他地方后续环境变量的一部分。从:

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

    因此,您可以首先将所需的秘密值提取到环境变量中,然后用这些变量组成
    数据库\u URL

    。。。
    容器:
    环境:
    -名称:DB\u URL\u主机名//第1部分
    价值来源:
    secretKeyRef:
    名称:我的数据库凭据
    关键字:主机名
    -名称:DB\U URL\U端口//第2部分
    价值来源:
    secretKeyRef:
    名称:我的数据库凭据
    关键字:端口
    -名称:DB\u URL\u DBNAME//第3部分
    价值来源:
    secretKeyRef:
    名称:我的数据库凭据
    关键词:数据库
    -名称:数据库\u URL//combine
    值:jdbc:postgresql:$(DB\u URL\u主机名):$(DB\u URL\u端口)/$(DB\u URL\u DBNAME)
    ...
    

    注意用于变量扩展的圆括号
    $(…)

    如果所有前置变量都定义为env变量:

    -  { name: DATABASE_URL, value: '{{ printf "jdbc:postgresql:$(DATABASE_HOST):$(DATABASE_PORT)/$(DB_URL_DBNAME)" }}'}
    
    通过此语句,您还可以从values.yaml文件中引入vlaues:

    例如:

    如果您可能在值文件中定义了DB_URL_DBNAME:

    -  { name: DATABASE_URL, value: '{{ printf "jdbc:postgresql:$(DATABASE_HOST):$(DATABASE_PORT)/%s" .Values.database.DB_URL_DBNAME }}'}