ConfigMap介绍

configMap在K8S中充当配置中心的角色,用于修改Pod中的配置文件信息且支持动态修改,修改完配置文件后需手动使Pod重载配置文件
在K8S中与configMap功能相同的资源是secret,不同的是configMap是以明文形式保存到ETCD中的,而secret是以密文形式保存到ETCD

configMap的重要作用:

让配置信息与镜像文件解耦,从而增强了应用的可移植性以及应用的可复用性,简单来说一个configMap就是一切应用数据的集合,而这些数据将来可以注入到Pod对象中的容器中所使用。

注入的方式有两种:

第一、直接把configMap当存储卷
第二、使用ENV  volumeFrom的方式引用configMap当中所保存进去的数据

在每个configMap中所有的配置信息都保存为键值格式比如键名为name键值为张三 name=张三 值是没有限制的所以可以保存相当长的一些配置文件
值可以保存为一些参数,也可以保存为一些完整的配置文件都是没有问题的,例如nginx为键,nginx的配置文件为值的信息,同样我们可以在Pod启动时从configMap键上获取相关的数据项

创建configMap

建议configMap用CLI的方式来创建,这样会简单很多

例如:

kubectl create configmap NAME --from-file=PATH/File

此方式直接指定文件内容为值文件名为键的方式。例如,当前文件有个名为txt而内容是123的文件执行完以上命令,键名就为txt,值就是123 txt=123
举例现在有一个在当前目录名为www.conf的配置文件具体配置信息如下:

server {
       server_name myapp.com
       listen 80;
       root    /data/web/html/;
}

以文件内容方式创建configMap:

kubectl create configmap nginx-www --from-file=./www.conf

如果不写出键名是什么,系统会自动把文件名作为键名,文件内容作为键值来创建configMap
查询configMap是否创建完成:

[root@master configMap]# kubectl get cm
NAME           DATA   AGE
nginx-config   2      13m
nginx-www      1      6s

验证刚创建的configMap内容:

[root@master configMap]# kubectl describe cm nginx-www
Name:         nginx-www
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
www.conf:
----
server {
server_name myapp.com
listen 80;
root  /data/web/html/;
}

Events:  <none>

以上内容以www.conf来作为名字且内容为键值,www.conf和文件名相对应
当然也可以直接指明键名是什么值是什么:

kubectl create configmap NAME --from-literal=KEY1=CONFIG1

举例:

kubectl create cm nginx-config --from-literal=nginx_port=8080 --from-literal=server_name=myapp.com

以上创建了一个名为nginx-config的configMap文件,其中存在两个键值分别是nginx_port=8080和server_name=myapp.com

验证刚创建的configMap内容:

[root@master configMap]# kubectl describe cm nginx-config
Name:         nginx-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
server_name:
----
myapp.com
nginx_port:
----
8080
Events:  <none>

通过环境变量来传递configMap中的配置信息:

[root@master configMap]# vim pod-configMap.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm-1
  namespace: default
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    env:
    - name: NGINX_SERVER_PORT   #此处为传递到容器中的环境变量名字
      valueFrom:                
        configMapKeyRef:        
          name: nginx-config    #此处为configMap的名字
          key: nginx_port       #此处为configMap中的键值名
    - name: NGINX_SERVER_NAME   #此处为传递到容器中的环境变量名字
      valueFrom:
        configMapKeyRef:
          name: nginx-config    #此处为configMap的名字
          key: server_name      #此处为传递到容器中的环境变量名字

configMap上面是已经创建的有的因此在上方示例直接引用,通常也是要先创建configMap后引用
以上Pod创建完成后进入Pod中查看环境变量信息是否有NGINX_SERVER_PORT=8080和NGINX_SERVER_NAME=myapp.com。

