实验环境:kubernetes Version v1.9.6 网络CNI:fannel 存储CSI: NFS Dynamic Class
获取configmap中的环境变量方式有2种: 1、使用该 ConfigMap 挂载的 Env 2、使用该 ConfigMap 挂载的 Volume
nginx-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: env-config
namespace: default
data:
log_level: INFO
nginx-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 1
template:
metadata:
labels:
app: my-nginx
spec:
containers:
- name: my-nginx
image: nginx:1.10
ports:
- containerPort: 80
envFrom:
- configMapRef:
name: env-config
实践证明修改 ConfigMap 无法更新容器中已注入的环境变量信息
nginx-cm2.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default
data:
log_level: INFO
nginx-deployment-v.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: my-nginx-2
spec:
replicas: 1
template:
metadata:
labels:
app: my-nginx-2
spec:
containers:
- name: my-nginx-2
image: nginx:1.10
ports:
- containerPort: 80
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: special-config
更新 ConfigMap 后:
ENV 是在容器启动的时候注入的,启动之后 kubernetes 就不会再改变环境变量的值,且同一个 namespace 中的 pod 的环境变量是不断累加的,参考 Kubernetes中的服务发现与docker容器间的环境变量传递源码探究。为了更新容器中使用 ConfigMap 挂载的配置,可以通过滚动更新 pod 的方式来强制重新挂载 ConfigMap,也可以在更新了 ConfigMap 后,先将副本数设置为 0,然后再扩容。
参考文档: https://jimmysong.io/posts/kubernetes-configmap-hot-update/