我正在使用包含应用程序数据库配置的kubernetes ConfigMap,并且有一个具有数据库密码的机密。 我需要在ConfigMap中使用这个秘密,所以当我尝试在ConfigMap中添加环境变量并从秘密中指定pod部署中的值时我无法使用密码连接到mysql,因为ConfigMap中的值占用了变量的确切字符串。
apiVersion: v1
kind: ConfigMap
metadata:
name: config
data:
APP_CONFIG: |
port: 8080
databases:
default:
connector: mysql
host: "mysql"
port: "3306"
user: "root"
password: "$DB_PASSWORD"
和deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: app
labels:
app: backend
spec:
replicas: 1
template:
metadata:
labels:
app: backend
spec:
containers:
- name: app
image: simple-app-image
ports:
- name: "8080"
containerPort: 8080
env:
- name: APP_CONFIG
valueFrom:
configMapKeyRef:
name: config
key: APP_CONFIG
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: "mysql-secret"
key: "mysql-root-password"
注意:秘密存在,我能够获得“mysql-root-password”值并用于登录数据库
答案 0 :(得分:3)
Kubernetes不能替代你,你应该在容器的入口点用shell做。
这是一个有效的例子。我修改默认入口点以创建具有该替换的新变量。在此命令之后,您应该添加所需的入口点。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: app
labels:
app: backend
spec:
replicas: 1
template:
metadata:
labels:
app: backend
spec:
containers:
- name: app
image: simple-app-image
command:
- /bin/bash
- -c
args:
- "NEW_APP_CONFIG=$(echo $APP_CONFIG | envsubst) && echo $NEW_APP_CONFIG && <INSERT IMAGE ENTRYPOINT HERE>"
ports:
- name: "app"
containerPort: 8080
env:
- name: APP_CONFIG
valueFrom:
configMapKeyRef:
name: config
key: APP_CONFIG
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: "mysql-secret"
key: "mysql-root-password"
答案 1 :(得分:0)
我会将整个configMap
转换为secret
,然后直接在其中部署数据库密码。
然后,您可以将秘密作为文件安装到卷上,并像容器中的常规配置文件一样使用它。