使用 Kubernetes 机密作为配置映射中的环境变量



我在容器中有一个应用程序,它从configMap中读取某些数据,如下所示

apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
application.yaml: |
server:
port: 8080
host: 0.0.0.0
##
## UCP configuration.
## If skipped, it will default to looking inside of the connections.xml file.
database:
ApplicationDB:
username: username
password: hello123

现在,我为密码创建了一个密钥,并在启动容器时挂载为 env 变量。

apiVersion: v1
kind: Secret
metadata:
name: appdbpassword
type: Opaque
stringData:
password: hello123

我的豆荚看起来像:

apiVersion: v1
kind: Pod
metadata:
name: {{ .Values.pod.name }}
spec:
containers:
- name: {{ .Values.container.name }}
image: {{ .Values.image }}
command: [ "/bin/sh", "-c", "--" ]
args: [ "while true; do sleep 30; done;"]
env:
- name: password
valueFrom:
secretKeyRef:
name: appdbpassword
key: password
volumeMounts:
- name: config-volume
mountPath: /app/app-config/application.yaml
subPath: application.yaml
volumes:
- name: config-volume
configMap:
name: app-config

我尝试在 configMap 中使用此 env 变量:

apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
application.yaml: |
server:
port: 8080
host: 0.0.0.0
##
## UCP configuration.
## If skipped, it will default to looking inside of the connections.xml file.
database:
ApplicationDB:
username: username
**password: ${password}**

但是我的应用程序无法读取此密码。我在这里错过了什么吗?

编辑:

我无法将应用程序.yaml 更改为任何其他形式,因为我的服务器在源路径中查找应用程序.yaml。我们有没有办法在 values.yaml(helm( 文件中使用该环境变量并在配置映射中使用它?

您的 ${password} 变量不会被其值替换,因为 application.yaml 是一个静态文件。如果您在某些配置中使用此yaml文件,则它可能会被其值替换。

考虑这样一种情况,其中传递此文件而不是 application.yaml

application.sh: |
echo "${password}"

现在进入/app/app-config 你会看到 application.sh 文件。现在sh application.sh您将看到环境变量的值。

我希望这可以澄清你的观点。

不能在ConfigMap中使用机密,因为它们用于非敏感数据(请参阅此处(。

此外,您不应该使用env's传递Secrets,因为它会产生潜在的风险(在此处阅读更多内容,为什么env不应该这样做 使用(。 应用程序通常会在错误报告中转储env变量,甚至将 启动时的应用程序日志,这可能会导致暴露Secrets

最好的方法是将Secret挂载为文件。 下面是一个如何将其挂载为文件的简单示例:

spec:
template:
spec:
containers:
- image: "my-image:latest"
name: my-app
...
volumeMounts:
- mountPath: "/var/my-app"
name: ssh-key
readOnly: true
volumes:
- name: ssh-key
secret:
secretName: ssh-key

Kubernetes 文档很好地解释了如何使用和挂载密钥。

最新更新