首页 > 解决方案 > 为具有 k8s 机密的容器生成动态运行时 YAML

问题描述

我正在部署一项服务,该服务严格采用 YAML 配置,如下所示:

# /config/srv.yaml

#
# ...
#
tenantid: '...'
clientid: '...'
certfile: '/config/client/client.crt'
keyfile:  '/config/client/client.key'
#
# ...
#

TL;博士; 我只想将, & cert 文件存储在秘密中。tenantidclientidk8s

我目前的解决方案是将整个 YAML 文件存储在秘密中,这似乎很浪费而且管理起来也很麻烦。


基本上我有这个 - 它适用于 2 个证书文件(/config/client/client.crt/config/client/client.key):

spec:
  containers:
    - name: my-container
      image: "my-image"
      imagePullPolicy: Always
      ports:
        - containerPort: 50100
      env:
      - name: CONF_FILE
        value: "/config/srv.yaml"
      volumeMounts:
      - name: yaml-vol
        mountPath: "/config" # KLUDGY
        readOnly: true
      - name: certs-vol
        mountPath: "/config/client"
        readOnly: true

    volumes:
    - name: yaml-vol
      secret:
        secretName: my-yamls # KLUDGY
    - name: certs-vol
      secret:
        secretName: my-certs # contains the *.crt/*.key cert files

然而,它涉及将整个存储/config/srv.yaml在 kubernetes 机密my-yamls中。

k8s secrets docs建议有一种方法可以为容器创建动态 YAML 配置 - 在需要的地方准确填写秘密,stringData例如

stringData:
  config.yaml: |-
    apiUrl: "https://my.api.com/api/v1"
    username: {{username}}
    password: {{password}}

但文档以非常模糊的方式结束:

然后,您的部署工具可以在运行之前替换 {{username}} 和 {{password}} 模板变量kubectl apply

我只需要在动态配置中填写两个字符串项:clientidtenantid.

使用 just kubectl,如何为容器创建动态 YAML - 将非敏感 YAML 模板存储在deploy.yaml- 并且只包含敏感项目k8s secrets

标签: kuberneteskubectlkubernetes-secrets

解决方案


另一种方法是使用另一种工具进行秘密管理。一种解决方案是使用Kamus。Kamus 支持模板,因此您可以执行以下操作:

apiVersion: v1
kind: ConfigMap
metadata:
  name: encrypted-secrets-cm
data:
  tenantid: <encrypted>
  clientid: <encrypted>
  template.ejs: |
     tenantid: <%- secrets["tenantid"] %>
     clientid: <%- secrets["clientid"] %>
     certfile: '/config/client/client.crt'
     keyfile:  '/config/client/client.key'

使用 Kamus 加密值的位置。

然后要么使用 clientSecret 并以相同的方式存储它,要么为 crt 和密钥创建一个常规密钥。值得注意的是(假设这是 Azure)客户端 ID 和租户 ID 不被视为机密,并且可以提交到私有存储库。

全面披露:我是 Kamus 的作者。


推荐阅读