kubernetes - ConfigMap使用方法,个人学习记录

kubernetes - configMap

    • configMap的创建
      • 一、使用目录(包含多文件)创建
      • 二、使用单独文件创建
      • 三、使用字面值创建
    • Pod 中 ConfigMap
      • 一、使用 ConfigMap 键值对来替代环境变量
      • 二、用 ConfigMap 设置命令行参数
      • 三、通过数据卷插件使用 ConfigMap
    • ConfigMap 实战,热更新
        • ConfigMap 更新后触发滚动更新 Pod

  • ​ConfigMap 功能在 kubernetes1.2版本中引入,许多应用程序会从配置文件、命令行参数或者环境变量中读取配置信息。
  • ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap
    可以被用来保存单个属性,也可以用来保存整个配置文件或者 JSON 二进制对象(就是键值对)。
  • ​ 生产环境中属于 配置文件注册中心,管理所有集群中容器的配置文件。
  • ​ 简称CM


configMap的创建

一、使用目录(包含多文件)创建

创建一个目录,用来做配置文件存储目录

mkdir /root/httpd-config ; cd /root/httpd-config

模拟两个配置文件,一个nginx,一个apache

echo "nginx aaaaaaaaaa" >> nginx.conf
echo "apache bbbbbbbbbbb" >> apache.conf

[root@k8s-master httpd-config]# ls
apache.conf  nginx.conf

生成目录 ConfigMap

kubectl create configmap httpd-config --from-file=/root/httpd-config
httpd-config:自定义的Configmap名称
--from-file:CM存储中包含文件来源 /root/httpd-config

查看生成的 ConfigMap 中包含了哪些文件

kubectl get cm 查看集群包含哪些 ConfigMap

kubectl get cm httpd-config -o yaml 查看生成的 ConfigMap 是如何定义的

kubectl describe cm httpd-config 查看生成的 ConfigMap 具体信息


二、使用单独文件创建

只要指定为一个文件就可以从单个文件中 创建 ConfigMap

kubectl create configmap mysql-config --from-file=/root/my.cnf

查看生成的 ConfigMap 中包含了哪些文件

kubectl get cm

kubectl get cm mysql-config -o yaml

kubectl describe cm mysql-config


三、使用字面值创建

使用文字值创建,利用 --from-literal 参数传递配置信息

kubectl create configmap special-config \
--from-literal=special.how=very \
--from-literal=special.type=charm

--from-literal:指定键名=键值

查看生成的 ConfigMap 中包含了哪些文件

kubectl get cm

kubectl get cm mysql-config -o yaml

kubectl describe cm mysql-config


Pod 中 ConfigMap

一、使用 ConfigMap 键值对来替代环境变量

先创建两个 ConfigMap 并准备好键值

apiVersion: v1
kind: ConfigMap
metadata: 
 name: env-config		#第一个ConfigMap的名称
 namespace: default
data: 
 log_level: INFO		#enc-config 的 键名:键值
apiVersion: v1
kind: ConfigMap
metadata: 
  name: spcial_config		#第二个ConfigMap的名称
  namespace: default
data:
  special.how: very		#spcial_config 的第一个 键名:键值
  special.type: charm		#spcial_config 的第二个 键名:键值

将 env_config 和 spcial_config 注入到 Pod 容器当中使用

apiVersion: v1
kind: Pod
metadata: 
  name: dapi-test-pod
spec:
  containers: 
    - name: nginx-container
      image: nginx:1.9.1	
      command: ["/bin/sh","-c","env"]	#运行命令,打印环境变量
      env: 							#env注入环境变量的第一种写法,只引入键值
       - name: SPECIAL_LEVEL_KEY	#定义注入第一个环境变量名
         valueFrom:					#环境变量的值从哪来
          configMapKeyRef: 			#从 configMap 中获取变量值
            name: special-config	#从 special_config 中获取key的值,充当变量值
            key: special.how		#从 special_config 中的哪个key的值,充当变量值
            
       - name: SPECIAL_TYPE_KEY 	#定义注入的第二个环境变量名,只引入键值
         valueFrom:					#环境变量的值从哪来的
          configMapKeyRef: 			#从 ConfigMap 中获取
            name: special-config	#从哪个 ConfigMap 中获取得
            key: special.type		#从 special_config 中得哪个键获取得变量值
            
      envFrom:					#env注入环境变量得第二种写法,键名:键值全部引入
      	- configMapRef: 		#从创建的 ConfigMap 中导入值
      	    name: env-config	#创建的 ConfigMap 叫什么
  restartPolicy: Never

kubectl logs dapi-test-pod | grep “^SPECIAL_*”

kubectl logs dapi-test-pod | grep ^log_level
在这里插入图片描述

