kubernetes并不重写在Dockerfile中设置的环境variables
我的Dockerfile包含开发和testing场景的默认环境variables:
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补充更多的完整性。
你需要以正确的yaml格式声明所有的variables,所以在这个例子中,mysql_password将会覆盖这个variables,但是mysql_password2不会覆盖,只有当它没有被声明时才会被插入:
spec: containers: env: - name: mysql_password value: "someotherpassword" name:mysql_password2 value: "password" - name: override_password value: password3
这意味着如果它以“ – ”开始,它将被覆盖。 否则会将variables插入到容器中
嗯,我可以build议一个更好的方法来存储和检索你的容器的秘密?
当你使用的数据是敏感的时候,Kubernetes为你提供了秘密的概念,而当它不是时,它提供了ConfigMaps 。
你可以在你的pod定义中指定容器应该从下面的秘密(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
所以现在你可以拥有2个不同的秘密,一个用于testing,一个用于testing
testingsecret.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。