ConfigMap详解与案例

ConfigMap详解与案例

1、ConfigMap使用场景

  • 这里使用一张来源与网络的图来说明ConfigMap常见的使用场景之一:
    image_1eiqksubd1er5n8eig01pcp1m469.png-154.7kB

2、ConfigMap的概述

  • ConfigMap供容器使用的典型用法如下。
    • 生成为容器内的环境变量。
    • 设置容器启动命令的启动参数(需设置为环境变量)。
    • 以Volume的形式挂载为容器内部的文件或目录。

ConfigMap以一个或多个key:value的形式保存在Kubernetes系统中供应用使用,既可以用于表示一个变量的值(例如apploglevel=info),也可以用于表示一个完整配置文件的内容(例如server.xml=<?xml…>…)可以通过YAML配置文件或者直接使用kubectlcreateconfigmap命令行的方式来创建ConfigMap

3、创建ConfigMap

  • 创建ConfigMap的方式有4种:
    • 通过直接在命令行中指定configmap参数创建,即–from-literal
    • 通过指定文件创建,即将一个配置文件创建为一个ConfigMap–from-file=<文件>
    • 通过指定目录创建,即将一个目录下的所有配置文件创建为一个ConfigMap,–from-file=<目录>
    • 事先写好标准的configmap的yaml文件,然后kubectl create -f 创建

4、ConfigMap的增删改查指令

4.1、查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#查询所有命令空间的ConfigMap信息
[root@k8s-master nginx_deployment]# kubectl get configmap -A
NAMESPACE NAME DATA AGE
default nginx-config 1 46m
default www-config 1 66m
kube-public cluster-info 1 5d2h
kube-system coredns 1 5d2h
kube-system extension-apiserver-authentication 6 5d2h
kube-system kube-flannel-cfg 2 5d2h
kube-system kube-proxy 2 5d2h
kube-system kubeadm-config 2 5d2h
kube-system kubelet-config-1.19 1 5d2h
kubernetes-dashboard kubernetes-dashboard-settings 0 5d1h
#查询缺省的default命名空间的ConfigMap信息
[root@k8s-master nginx_deployment]# kubectl get cm
[root@k8s-master nginx_deployment]# kubectl get configmap
NAME DATA AGE
nginx-config 1 43m
www-config 1 64m
[root@k8s-master nginx_deployment]# kubectl describe configmap nginx-config
[root@k8s-master nginx_deployment]# kubectl get configmap nginx-config -o yaml
#此处省略

4.2、修改

1
kubectl edit configmap [configmap名称]

4.3、删除

1
kubectl delete configmap [configmap名称]

4.3、增加

1
2
3
kubectl create configmap [configmap名称] --from-file=[目录]
kubectl create configmap [configmap名称] --from-file=[文件]
kubectl create configmap [configmap名称] --from-literal=[键值对]

5、为nginx-deployment创建configmap

5.1、编写yml文件创建configmap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#创建nginx主配置文件的configmap
[root@k8s-master nginx_deployment]# cat nginx-config.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
nginx.conf: |
user nginx;
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/lisiraccess.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#创建虚拟主机configmap    
[root@k8s-master nginx_deployment]# cat www-config.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: www-config
data:
# 类文件键
default.conf: |
server {
listen 80;
listen [::]:80;
server_name localhost;

#charset koi8-r;
access_log /var/log/nginx/host.access.log main;

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

location /stub_status {
allow 127.0.0.1;
stub_status on;
}
}

5.2、通过kubectl生成configmap

1
2
kubectl apply -f www-config.yml 
kubectl apply -f nginx-config.yml

5.3、创建nginx-deployment,挂载configmap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: web_server
replicas: 2
template:
metadata:
labels:
app: web_server
spec:
containers:
- name: nginx
image: nginx:1.12.1
ports:
- containerPort: 80
env:
- name: TZ
value: Asia/Shanghai
#就是这一段使用configMap配置
volumeMounts:
- name: nginx-web1-storage
mountPath: /usr/share/nginx/html
#定义挂载名称与后面配置的volume相呼应
- name: www-config
#将配置文件挂载到哪里
mountPath: /etc/nginx/conf.d
- name: nginx-config
mountPath: /etc/nginx/nginx.conf
#使用 ConfigMap 作为 subPath 的数据卷将不会收到 ConfigMap 更新
#volumeMounts.subPath属性用于指定单个文件,而不是整个目录,如不指定则整个目录都发生变化
subPath: nginx.conf
volumes:
- name: nginx-web1-storage
persistentVolumeClaim:
claimName: nginx-pvc-web1
- name: www-config
configMap:
name: www-config
- name: nginx-config
configMap:
#提供你想要挂载的 ConfigMap 的名字
name: nginx-config
#也可不指定items,那默认是nginx-config里的所有值都挂载
items:
#使用nginx-config配置的nginx.conf键里的内容
- key: nginx.conf
path: nginx.conf

5.4、访问测试

image_1eiqldopo16dns231e8j7bpeamm.png-8.6kB

6、注意事项

  • Kubelet的同步时间间隔

    设定参数:sync-frequency
    缺省设定值:在1.17中缺省设定为1m0s,所以最大同步间隔为1分钟,之所以说最大,因为更新的时间点距其即将开始的同步的时间可能不同。

  • 包含subPath的configmap的pod无法实现热更新,可以通过kubectl rollout restart deployment/nginx-deployment重启deployment实现更新,更新前将修改的数据通过命令kubectl apply -f nginx-config.yml更新到etcd即可。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    [root@k8s-master ~]# kubectl exec -it pod/nginx-deployment-5c8f6b5d97-6cvmq -- cat /etc/nginx/nginx.conf
    user nginx;
    worker_processes 2;
    error_log /var/log/nginx/error.log warn;
    pid /var/run/nginx.pid;
    events {
    worker_connections 1024;
    }
    http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /var/log/nginx/lisiraccess.log main;
    sendfile on;
    #tcp_nopush on;
    keepalive_timeout 65;
    #gzip on;
    include /etc/nginx/conf.d/*.conf;
    }
-------------本文结束感谢您的阅读-------------
LiGuanCheng wechat
如有问题,请与我微信交流或通过右下角“daovoice”与我联系~。
请我喝一杯咖啡~