二、用 ConfigMap 设置命令行参数

apiVersion: v1
kind: ConfigMap
metadata: 
  name: spcial_config	#第二个ConfigMap的名称
  namespace: default
data:
  special.how: very		#spcial_config 的第一个 键名:键值
  special.type: charm	#spcial_config 的第二个 键名:键值
apiVersion: v1
kind: Pod
metadata: 
  name: dapi-test-pod2
spec:
  containers: 
    - name: nginx2-container
      image: nginx:1.9.1
      command: ["/bin/sh","-c","echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)"]
      env: 							#env注入变量,只引入键值
       - name: SPECIAL_LEVEL_KEY	#定义注入第一个环境变量名
         valueFrom:			#环境变量的值从哪来
          configMapKeyRef: 		#从 configMap 中获取变量值
            name: special-config	#从 special_config 中获取key的值,充当变量值
            key: special.how		#从 special_config 中的哪个key的值,充当变量值
            
       - name: SPECIAL_TYPE_KEY 	#定义注入的第二个变量名,只引入键值
         valueFrom:			#环境变量的值从哪来的
          configMapKeyRef: 		#从 ConfigMap 中获取
            name: special-config	#从哪个 ConfigMap 中获取得
            key: special.type
  restartPolicy: Never            

kubectl logs dapi-test-pod2
在这里插入图片描述


三、通过数据卷插件使用 ConfigMap

配置文件注册中心最常用得一种方法

​ 首先生成好 ConfigMap,可以是目录CM,可以是文件CM,也可以是键值对。

​ 再创建 Pod 得时候将 configMap 挂载到 Pod 容器当中,实现共享卷。

apiVersion: v1
kind: ConfigMap
metadata: 
  name: spcial_config	#第二个ConfigMap的名称
  namespace: default
data:
  special.how: very		#spcial_config 的第一个 键名:键值
  special.type: charm	#spcial_config 的第二个 键名:键值
apiVersion: v1
kind: Pod
metadata: 
  name: dapi-test-pod3
spec:
  containers: 
    - name: nginx3-container
      image: nginx:1.9.1
      command: ["/bin/sh","-c","cat /etc/config/special.how;sleep 600s"]
      volumeMounts: 			#挂载一个数据卷
        - name: config-volume		#数据卷得名称是 config-volume
          mountPath: /etc/config	#挂载到容器哪个路径下
  volumes: 				#指定数据卷
     - name: config-volume		#数据卷名称,与volumeMounts对应
       configMap: 			#是 configMap 类型得数据卷
          name: special-config		#ConfigMap 数据卷得名字
  restartPolicy: Never

进入容器查看是否挂载成功:kubectl exec dapi-test-pod3 -it – /bin/bash

kubernetes - ConfigMap使用方法,个人学习记录_第1张图片


ConfigMap 实战,热更新

创建一个键值对 ConfigMap,并将其挂载到 Deployment - Nginx /etc/config 目录中

apiVersion: v1
kind: ConfigMap
metadata: 
 name: log-config
 namespace: default
data: 
 log_level: INFO
---
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: my-nginx
spec: 
  replicas: 2
  selector:
   matchLabels:
    app: my-nginx
  template: 
   metadata:
   	labels: 
   	  app: my-nginx
   spec: 
    containers: 
      - name: my-nginx
        image: nginx:1.9.1
        ports:
         - containerPort: 80
        volumeMounts:
         - name: conf-volume
           mountPath: /etc/config
    volumes: 
       - name: conf-volume
         configMap: 
           name: log-config

查看是否挂载成功:

kubectl exec my-nginx-7854488b9d-46tl4 -it -- ls /etc/config

在这里插入图片描述

热更新,修改 ConfigMap 的键值对数据

kubectl edit cm log-config

kubernetes - ConfigMap使用方法,个人学习记录_第2张图片

验证更新效果,等待10秒左右同步生效

< – 不一定非得是键值对形式的 ConfigMap,其他方式生成的同理能够修改同步 -->
在这里插入图片描述



ConfigMap 更新后触发滚动更新 Pod

1.手动更新 Pod 当中

2.修改 Pod annotations 的方式强制触发滚动更新,这里面的时间为当天时间(或者更新时间)

kubectl patch deployment my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config":"20200616" }}}}}'

deployment:控制器类型
my-nginx:容器标签
g-53LuHcAb-1592301445839)]




#### ConfigMap 更新后触发滚动更新 Pod

**1.手动更新 Pod 当中**

**2.修改 Pod annotations 的方式强制触发滚动更新,这里面的时间为当天时间(或者更新时间)**

```shell
kubectl patch deployment my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config":"20200616" }}}}}'

deployment:控制器类型
my-nginx:容器标签

你可能感兴趣的:(kubernetes)