Configmap用于保存配置数据,以键值对形式存储。

configMap 资源提供了向 Pod 注入配置数据的方法。

旨在让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。

典型的使用场景

填充环境变量的值

设置容器内的命令行参数

填充卷的配置文件

创建ConfigMap的方式有4种:

使用字面值创建
使用文件创建
使用目录创建
编写configmap的yaml文件创建

删除之前建立的pod ,ns,ingress,网络策略

1.使用字面值创建

$ kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2

默认cm
[root@server2 ~]# kubectl  get cm
NAME               DATA   AGE
kube-root-ca.crt   1      14d

在这里插入图片描述

2.使用文件创建

$ kubectl create configmap my-config-2 --from-file=/etc/resolv.conf
key的名称是文件名称,value的值是这个文件的内容
在这里插入图片描述

3.使用目录创建

$ kubectl create configmap my-config-3 --from-file=test
目录中的文件名为key,文件内容是value
在这里插入图片描述
在这里插入图片描述

4.编写configmap的yaml文件

[root@server2 configmap]# cat cm1.yml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm1-config
data:
  db_host: "172.25.0.250"
  db_port: "3306"

在这里插入图片描述

如何使用configmap:

通过环境变量的方式直接传递给pod

通过在pod的命令行下运行的方式

作为volume的方式挂载到pod内

1.使用configmap设置环境变量

[root@server2 configmap]# cat pod1.yml 
apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
    - name: pod1
      image: busyboxplus
      command: ["/bin/sh", "-c", "env"]
      env:
        - name: key1
          valueFrom:
            configMapKeyRef:
              name: cm1-config     ##值来源于上文中建立的cm1-config中的db_host,
              key: db_host
        - name: key2
          valueFrom:
            configMapKeyRef:
              name: cm1-config
              key: db_port
  restartPolicy: Never

上文中建立的cm1-config

db_host: “172.25.0.250”
db_port: “3306”
在这里插入图片描述
直接导入变量

[root@server2 configmap]# cat pod2.yml 
apiVersion: v1
kind: Pod
metadata:
  name: pod2
spec:
  containers:
    - name: pod2
      image: busyboxplus
      command: ["/bin/sh", "-c", "env"]
      envFrom:
        - configMapRef:
            name: cm1-config
  restartPolicy: Never
  

在这里插入图片描述

2.使用conigmap设置命令行参数

[root@server2 configmap]# cat pod2.yml 
apiVersion: v1
kind: Pod
metadata:
  name: pod2
spec:
  containers:
    - name: pod2
      image: busyboxplus
      command: ["/bin/sh", "-c","echo $(db_host) $(db_port)"]
      envFrom:
        - configMapRef:
            name: cm1-config
  restartPolicy: Never

在这里插入图片描述

3.通过数据卷使用configmap


[root@server2 configmap]# cat pod3.yml 

apiVersion: v1
kind: Pod
metadata:
  name: pod3
spec:
  containers:
    - name: pod3
      image: busyboxplus
      command: ["/bin/sh", "-c", "ls -l /config/"]
      volumeMounts:  
      - name: config-volume  #挂此卷
        mountPath: /config   #在容器内自动创建路径,
  volumes:
    - name: config-volume  #当挂此卷的时候映射到cm1-config
      configMap:
        name: cm1-config
  restartPolicy: Never

在这里插入图片描述
command: ["/bin/sh", "-c", "cat /config/db_host"] 可以看到文件内容
ip

4.configmap热更新

[root@server2 configmap]# cat pod3.yml 

apiVersion: v1
kind: Pod
metadata:
  name: pod3
spec:
  containers:
    - name: pod3
      image: busyboxplus
      stdin: true
      tty: true
      volumeMounts:  
      - name: config-volume  #挂此卷
        mountPath: /config   #在容器内自动创建路径,
  volumes:
    - name: config-volume  #当挂此卷的时候映射到cm1-config
      configMap:
        name: cm1-config

删除之前创建的pod
在这里插入图片描述
Pod数据并不会实时更新,需要等待几秒:

在这里插入图片描述
在这里插入图片描述

5.configmap热更新后,并不会触发相关Pod的滚动更新,需要手动触发:

cm和应用容器结合,存放配置文件
$ kubectl patch deployments.apps my-nginx --patch ‘{“spec”: {“template”: {“metadata”: {“annotations”: {“version/config”: “20200219”}}}}}’
deployment.apps/my-nginx patched

每次通过修改“version/config”触发Pod滚动更新。

使用configmap挂载的env环境变量是不会更新的。

运行容器,nginx -s reload

[root@server2 configmap]# cat default.conf 
server {
    listen       8080; 
    server_name  _;

    location / {
        root /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

[root@server2 configmap]# kubectl create configmap nginx-config --from-file=default.conf
configmap/nginx-config created
[root@server2 configmap]# kubectl  apply -f demo.yml 
deployment.apps/demo created
[root@server2 configmap]# cat demo.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1
        volumeMounts:
        - name: config-volume
          mountPath: /etc/nginx/conf.d
      volumes:
        - name: config-volume
          configMap:
            name: nginx-config


[root@server2 configmap]# kubectl  get pod
NAME                    READY   STATUS    RESTARTS   AGE
demo-75679c99b4-7xg2h   1/1     Running   0          12s
[root@server2 configmap]# kubectl  describe pod demo-75679c99b4-7xg2h 
Name:         demo-75679c99b4-7xg2h
Namespace:    default
    Mounts:
      /etc/nginx/conf.d from config-volume (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-v4bql (ro)
[root@server2 configmap]# kubectl  get pod -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP               NODE      NOMINATED NODE   READINESS GATES
demo-75679c99b4-7xg2h   1/1     Running   0          42s   10.244.141.210   server3   <none>           <none>
[root@server2 configmap]# curl 10.244.141.210:8080
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server2 configmap]# kubectl  exec -it demo-75679c99b4-7xg2h -- sh
/ # cd /etc/nginx/conf.d/
/etc/nginx/conf.d # ls
default.conf
/etc/nginx/conf.d # cat default.conf 
server {
    listen       8080; 
    server_name  _;

    location / {
        root /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

将端口改为80
[root@server2 configmap]# kubectl edit cm nginx-config
configmap/nginx-config edited
可以看出configmap热更新以生效,但80端口仍未生效

[root@server2 configmap]# curl 10.244.141.210
curl: (7) Failed connect to 10.244.141.210:80; Connection refused
[root@server2 configmap]# curl 10.244.141.210
curl: (7) Failed connect to 10.244.141.210:80; Connection refused
[root@server2 configmap]# curl 10.244.141.210:8080

需要手动触发Pod滚动更新, 这样才能再次加载nginx.conf配置文件:
kubectl patch deployments.apps demo --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20200307"}}}}}'
在这里插入图片描述

edit修改后,删除pod,控制器会直接重建新的pod,相当于更新
直接删除pod,重建,生效

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