K8S学习之基础二十八:k8s中的configMap

立山  金牌会员 | 2025-3-16 01:05:47 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 993|帖子 993|积分 2979

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、命令行创建:
  1. kubectl create configmap tomcat-config --from-literal=tomcat_port=8080 --from-literal=server_name=myapp.tomcat.com
  2. [root@mast01 cm]# kubectl get cm
  3. NAME               DATA   AGE
  4. kube-root-ca.crt   1      21d
  5. tomcat-config      2      4s
  6. [root@mast01 cm]# kubectl describe cm tomcat-config
  7. Name:         tomcat-config
  8. Namespace:    default
  9. Labels:       <none>
  10. Annotations:  <none>
  11. Data
  12. ====
  13. server_name:
  14. ----
  15. myapp.tomcat.com
  16. tomcat_port:
  17. ----
  18. 8080
  19. BinaryData
  20. ====
  21. Events:  <none>
复制代码
2、通过文件创建:
  1. vim nginx.conf
  2. server {
  3.   server_name www.nginx.com;
  4.   listen 80;
  5.   root /home/nginx/www/
  6. }
  7. kubectl create configmap www-nginx --from-file=www=./nginx.conf
  8. [root@mast01 cm]# kubectl get cm
  9. NAME               DATA   AGE
  10. kube-root-ca.crt   1      21d
  11. tomcat-config      2      3m19s
  12. www-nginx          1      20s
  13. [root@mast01 cm]# kubectl describe cm www-nginx
  14. Name:         www-nginx
  15. Namespace:    default
  16. Labels:       <none>
  17. Annotations:  <none>
  18. Data
  19. ====
  20. www:
  21. ----
  22. server {
  23.   server_name www.nginx.com;
  24.   listen 80;
  25.   root /home/nginx/www/
  26. }
  27. BinaryData
  28. ====
  29. Events:  <none>
复制代码
3、指定目录创建
  1. [root@mast01 cm]# mkdir -p mysql-cnf
  2. [root@mast01 cm]# echo 'server-id=1' mysql-cnf/master.cnf
  3. server-id=1 mysql-cnf/master.cnf
  4. [root@mast01 cm]# echo 'server-id=2' mysql-cnf/slave.cnf
  5. server-id=2 mysql-cnf/slave.cnf
  6. [root@mast01 cm]# kubectl create cm mysql-cnf --from-file=./mysql-cnf/
  7. configmap/mysql-cnf created
  8. [root@mast01 cm]# kubectl get cm
  9. NAME               DATA   AGE
  10. kube-root-ca.crt   1      21d
  11. mysql-cnf          2      8s
  12. tomcat-config      2      13m
  13. www-nginx          1      7m37s
  14. [root@mast01 cm]# kubectl describe cm mysql-cnf
  15. Name:         mysql-cnf
  16. Namespace:    default
  17. Labels:       <none>
  18. Annotations:  <none>
  19. Data
  20. ====
  21. server.conf:
  22. ----
  23. server-id=1
  24. slave.conf:
  25. ----
  26. server-id=2
  27. BinaryData
  28. ====
  29. Events:  <none>
复制代码
4、通过yaml文件创建
  1. vi config.yaml
  2. apiVersion: v1
  3. kind: ConfigMap
  4. metadata:
  5.   name: app-config
  6.   namespace: default  # 可选,默认为default
  7. data:    # 多行内容用|保留换行符,或使用>折叠换行(根据需求选择)
  8.   # 简单键值对
  9.   log-level: INFO
  10.   # 多行配置文件内容
  11.   config.properties: |
  12.     server.port=8080
  13.     environment=production
  14.     debug.enabled=false
  15.   # JSON配置文件示例
  16.   app-settings.json: |
  17.     {
  18.       "featureFlag": true,
  19.       "maxConnections": 100
  20.     }
  21. [root@mast01 cm]# kubectl get cm
  22. NAME               DATA   AGE
  23. app-config         3      4s
  24. kube-root-ca.crt   1      21d
  25. [root@mast01 cm]# kubectl describe cm app-config
  26. Name:         app-config
  27. Namespace:    default
  28. Labels:       <none>
  29. Annotations:  <none>
  30. Data
  31. ====
  32. app-settings.json:
  33. ----
  34. {
  35.   "featureFlag": true,
  36.   "maxConnections": 100
  37. }
  38. config.properties:
  39. ----
  40. server.port=8080
  41. environment=production
  42. debug.enabled=false
  43. log-level:
  44. ----
  45. INFO
  46. BinaryData
  47. ====
  48. Events:  <none>
