为具有k8s机密的容器生成动态运行时YAML

时间:2019-11-26 22:38:05

标签: kubernetes kubectl kubernetes-secrets

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

# /config/srv.yaml

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

TL; DR;我只想 tenantidclientid和证书文件存储在k8s秘密中。

我当前的解决方案是将整个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}}和   在运行kubectl apply之前先使用{{password}}个模板变量。

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

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

1 个答案:

答案 0 :(得分:3)

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

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和key创建一个常规机密。值得注意的是(假设这是Azure)客户端ID和租户ID不被视为机密,可以提交给私有存储库。

完全公开:我是Kamus作者。