为具有 k8s 机密的容器生成动态运行时 YAML
generate dynamic runtime YAML for container with k8s secrets
我正在部署一项服务,该服务严格采用如下所示的 YAML 配置:
# /config/srv.yaml
#
# ...
#
tenantid: '...'
clientid: '...'
certfile: '/config/client/client.crt'
keyfile: '/config/client/client.key'
#
# ...
#
TL;DR;我只想 将 tenantid
、clientid
和证书文件存储在 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}}
但是文档结尾非常含糊:
Your deployment tool could then replace the {{username}} and
{{password}} template variables before running kubectl apply
.
我只需要在动态配置中填写两个字符串项:clientid
和tenantid
。
仅使用 kubectl
,如何为容器创建动态 YAML - 将非敏感 YAML 模板存储在 deploy.yaml
- 并且只在 [=26= 中包含敏感项目]?
另一种方法是使用另一种工具进行秘密管理。一种解决方案是使用 Kamus. Kamus support 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 和密钥创建一个常规机密。值得注意的是(假设这是 Azure)客户端 ID 和租户 ID 不被视为机密,可以提交到私有存储库。
完全披露:我是 Kamus 作者。
我正在部署一项服务,该服务严格采用如下所示的 YAML 配置:
# /config/srv.yaml
#
# ...
#
tenantid: '...'
clientid: '...'
certfile: '/config/client/client.crt'
keyfile: '/config/client/client.key'
#
# ...
#
TL;DR;我只想 将 tenantid
、clientid
和证书文件存储在 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}}
但是文档结尾非常含糊:
Your deployment tool could then replace the {{username}} and {{password}} template variables before running
kubectl apply
.
我只需要在动态配置中填写两个字符串项:clientid
和tenantid
。
仅使用 kubectl
,如何为容器创建动态 YAML - 将非敏感 YAML 模板存储在 deploy.yaml
- 并且只在 [=26= 中包含敏感项目]?
另一种方法是使用另一种工具进行秘密管理。一种解决方案是使用 Kamus. Kamus support 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 和密钥创建一个常规机密。值得注意的是(假设这是 Azure)客户端 ID 和租户 ID 不被视为机密,可以提交到私有存储库。
完全披露:我是 Kamus 作者。