验证环境变量传递configmap信息:

          MYAPP_SVC_PORT_80_TCP_ADDR=10.98.57.156
          KUBERNETES_SERVICE_PORT=443
          MYAPP_SERVICE_PORT_HTTP=80
          KUBERNETES_PORT=tcp://10.1.0.1:443
          TOMCAT_PORT_8080_TCP=tcp://10.1.155.239:8080
          TOMCAT_PORT_8009_TCP=tcp://10.1.155.239:8009
          MYAPP_SVC_PORT_80_TCP_PORT=80
          HOSTNAME=pod-cm-1
          SHLVL=1
          MYAPP_SVC_PORT_80_TCP_PROTO=tcp
          HOME=/root
          MYAPP_SERVICE_HOST=10.1.80.253
          NGINX_SERVER_PORT=8080
          NGINX_SERVER_NAME=myapp.com
          MYAPP_SVC_PORT_80_TCP=tcp://10.98.57.156:80
          MYAPP_PORT=tcp://10.1.80.253:80
          MYAPP_SERVICE_PORT=80
          TERM=xterm
          NGINX_VERSION=1.12.2
          KUBERNETES_PORT_443_TCP_ADDR=10.1.0.1
          MYAPP_PORT_80_TCP_ADDR=10.1.80.253
          PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
          KUBERNETES_PORT_443_TCP_PORT=443
          TOMCAT_SERVICE_PORT_HTTP=8080
          KUBERNETES_PORT_443_TCP_PROTO=tcp
          MYAPP_PORT_80_TCP_PORT=80
          MYAPP_PORT_80_TCP_PROTO=tcp
          MYAPP_SVC_SERVICE_HOST=10.98.57.156
          TOMCAT_PORT_8080_TCP_ADDR=10.1.155.239
          TOMCAT_SERVICE_HOST=10.1.155.239
          TOMCAT_PORT_8009_TCP_ADDR=10.1.155.239
          KUBERNETES_SERVICE_PORT_HTTPS=443
          KUBERNETES_PORT_443_TCP=tcp://10.1.0.1:443
          TOMCAT_PORT_8080_TCP_PORT=8080
          PWD=/
          TOMCAT_PORT_8080_TCP_PROTO=tcp
          MYAPP_PORT_80_TCP=tcp://10.1.80.253:80
          TOMCAT_PORT_8009_TCP_PORT=8009
          KUBERNETES_SERVICE_HOST=10.1.0.1
          MYAPP_SVC_SERVICE_PORT=80
          MYAPP_SVC_PORT=tcp://10.98.57.156:80
          TOMCAT_PORT_8009_TCP_PROTO=tcp
          TOMCAT_PORT=tcp://10.1.155.239:8080
          TOMCAT_SERVICE_PORT=8080
          TOMCAT_SERVICE_PORT_AJP=8009

以上看出是存在NGINX_SERVER_PORT=8080和NGINX_SERVER_NAME=myapp.com的证明环境变量传入成功!
注意:当我们使用环境变量注入时只在Pod启动时生效,更改configmaps时Pod中不生效,缺乏灵活性,通过存储卷的方式获取是可以实时更新的,修改configMap时可以用edit来修改相关信息

使用存储卷来传递configMap中的信息:

apiVersion: v1
kind: Pod
metadata:
  name: pod-cm-2
  namespace: default
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    volumeMounts:                       
    - name: nginxconf                     #挂载到容器中的名字一般要和volumes中的名字一样
      mountPath: /etc/nginx/config.d/     #挂载到容器中的位置信息
      readOnly: true
 volumes:
 - name: nginxconf                       #存储卷名字
   configMap:                            #存储卷类型
     name: nginx-config                  #事先创建的configMap的名字,因为上方已经创建过了

此存储卷可以动态更改配置文件,意思是说可以直接更改configMap文件更改完成后Pod也会生效,只不过需要一点时间来做同步。
注意注入到Pod中文件显示为浅蓝色,但是其实他就是一个链接文件,可以直接使用cat查看,或者使用都是可以的
举例注入Nginx配置文件:

apiVersion: v1
kind: Pod
metadata:
  name: pod-cm-3
  namespace: default
  labels:
    app: myapp
    tier: frontend
  spec:
    containers: 
    - name: myapp
      image: ikubernetes/myapp:v1
      imagePullPolicy: IfNotPresent
      ports:
      - name: http
        containerPort: 80
      volumeMounts:
      - name: nginxconf
        mountPath: /etc/nginx/conf.d/
        readOnly: true
  volumes:
  - name: nginxconf
    configMap:
      name: nginx-www

此处引用的也是上方事先创建好的configMap文件,其挂在路径换到nginx的默认配置路径下然后创建出配置文件下的网页目录和index.html
注意:此方式可以随时更改Nginx的配置文件,但是要想使配置文件生效需要手动重载下nginx的配置信息,不然不生效

最后修改:2023 年 06 月 09 日
如果觉得我的文章对你有用,请随意赞赏