《Kubernetes知识篇:配置管理中心Configmap》



一、Configmap概述

1.1、什么是Configmap?

ConfigMap官方解释

ConfigMap是一种API对象,用来将 非机密性的数据保存到key/value键值对中。使用时,Pods可以将其用作 环境变量、命令行参数或者存储卷中的配置文件。ConfigMap 将您的环境配置信息和容器镜像解耦,便于应用配置的修改


1.2、Configmap应用场景

1、使用微服务架构,存在多个服务共用配置的情况,如果每个服务都有一份配置的话,更新配置就会比较麻烦,configmap可以实现多个服务配置共享。
2、使用K8S部署应用,当把应用配置写进代码中,更新配置时需要重新打包镜像,configmap可以将配置信息和docker镜像进行解耦,以便实现镜像的可移植性和可复用性,因为一个configMap其实就是一系列配置信息的集合,可直接注入到Pod中给容器使用。configmap常用注入方式有两种,一种将configMap做为存储卷,一种是将configMap通过env中configMapKeyRef注入到容器中。


1.3、Configmap局限性

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


二、Configmap创建

2.1、通过命令行创建

说明:直接在命令行中指定configmap参数创建,通过–from-literal 指定参数

[root@k8s-client-17 configmap]# kubectl create configmap nginx-config --from-literal=nginx_http_port=80 --from-literal=nginx_https_port=443
configmap/nginx-config created
[root@k8s-client-17 configmap]# kubectl describe configmap nginx-config

如下图所示:
在这里插入图片描述


2.2、通过文件创建

2.2.1、通过–from-file

说明:通过指定文件创建一个configmap,–from-file=<文件>

[root@k8s-client-17 configmap]# cat nginx.conf 
server {
  server_name upload.nginx.com;
  listen 80;
  root /usr/share/nginx/html
}
[root@k8s-client-17 configmap]# kubectl create configmap nginx-config --from-file=./nginx.conf 
configmap/nginx-config created
[root@k8s-client-17 configmap]# kubectl describe configmap nginx-config

如下图所示:
在这里插入图片描述


2.2.2、通过–from-env-file

说明:通过指定文件创建一个configmap,–from-env-file=<文件>

[root@k8s-client-17 configmap]# cat env.conf 
redis.host=192.168.1.168
redis.port=53000
[root@k8s-client-17 configmap]# kubectl create configmap redis-config --from-env-file=./env.conf 
configmap/redis-config created
[root@k8s-client-17 configmap]# kubectl get configmap redis-config -o yaml

如下图所示:
在这里插入图片描述


2.3、指定目录创建

说明:通过指定文件创建一个configmap,–from-file=<目录地址>

[root@k8s-client-17 test]# pwd
/root/configmap/test
[root@k8s-client-17 test]# cat redis1.conf 
redis1.host=192.168.1.100
redis1.port=53000
[root@k8s-client-17 test]# cat redis2.conf 
redis2.host=192.168.1.101
redis2.port=53001
[root@k8s-client-17 test]# kubectl create configmap redis-cluster --from-file=/root/configmap/test
configmap/redis-cluster created
[root@k8s-client-17 test]# kubectl get configmap redis-cluster -o yaml

如下图所示:
在这里插入图片描述


2.4、通过YAML配置文件

配置文件内容如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-demo
  namespace: default
data:
  data.1: hello  # 类属性键;每一个键都映射到一个简单的值
  data.2: world
  config: | # 类文件键
    property.1=value-1
    property.2=value-2
    property.3=value-3

如下图所示:
在这里插入图片描述


三、Configmap使用

1、创建configmap

[root@k8s-client-17 test]# cat config.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-config
  namespace: default
  labels:
    app: redis
data:
  redis.conf: |
    dir /data
    port 6379
    bind 0.0.0.0
    appendonly yes
    protected-mode no
    requirepass zisefeizhu
    pidfile /data/redis-6379.pid
[root@k8s-client-17 test]# kubectl apply -f redis-pod.yaml  

ConfigMap创建成功了,那么我们应该怎么在Pod中来使用呢?我们说ConfigMap这些配置数据可以通过很多种方式在Pod里使用,主要有以下两种方式:
  第一种是通过环境变量的方式,直接传递给pod。
  第二种是作为volume的方式挂载到pod内。


3.1、通过环境变量使用

方法一:使用valueFrom、configMapKeyRef、name、key指定要用的key。

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql1-config
  namespace: default
  labels:
    app: mysql1
data:
  mysql.host: "192.168.1.11"
  mysql.port: "3306"
  mysql.passwd: "zisefeizhu"
---
apiVersion: v1
kind: Pod
metadata:
  name: mysql1-pod
