我的Dockerfile包含用于开发和测试场景的默认环境变量:
ENV mysql_host=mysql \
mysql_user=app \
mysql_password=password \
和我的k8s yaml包含一个env指令:
spec:
containers:
env:
- name: "mysql_password"
value: "someotherpassword"
name: "mysql_host"
value: "someotherhost"
name: "mysql_user"
value: "someotheruser"
但是当我用
执行我的正在运行的容器时kubctl exec -it service -- /bin/bash
我仍然看到"密码"作为mysql_password。
编辑:为了完整性,从k8s yaml中添加了更多内容。
答案 0 :(得分:6)
您需要以正确的yaml格式声明所有变量 所以在这个例子中,mysql_password将覆盖变量,但mysql_password2不会覆盖,只有在未声明它时才会插入:
spec:
containers:
env:
- name: mysql_password
value: "someotherpassword"
name:mysql_password2
value: "password"
- name: override_password
value: password3
意思是如果它以" - "它会覆盖。否则它会将变量插入容器
答案 1 :(得分:0)
嗯,我可以建议一种更好的方法来存储和检索容器的秘密吗?
当您使用的数据敏感时,Kubernetes会为您提供Secrets的概念;如果不敏感,则为ConfigMaps。
您可以在容器定义中指定容器应从下面的秘密中提取值(Kubernetes 1.6 +)
apiVersion: v1
kind: Pod
metadata:
labels:
context: docker-k8s-lab
name: mysql-pod
name: mysql-pod
spec:
containers:
- image: "mysql:latest"
name: mysql
ports:
- containerPort: 3306
envFrom:
secretRef:
name: mysql-secret
所以现在你可以有两个不同的秘密,一个用于刺激,一个用于测试
测试secret.yaml:
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
MYSQL_USER: <user>
MYSQL_PASSWORD: <password>
MYSQL_DATABASE: <database>
MYSQL_ROOT_PASSWORD: <root_password>
PROD-secret.yaml:
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
MYSQL_USER: <user>
MYSQL_PASSWORD: <password>
MYSQL_DATABASE: <database>
MYSQL_ROOT_PASSWORD: <root_password>
现在您可以将秘密部署到相应的群集
kubectl config use-context test
kubectl create -f dev-secret.yaml
kubectl config use-context prod
kubectl create -f prod-secret.yaml
现在当你的Pod启动时,它将从密码中的值填充env。