经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Kubernetes » 查看文章
Kubernetes(k8s)配置文件管理:ConfigMap
来源:cnblogs  作者:人生的哲理  时间:2023/2/2 1:57:29  对本文有异议

一.系统环境

服务器版本 docker软件版本 Kubernetes(k8s)集群版本 CPU架构
CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 v1.21.9 x86_64

Kubernetes集群架构:k8scloude1作为master节点,k8scloude2,k8scloude3作为worker节点

服务器 操作系统版本 CPU架构 进程 功能描述
k8scloude1/192.168.110.130 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico k8s master节点
k8scloude2/192.168.110.129 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kubelet,kube-proxy,calico k8s worker节点
k8scloude3/192.168.110.128 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kubelet,kube-proxy,calico k8s worker节点

二.前言

使用ConfigMap的前提是已经有一套可以正常运行的Kubernetes集群,关于Kubernetes(k8s)集群的安装部署,可以查看博客《Centos7 安装部署Kubernetes(k8s)集群》https://www.cnblogs.com/renshengdezheli/p/16686769.html。

三.ConfigMap概览

ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。

ConfigMap 是一个 API 对象, 让你可以存储其他对象所需要使用的配置。 和其他 Kubernetes 对象都有一个 spec 不同的是,ConfigMap 使用 data 和 binaryData 字段。这些字段能够接收键-值对作为其取值。data 和 binaryData 字段都是可选的。data 字段设计用来保存 UTF-8 字符串,而 binaryData 则被设计用来保存二进制数据作为 base64 编码的字串。

ConfigMap 的名字必须是一个合法的 DNS 子域名。

data 或 binaryData 字段下面的每个键的名称都必须由字母数字字符或者 -、_ 或 . 组成。在 data 下保存的键名不可以与在 binaryData 下出现的键名有重叠。

从 v1.19 开始,你可以添加一个 immutable 字段到 ConfigMap 定义中, 创建不可变更的 ConfigMap。

ConfigMap 将你的环境配置信息和 容器镜像 解耦,便于应用配置的修改

注意ConfigMap 并不提供保密或者加密功能。 如果你想存储的数据是机密的,请使用 Secret,关于secret的使用请查看博客《Kubernetes(k8s)密码管理:Secret》, 或者使用其他第三方工具来保证你的数据的私密性,而不是用 ConfigMap。

ConfigMap的用途如下:使用 ConfigMap 来将你的配置数据和应用程序代码分开。

  • 比如,假设你正在开发一个应用,它可以在你自己的电脑上(用于开发)和在云上 (用于实际流量)运行。 你的代码里有一段是用于查看环境变量 DATABASE_HOST,在本地运行时, 你将这个变量设置为 localhost,在云上,你将其设置为引用 Kubernetes 集群中的 公开数据库组件的 服务。

这让你可以获取在云中运行的容器镜像,并且如果有需要的话,在本地调试完全相同的代码。

ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1 MiB。如果你需要保存超出此尺寸限制的数据,你可能希望考虑挂载存储卷 或者使用独立的数据库或者文件服务。

四.创建ConfigMap

查询configmap

  1. [root@k8scloude1 secret-manage]# kubectl get cm
  2. NAME DATA AGE
  3. kube-root-ca.crt 1 5h29m

configmap的创建方式和secret类似,可以使用键值对,也可以使用文件

使用键值对创建configmap

  1. [root@k8scloude1 secret-manage]# kubectl create cm cm1 --from-literal=xioaming=zxc --from-literal=bob=plm
  2. configmap/cm1 created
  3. [root@k8scloude1 secret-manage]# kubectl get cm
  4. NAME DATA AGE
  5. cm1 2 4s
  6. kube-root-ca.crt 1 5h31m

查看configmap的详细内容

  1. [root@k8scloude1 secret-manage]# kubectl describe cm cm1
  2. Name: cm1
  3. Namespace: secret-manage
  4. Labels: <none>
  5. Annotations: <none>
  6. Data
  7. ====
  8. bob:
  9. ----
  10. plm
  11. xioaming:
  12. ----
  13. zxc
  14. Events: <none>