spec:
  containers:
    - name: mysql1-single
      image: busybox
      imagePullPolicy: IfNotPresent
      args: [ "/bin/sh", "-c", "sleep 3000" ]
      env:
      - name: MYSQL_HOST #必须为大小且字符串之间必须带下划线
        valueFrom:
          configMapKeyRef:
            name: mysql1-config  #需与上面定义的configmap name必须保持一致,则configm配置才能被pod引用
            key: mysql.host
      - name: MYSQL_PORT #必须为大小且字符串之间必须带下划线
        valueFrom:
          configMapKeyRef:
            name: mysql1-config  #需与上面定义的configmap name必须保持一致,则configm配置才能被pod引用
            key: mysql.port
      - name: MYSQL_PASSWD #必须为大小且字符串之间必须带下划线
        valueFrom:
          configMapKeyRef:
            name: mysql1-config  #需与上面定义的configmap name必须保持一致,则configm配置才能被pod引用
            key: mysql.passwd

进入mysql1-single容器查看环境变量,如下图所示:
在这里插入图片描述
方法二:通过envFrom、configMapRef、name使得configmap中的所有key/value对都自动变成环境变量。

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql2-config
  namespace: default
  labels:
    app: mysql2
data:
  mysql.host: "192.168.1.11"
  mysql.port: "3306"
  mysql.passwd: "zisefeizhu"
---
apiVersion: v1
kind: Pod
metadata:
  name: mysql2-pod
spec:
  containers:
    - name: mysql2-single
      image: busybox
      imagePullPolicy: IfNotPresent
      args: [ "/bin/sh", "-c", "sleep 3000" ]
      envFrom:
      - configMapRef:
         name: mysql2-config  #需与上面定义的configmap name必须保持一致,则configm配置才能被pod引用

进入mysql2-single容器查看环境变量,如下图所示:
在这里插入图片描述


3.3、作为volume挂载使用

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql3-config
  namespace: default
  labels:
    app: mysql3
data:
  mysql.host: "192.168.1.11"
  mysql.port: "3306"
  mysql.passwd: "zisefeizhu"
---
apiVersion: v1
kind: Pod
metadata:
  name: mysql3-pod
spec:
  containers:
    - name: mysql3-single
      image: busybox
      imagePullPolicy: IfNotPresent
      args: [ "/bin/sh", "-c", "sleep 3000" ]
      volumeMounts:
      - name: mysql-config #必须与下面定义的volumes名称保持一致
        mountPath: "/etc/mysql" #容器里挂载路径
        readOnly: true      
  volumes:
  - name: mysql-config #卷名称
    configMap: #基于configmap创建本地卷
      name: mysql3-config #指定configMap名称,必须与上面定义的configmap name保持一致,configmap配置才能被pod引用

进入mysql3-single容器查看,看到在/etc/mysql目录下以每一个key为文件名value为值创建了mysql.host、mysql.passwd、mysql.port三个文件。如下图所示:
在这里插入图片描述


四、Configmap配置更新

1、使用该ConfigMap挂载的env不会同步更新;

说明:修改configmap中的变量,如下所示

修改前
  mysql.host: "192.168.1.11"
  mysql.port: "3306"
  mysql.passwd: "zisefeizhu"

修改后
  mysql.host: "192.168.1.12"
  mysql.port: "3307"
  mysql.passwd: "123456"

说明:修改configmap中的变量后,重新apply资源清单文件

[root@k8s-client-17 test]# kubectl apply -f mysql1-configmap.yaml 
configmap/mysql1-config configured
pod/mysql1-pod unchanged

进入容器mysql1-single,查看变量没有发生变化
在这里插入图片描述


2、使用该ConfigMap 挂载的Volume 中的数据需要一段时间才能同步更新。

说明:修改configmap中的变量,如下所示

修改前
  mysql.host: "192.168.1.11"
  mysql.port: "3306"
  mysql.passwd: "zisefeizhu"

修改后
  mysql.host: "192.168.1.12"
  mysql.port: "3307"
  mysql.passwd: "123456"

说明:修改configmap中的变量后,重新apply资源清单文件

[root@k8s-client-17 test]# kubectl apply -f mysql3-configmap.yaml 
configmap/mysql3-config configured

进入容器mysql3-single,等待一段时间后,查看变量已经发生变化,如下图所示:
在这里插入图片描述


五、Configmap总结

ConfigMap的限制条件:
1、ConfigMap必须在Pod之前创建,Pod才能引用它。
2、如果Pod使用envFrom基于ConfigMap定义环境变量,则无效的环境变量名称(例如名称以数字开头)将被忽略,并在事件中被记录为InvalidVariableNames。
3、ConfigMap受命名空间限制,只有处于相同命名空间的Pod才可以引用它。
4、ConfigMap无法用于静态Pod。

什么是静态pod?
在Kubernetes中有一个DaemonSet类型的pod,这种类型的pod可以在某个节点上长期运行,这种类型的pod就是静态pod。静态pod直接由某个节点上的kubelet程序进行管理,不需要api server介入,静态pod也不需要关联任何RC,完全是由kubelet程序来监控,当kubelet发现静态pod停止掉的时候,重新启动静态pod。


总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:企业级K8s集群运维实战

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东城绝神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值