复制代码
ConfigMap使用
1、使用configMapKeyRef通过环境变量注入
  1. vi pod-cm.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: pod-cm
  6. spec:
  7.   containers:
  8.   - name: busybox
  9.     image: 172.16.80.140/busybox/busybox:latest
  10.     command: [ "/bin/sh", "-c", "sleep 3600" ]
  11.     env:
  12.     - name: server.port        #定义环境变量server.port
  13.       valueFrom:
  14.         configMapKeyRef:
  15.           name: app-config     #指定configmap的名字
  16.           key: server.port     #指定configmap中的key
  17.     - name: lower              #定义环境变量lower
  18.       valueFrom:
  19.         configMapKeyRef:
  20.           name: app-config
  21.           key: log-level
  22.   restartPolicy: Never
  23.   
  24. [root@mast01 cm]# kubectl get pods -owide
  25. NAME                               READY   STATUS    RESTARTS   AGE     IP              NODE     NOMINATED NODE   READINESS GATES
  26. nfs-provisioner-7559c6b4fc-nbmb6   1/1     Running   0          5m33s   10.244.140.65   node02   <none>           <none>
  27. pod-cm                             1/1     Running   0          6s      10.244.140.66   node02   <none>           <none>
  28. [root@mast01 cm]# kubectl exec -it pod-cm -- /bin/sh
  29. / # env
  30. KUBERNETES_SERVICE_PORT=443
  31. KUBERNETES_PORT=tcp://10.96.0.1:443
  32. HOSTNAME=pod-cm
  33. SHLVL=1
  34. HOME=/root
  35. TERM=xterm
  36. lower=INFO          # 来源 cm app-config 的 log-level
  37. KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
  38. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  39. KUBERNETES_PORT_443_TCP_PORT=443
  40. KUBERNETES_PORT_443_TCP_PROTO=tcp
  41. KUBERNETES_SERVICE_PORT_HTTPS=443
  42. KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
  43. KUBERNETES_SERVICE_HOST=10.96.0.1
  44. PWD=/
  45. server.port=server.port=8080    # 来源 cm app-config 的 config.properties
  46. environment=production
  47. debug.enabled=false
复制代码
2、使用envfrom通过环境变量注入
  1. vi pod-cm-envfrom.yaml
  2. kind: Pod
  3. metadata:
  4.   name: pod-cm
  5. spec:
  6.   containers:
  7.   - name: busybox
  8.     image: 172.16.80.140/busybox/busybox:latest
  9.     command: [ "/bin/sh", "-c", "sleep 3600" ]
  10.     envFrom:
  11.     - configMapRef:
  12.         name: app-config     #指定configmap的名字
  13.   restartPolicy: Never
  14. kubectl get pods -owide
  15. NAME                               READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
  16. nfs-provisioner-7559c6b4fc-nbmb6   1/1     Running   0          20m   10.244.140.65   node02   <none>           <none>
  17. pod-cm                             1/1     Running   0          69s   10.244.140.67   node02   <none>           <none>
  18. [root@mast01 cm]# kubectl exec -it pod-cm -- /bin/sh
  19. / # env
  20. KUBERNETES_PORT=tcp://10.96.0.1:443
  21. KUBERNETES_SERVICE_PORT=443
  22. HOSTNAME=pod-cm
  23. SHLVL=1
  24. HOME=/root
  25. config.properties=server.port=8080
  26. environment=production
  27. debug.enabled=false
  28. app-settings.json={
  29.   "featureFlag": true,
  30.   "maxConnections": 100
  31. }
  32. log-level=INFO
  33. TERM=xterm
  34. KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
  35. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  36. KUBERNETES_PORT_443_TCP_PORT=443
  37. KUBERNETES_PORT_443_TCP_PROTO=tcp
  38. KUBERNETES_SERVICE_PORT_HTTPS=443
  39. KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
  40. KUBERNETES_SERVICE_HOST=10.96.0.1
  41. PWD=/
复制代码
3、把configMap做成volume,挂载到pod里
  1. vi pod-cm-volume.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: pod-cm
  6. spec:
  7.   containers:
  8.   - name: busybox
  9.     image: 172.16.80.140/busybox/busybox:latest
  10.     command: [ "/bin/sh", "-c", "sleep 3600" ]
  11.     volumeMounts:
  12.     - name: app-config
  13.       mountPath: /tmp/config
  14.   volumes:
  15.   - name: app-config
  16.     configMap:
  17.       name: app-config
  18.   restartPolicy: Never
  19.   
  20. [root@mast01 cm]# kubectl get pods -owide
  21. NAME                               READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
  22. nfs-provisioner-7559c6b4fc-nbmb6   1/1     Running   0          31m   10.244.140.65   node02   <none>           <none>
  23. pod-cm                             1/1     Running   0          4s    10.244.140.69   node02   <none>           <none>
  24. [root@mast01 cm]# kubectl get pods -owide
  25. NAME                               READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
  26. nfs-provisioner-7559c6b4fc-nbmb6   1/1     Running   0          31m   10.244.140.65   node02   <none>           <none>
  27. pod-cm                             1/1     Running   0          8s    10.244.140.69   node02   <none>           <none>
  28. [root@mast01 cm]# kubectl exec -it pod-cm -- /bin/sh
  29. / # cd /tmp/config
  30. /tmp/config # ls
  31. app-settings.json  config.properties  log-level
  32. /tmp/config # cat app-settings.json
  33. {
  34.   "featureFlag": true,
  35.   "maxConnections": 100
  36. }
  37. /tmp/config # cat config.properties
  38. server.port=8080
  39. environment=production
  40. debug.enabled=false
  41. /tmp/config # cat log-level
复制代码
4、configMap热更新
​ 通过kubectl edit cm cm 可以直接更新cm,生存后cm立刻生效
​ env方式的不会更新
​ volume方式的大约10s后会更新

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立山

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表