以yaml格式查看configmap

  1. [root@k8scloude1 secret-manage]# kubectl get cm cm1 -o yaml
  2. apiVersion: v1
  3. data:
  4. bob: plm
  5. xioaming: zxc
  6. kind: ConfigMap
  7. metadata:
  8. creationTimestamp: "2022-01-21T09:25:32Z"
  9. name: cm1
  10. namespace: secret-manage
  11. resourceVersion: "890529"
  12. selfLink: /api/v1/namespaces/secret-manage/configmaps/cm1
  13. uid: bdbb0647-dfe9-45ec-827d-9af2ea12a0a1

使用文件创建configmap

  1. [root@k8scloude1 secret-manage]# kubectl create cm cm2 --from-file=/etc/shadow --from-file=/etc/hosts
  2. configmap/cm2 created
  3. [root@k8scloude1 secret-manage]# kubectl create cm cm3 --from-file=nginx.conf
  4. configmap/cm3 created
  5. [root@k8scloude1 secret-manage]# kubectl get cm
  6. NAME DATA AGE
  7. cm1 2 4m18s
  8. cm2 2 22s
  9. cm3 1 4s
  10. kube-root-ca.crt 1 5h35m

五.ConfigMap的使用

5.1 以环境变量的方式使用ConfigMap

使用MySQL镜像创建pod,以环境变量的方式引用ConfigMap

  1. [root@k8scloude1 secret-manage]# vim mysqlconfgmap.yaml
  2. #configMapKeyRef:指定confgmap的名字和key
  3. [root@k8scloude1 secret-manage]# cat mysqlconfgmap.yaml
  4. apiVersion: v1
  5. kind: Pod
  6. metadata:
  7. creationTimestamp: null
  8. labels:
  9. run: mysql
  10. name: mysql
  11. spec:
  12. terminationGracePeriodSeconds: 0
  13. containers:
  14. - image: hub.c.163.com/library/mysql:latest
  15. imagePullPolicy: IfNotPresent
  16. name: mysql
  17. resources: {}
  18. env:
  19. - name: MYSQL_ROOT_PASSWORD
  20. valueFrom:
  21. configMapKeyRef:
  22. name: cm1
  23. key: xioaming
  24. dnsPolicy: ClusterFirst
  25. restartPolicy: Always
  26. status: {}

创建pod

  1. [root@k8scloude1 secret-manage]# kubectl apply -f mysqlconfgmap.yaml
  2. pod/mysql created
  3. [root@k8scloude1 secret-manage]# kubectl get pod -o wide
  4. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  5. mysql 1/1 Running 0 24s 10.244.112.139 k8scloude2 <none> <none>

连接mysql数据库

  1. [root@k8scloude1 secret-manage]# mysql -uroot -pzxc -h 10.244.112.139
  2. Welcome to the MariaDB monitor. Commands end with ; or \g.
  3. Your MySQL connection id is 3
  4. Server version: 5.7.18 MySQL Community Server (GPL)
  5. Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
  6. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  7. MySQL [(none)]> exit
  8. Bye

查看mysql pod的mysql密码MYSQL_ROOT_PASSWORD,mysql密码没有显示

  1. [root@k8scloude1 secret-manage]# kubectl describe pod mysql | grep -A10 Environment
  2. Environment:
  3. MYSQL_ROOT_PASSWORD: <set to the key 'xioaming' of config map 'cm1'> Optional: false
  4. Mounts:
  5. /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-dllmm (ro)
  6. Conditions:
  7. Type Status
  8. Initialized True
  9. Ready True
  10. ContainersReady True
  11. PodScheduled True
  12. Volumes:

删除pod

  1. [root@k8scloude1 secret-manage]# kubectl delete pod mysql --force
  2. warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
  3. pod "mysql" force deleted

5.2 以卷的方式使用ConfigMap

配置pod,以卷的方式引用configmap,挂载cm3的nginx.conf到/etc/nginx/nginx.conf

  1. [root@k8scloude1 secret-manage]# vim volumenginxconfconfigmap.yaml
  2. [root@k8scloude1 secret-manage]# cat volumenginxconfconfigmap.yaml
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6. creationTimestamp: null
  7. labels:
  8. run: nginx
  9. name: nginx
  10. spec:
  11. terminationGracePeriodSeconds: 0
  12. #定义configmap类型的卷
  13. volumes:
  14. - name: configmap1
  15. configMap:
  16. name: cm3
  17. containers:
  18. - image: nginx
  19. imagePullPolicy: IfNotPresent
  20. name: nginx
  21. resources: {}
  22. #把nginx.conf文件挂载到/etc/nginx/nginx.conf
  23. volumeMounts:
  24. - name: configmap1
  25. mountPath: /etc/nginx/nginx.conf
  26. subPath: nginx.conf
  27. dnsPolicy: ClusterFirst
  28. restartPolicy: Always
  29. status: {}

创建pod

  1. [root@k8scloude1 secret-manage]# kubectl apply -f volumenginxconfconfigmap.yaml
  2. pod/nginx created
  3. [root@k8scloude1 secret-manage]# kubectl get pod -o wide
  4. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  5. nginx 1/1 Running 0 9s 10.244.112.141 k8scloude2 <none> <none>

进入Nginx容器

  1. [root@k8scloude1 secret-manage]# kubectl exec -it nginx -- bash
  2. root@nginx:/# cat /etc/nginx/nginx.conf | head -3
  3. ##modify file
  4. user nginx;
  5. worker_processes auto;
  6. root@nginx:/# exit
  7. exit

可以使用edit编辑nginx.conf文件

  1. [root@k8scloude1 secret-manage]# kubectl edit cm cm3
  2. configmap/cm3 edited

查看修改过后的configmap内容

  1. [root@k8scloude1 secret-manage]# kubectl get cm cm3 -o yaml | head -7
  2. apiVersion: v1
  3. data:
  4. nginx.conf: |+
  5. ##modify file
  6. ##new add
  7. user nginx;
  8. worker_processes auto;

进入容器查看Nginx的配置文件,可以发现:cm3里文件内容已经改变了,但是容器里文件内容没变。

pod里的配置文件nginx.conf没有变化,需要重新创建pod

  1. [root@k8scloude1 secret-manage]# kubectl exec -it nginx -- bash
  2. root@nginx:/# cat /etc/nginx/nginx.conf | head -3
  3. ##modify file
  4. user nginx;
  5. worker_processes auto;
  6. root@nginx:/# exit
  7. exit

删除pod并重新创建pod

  1. [root@k8scloude1 secret-manage]# kubectl delete pod nginx --force
  2. warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
  3. pod "nginx" force deleted
  4. [root@k8scloude1 secret-manage]# kubectl apply -f volumenginxconfconfigmap.yaml
  5. pod/nginx created

此时nginx.conf文件内容已经改变了,就达到了修改configmap文件,从而改变容器里配置文件的目的。

  1. [root@k8scloude1 secret-manage]# kubectl exec -it nginx -- bash
  2. root@nginx:/# cat /etc/nginx/nginx.conf | head -3
  3. ##modify file
  4. ##new add
  5. user nginx;
  6. root@nginx:/# exit
  7. exit

查看所有的configmap

  1. [root@k8scloude1 secret-manage]# kubectl get cm -A
  2. NAMESPACE NAME DATA AGE
  3. default kube-root-ca.crt 1 12d
  4. kube-node-lease kube-root-ca.crt 1 12d
  5. kube-public cluster-info 1 12d
  6. kube-public kube-root-ca.crt 1 12d
  7. kube-system calico-config 4 12d
  8. kube-system coredns 1 12d
  9. kube-system extension-apiserver-authentication 6 12d
  10. kube-system kube-proxy 2 12d
  11. kube-system kube-root-ca.crt 1 12d
  12. kube-system kubeadm-config 2 12d
  13. kube-system kubelet-config-1.21 1 12d
  14. ns1 kube-root-ca.crt 1 11d
  15. ns2 kube-root-ca.crt 1 11d
  16. pod kube-root-ca.crt 1 9d
  17. secret-manage cm1 2 33m
  18. secret-manage cm2 2 29m
  19. secret-manage cm3 1 12m
  20. secret-manage kube-root-ca.crt 1 6h5m
  21. volume kube-root-ca.crt 1 3d5h

可以编辑其他的configmap内容

  1. [root@k8scloude1 secret-manage]# kubectl edit cm calico-config -n kube-system
  2. Edit cancelled, no changes made.
  3. [root@k8scloude1 secret-manage]# kubectl edit cm kube-proxy -n kube-system
  4. Edit cancelled, no changes made.

原文链接:https://www.cnblogs.com/renshengdezheli/p/17084642.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号