k8s中的configMap
configMap是k8s的资源对象,简称cm,用于生存非机密性的配置,数据可以用key/value键值对形式生存,也可以通过文件形式生存
在部署服务的时候,每个服务都有本身的配置文件,假如一台服务器上部署多个服务:nginx、tomcat、apache等,那么这些配置都存在这个节点上,假如一台服务器不能满意线上高并发的要求,需要对服务器扩容,扩容之后的服务器还是需要部署多个服务:nginx、tomcat、apache,新增长的服务器上还是要管理这些服务的配置,假如有一个服务出现题目,需要修改配置文件,每台物理节点上的配置都需要修改,这种方式肯定满意不了线上大批量的配置变动要求。 以是,k8s中引入了Configmap资源对象,可以当成volume挂载到pod中,实现统一的配置管理。
在部署服务的时候,每个服务都有本身的配置文件,假如一台服务器上部署多个服务:nginx、tomcat、apache等,那么这些配置都存在这个节点上,假如一台服务器不能满意线上高并发的要求,需要对服务器扩容,扩容之后的服务器还是需要部署多个服务:nginx、tomcat、apache,新增长的服务器上还是要管理这些服务的配置,假如有一个服务出现题目,需要修改配置文件,每台物理节点上的配置都需要修改,这种方式肯定满意不了线上大批量的配置变动要求。 以是,k8s中引入了Configmap资源对象,可以当成volume挂载到pod中,实现统一的配置管理。
1、Configmap是k8s中的资源, 相当于配置文件,可以有一个大概多个Configmap;
2、Configmap可以做成Volume,k8s pod启动之后,通过 volume 形式映射到容器内部指定目录上;
3、容器中应用程序按照原有方式读取容器特定目录上的配置文件。
4、在容器看来,配置文件就像是打包在容器内部特定目录,整个过程对应用没有任何侵入。
局限性:ConfigMap不能生存大量数据,凌驾1M,就需要考虑挂载存储卷或其他方式了
configmap创建方法:
1、命令行创建:
- kubectl create configmap tomcat-config --from-literal=tomcat_port=8080 --from-literal=server_name=myapp.tomcat.com
- [root@mast01 cm]# kubectl get cm
- NAME DATA AGE
- kube-root-ca.crt 1 21d
- tomcat-config 2 4s
- [root@mast01 cm]# kubectl describe cm tomcat-config
- Name: tomcat-config
- Namespace: default
- Labels: <none>
- Annotations: <none>
- Data
- ====
- server_name:
- ----
- myapp.tomcat.com
- tomcat_port:
- ----
- 8080
- BinaryData
- ====
- Events: <none>
复制代码 2、通过文件创建:
- vim nginx.conf
- server {
- server_name www.nginx.com;
- listen 80;
- root /home/nginx/www/
- }
- kubectl create configmap www-nginx --from-file=www=./nginx.conf
- [root@mast01 cm]# kubectl get cm
- NAME DATA AGE
- kube-root-ca.crt 1 21d
- tomcat-config 2 3m19s
- www-nginx 1 20s
- [root@mast01 cm]# kubectl describe cm www-nginx
- Name: www-nginx
- Namespace: default
- Labels: <none>
- Annotations: <none>
- Data
- ====
- www:
- ----
- server {
- server_name www.nginx.com;
- listen 80;
- root /home/nginx/www/
- }
- BinaryData
- ====
- Events: <none>
复制代码 3、指定目录创建
- [root@mast01 cm]# mkdir -p mysql-cnf
- [root@mast01 cm]# echo 'server-id=1' mysql-cnf/master.cnf
- server-id=1 mysql-cnf/master.cnf
- [root@mast01 cm]# echo 'server-id=2' mysql-cnf/slave.cnf
- server-id=2 mysql-cnf/slave.cnf
- [root@mast01 cm]# kubectl create cm mysql-cnf --from-file=./mysql-cnf/
- configmap/mysql-cnf created
- [root@mast01 cm]# kubectl get cm
- NAME DATA AGE
- kube-root-ca.crt 1 21d
- mysql-cnf 2 8s
- tomcat-config 2 13m
- www-nginx 1 7m37s
- [root@mast01 cm]# kubectl describe cm mysql-cnf
- Name: mysql-cnf
- Namespace: default
- Labels: <none>
- Annotations: <none>
- Data
- ====
- server.conf:
- ----
- server-id=1
- slave.conf:
- ----
- server-id=2
- BinaryData
- ====
- Events: <none>
复制代码 4、通过yaml文件创建
- vi config.yaml
- apiVersion: v1
- kind: ConfigMap
- metadata:
- name: app-config
- namespace: default # 可选,默认为default
- data: # 多行内容用|保留换行符,或使用>折叠换行(根据需求选择)
- # 简单键值对
- log-level: INFO
- # 多行配置文件内容
- config.properties: |
- server.port=8080
- environment=production
- debug.enabled=false
- # JSON配置文件示例
- app-settings.json: |
- {
- "featureFlag": true,
- "maxConnections": 100
- }
- [root@mast01 cm]# kubectl get cm
- NAME DATA AGE
- app-config 3 4s
- kube-root-ca.crt 1 21d
- [root@mast01 cm]# kubectl describe cm app-config
- Name: app-config
- Namespace: default
- Labels: <none>
- Annotations: <none>
- Data
- ====
- app-settings.json:
- ----
- {
- "featureFlag": true,
- "maxConnections": 100
- }
- config.properties:
- ----
- server.port=8080
- environment=production
- debug.enabled=false
- log-level:
- ----
- INFO
- BinaryData
- ====
- Events: <none>
复制代码 ConfigMap使用
1、使用configMapKeyRef通过环境变量注入
- vi pod-cm.yaml
- apiVersion: v1
- kind: Pod
- metadata:
- name: pod-cm
- spec:
- containers:
- - name: busybox
- image: 172.16.80.140/busybox/busybox:latest
- command: [ "/bin/sh", "-c", "sleep 3600" ]
- env:
- - name: server.port #定义环境变量server.port
- valueFrom:
- configMapKeyRef:
- name: app-config #指定configmap的名字
- key: server.port #指定configmap中的key
- - name: lower #定义环境变量lower
- valueFrom:
- configMapKeyRef:
- name: app-config
- key: log-level
- restartPolicy: Never
-
- [root@mast01 cm]# kubectl get pods -owide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- nfs-provisioner-7559c6b4fc-nbmb6 1/1 Running 0 5m33s 10.244.140.65 node02 <none> <none>
- pod-cm 1/1 Running 0 6s 10.244.140.66 node02 <none> <none>
- [root@mast01 cm]# kubectl exec -it pod-cm -- /bin/sh
- / # env
- KUBERNETES_SERVICE_PORT=443
- KUBERNETES_PORT=tcp://10.96.0.1:443
- HOSTNAME=pod-cm
- SHLVL=1
- HOME=/root
- TERM=xterm
- lower=INFO # 来源 cm app-config 的 log-level
- KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
- PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
- KUBERNETES_PORT_443_TCP_PORT=443
- KUBERNETES_PORT_443_TCP_PROTO=tcp
- KUBERNETES_SERVICE_PORT_HTTPS=443
- KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
- KUBERNETES_SERVICE_HOST=10.96.0.1
- PWD=/
- server.port=server.port=8080 # 来源 cm app-config 的 config.properties
- environment=production
- debug.enabled=false
复制代码 2、使用envfrom通过环境变量注入
- vi pod-cm-envfrom.yaml
- kind: Pod
- metadata:
- name: pod-cm
- spec:
- containers:
- - name: busybox
- image: 172.16.80.140/busybox/busybox:latest
- command: [ "/bin/sh", "-c", "sleep 3600" ]
- envFrom:
- - configMapRef:
- name: app-config #指定configmap的名字
- restartPolicy: Never
- kubectl get pods -owide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- nfs-provisioner-7559c6b4fc-nbmb6 1/1 Running 0 20m 10.244.140.65 node02 <none> <none>
- pod-cm 1/1 Running 0 69s 10.244.140.67 node02 <none> <none>
- [root@mast01 cm]# kubectl exec -it pod-cm -- /bin/sh
- / # env
- KUBERNETES_PORT=tcp://10.96.0.1:443
- KUBERNETES_SERVICE_PORT=443
- HOSTNAME=pod-cm
- SHLVL=1
- HOME=/root
- config.properties=server.port=8080
- environment=production
- debug.enabled=false
- app-settings.json={
- "featureFlag": true,
- "maxConnections": 100
- }
- log-level=INFO
- TERM=xterm
- KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
- PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
- KUBERNETES_PORT_443_TCP_PORT=443
- KUBERNETES_PORT_443_TCP_PROTO=tcp
- KUBERNETES_SERVICE_PORT_HTTPS=443
- KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
- KUBERNETES_SERVICE_HOST=10.96.0.1
- PWD=/
复制代码 3、把configMap做成volume,挂载到pod里
- vi pod-cm-volume.yaml
- apiVersion: v1
- kind: Pod
- metadata:
- name: pod-cm
- spec:
- containers:
- - name: busybox
- image: 172.16.80.140/busybox/busybox:latest
- command: [ "/bin/sh", "-c", "sleep 3600" ]
- volumeMounts:
- - name: app-config
- mountPath: /tmp/config
- volumes:
- - name: app-config
- configMap:
- name: app-config
- restartPolicy: Never
-
- [root@mast01 cm]# kubectl get pods -owide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- nfs-provisioner-7559c6b4fc-nbmb6 1/1 Running 0 31m 10.244.140.65 node02 <none> <none>
- pod-cm 1/1 Running 0 4s 10.244.140.69 node02 <none> <none>
- [root@mast01 cm]# kubectl get pods -owide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- nfs-provisioner-7559c6b4fc-nbmb6 1/1 Running 0 31m 10.244.140.65 node02 <none> <none>
- pod-cm 1/1 Running 0 8s 10.244.140.69 node02 <none> <none>
- [root@mast01 cm]# kubectl exec -it pod-cm -- /bin/sh
- / # cd /tmp/config
- /tmp/config # ls
- app-settings.json config.properties log-level
- /tmp/config # cat app-settings.json
- {
- "featureFlag": true,
- "maxConnections": 100
- }
- /tmp/config # cat config.properties
- server.port=8080
- environment=production
- debug.enabled=false
- /tmp/config # cat log-level
复制代码 4、configMap热更新
通过kubectl edit cm cm 可以直接更新cm,生存后cm立刻生效
env方式的不会更新
volume方式的大约10s后会更新
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |