根据实践学习K8S--6.使用ConfigMap对象下发环境变量

1.创建两个环境变量

[root@node-1 configmap]# cat env.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config
data:
  http_port: '18080'
  ssh_port: '1022'
[root@node-1 configmap]#
[root@node-1 configmap]# kubectl create -f env.yaml 
configmap/env-config created
[root@node-1 configmap]# kubectl describe configmaps env-config 
Name:         env-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
http_port:
----
18080
ssh_port:
----
1022
Events:  <none>
[root@node-1 configmap]#

2.应用到pod中

[root@node-1 pod]# cat centos_env.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: centos
  labels:
    app: centos
spec:
  replicas: 1
  selector:
    matchLabels:
      app: centos
  template:
    metadata:
      labels:
        app: centos
    spec:
      containers:
      - name: centos
        image: centos:7.4-tomcat
        imagePullPolicy: Never
        command: [ "/bin/bash", "-c", "--" ]
        args: [ "while true; do sleep 30; done;" ]
        envFrom:
        - configMapRef:
            name: env-config
        volumeMounts:
        - name: iso
          mountPath: /media/cdrom
      volumes:
      - name: iso
        hostPath:
          path: /mnt
      nodeSelector:
        path: iso
[root@node-1 pod]# kubectl create -f centos_env.yaml 
deployment.apps/centos created

其他映射方式参考:https://blog.csdn.net/zhonglinzhang/article/details/81126117

查看结果:在configmap中的环境变量已经应用到pod中了.

[root@node-1 pod]# kubectl exec centos-6b68465d79-5w9df /bin/env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=centos-6b68465d79-5w9df
ssh_port=1022
http_port=18080
MYWEB_SERVICE_PORT=8080
MYWEB_PORT_8080_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
MYSQL_PORT_3306_TCP=tcp://10.102.186.227:3306
MYSQL_PORT_3306_TCP_ADDR=10.102.186.227
MYWEB_PORT_8080_TCP=tcp://10.107.109.45:8080
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
MYSQL_PORT_3306_TCP_PORT=3306
MYWEB_PORT=tcp://10.107.109.45:8080
MYWEB_PORT_8080_TCP_ADDR=10.107.109.45
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
MYSQL_SERVICE_PORT=3306
MYWEB_SERVICE_HOST=10.107.109.45
MYWEB_PORT_8080_TCP_PORT=8080
KUBERNETES_PORT_443_TCP_PORT=443
MYSQL_SERVICE_HOST=10.102.186.227
MYSQL_PORT=tcp://10.102.186.227:3306
MYSQL_PORT_3306_TCP_PROTO=tcp
HOME=/root

我们将configmap中环境变量进行修改,发现pod不会自动更新,需要重启deployment才可以.
应该是deployment对象已经定义了变量属性,所以没有重启读取.

总结

更新 ConfigMap 后:

使用该 ConfigMap 挂载的 Env 不会同步更新
使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新
ENV 是在容器启动的时候注入的,启动之后 kubernetes 就不会再改变环境变量的值,且同一个 namespace 中的 pod 的环境变量是不断累加的,参考 Kubernetes中的服务发现与docker容器间的环境变量传递源码探究。为了更新容器中使用 ConfigMap 挂载的配置,可以通过滚动更新 pod 的方式来强制重新挂载 ConfigMap,也可以在更新了 ConfigMap 后,先将副本数设置为 0,然后再扩容。

你可能感兴趣的:(K8S)