我在一个容器中有一个应用程序,它可以从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}**
但是我的应用程序无法读取此密码。我在这里想念什么吗?
编辑:
我无法将application.yaml更改为任何其他形式,因为我的服务器在源路径中查找application.yaml。我们有什么方法可以在values.yaml(helm)文件中使用该环境变量,并在configmap中使用它?
答案 0 :(得分:0)
您的$ {password}变量将不会被其值替换,因为application.yaml是静态文件。如果您以某种配置使用此yaml文件,则很可能会被其值替换。
考虑一种方案,而不是通过application.yaml传递该文件
application.sh: |
echo "${password}"
现在进入/ app / app-config,您将看到application.sh文件。现在执行sh application.sh
,您将看到环境变量的值。
我希望这可以澄清您的观点。
答案 1 :(得分:0)
您不能在ConfigMap
中使用机密,因为它们旨在用于非敏感数据(See here)。
此外,您不应该使用Secrets
通过env's
,因为它会带来潜在的风险(请阅读更多here,为什么不应该使用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 documentation很好地解释了如何使用和安装机密。