理解Kubernetes中configmap是什么

Kubernetes ConfigMap

ConfigMap 介绍

在Kubernetes 1.2中新添加了功能ConfigMap,主要功能是为了解决应用程序会从配置文件、环境变量中获取配置信息。但是默认情况下配置信息需要与docker images解耦,ConfigMap API为我们提供了向容器中注入配置信息的机制,ConfigMap可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制对象

ConfigMap API资源用来保存key-vlaue pair配置数据,这个数据可以在pods里使用,或者被用来为contaroller一样的系统组件存储配置数据。ConfigMap 是为了方便的处理不含铭感信息的字符串,你可以将它理解为Linux系统中的/etc目录,专门用来存储配置文件的目录

#注意: ConfigMap不是属性配置文件的代替品,ConfigMap只是作为多个properties文件的引用。

ConfigMap 项目演示
configmap主要还是方便处理非敏感的数据,比如注册中心地址、数据库地址、nginx地址等。像密码之类需要加密的还是需要使用secrets来进行管理

下方yaml文件中data一栏包括了配置数据,ConfigMap可以保存单个属性,也可以用来保存一个配置文件。配置数据可以通过很多种方式在Pods里被引用,ConfigMap可以用来:

[√] 设置环境变量的值
[√] 在容器里设置命令行参数
[√] 在数据卷里面创建config文件

用户和系统两者都可以在ConfigMap里存储

1. 使用Yaml文件创建ConfigMap
说明 configmap支持单个key-value键值,也支持config文件的方式
单个环境变量引用

apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap
data:
  data1: hello
  data2: test

#其中这里data1=hello,类似于环境变量 (如果是数字需要添加双引号)


[root@kubernetes-m mnt]# kubectl create -f cmp.yaml 
configmap/configmap created
[root@kubernetes-m mnt]# kubectl get configmaps 
NAME        DATA   AGE
configmap   2      5s


配置文件变量引用 比如我们需要创建多个环境变量,这里可以直接引用配置文件的方式

apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap
data:
  config: |                 ###这里是文件名称
    zuul_host=123456    #变量名称及值
    zuul_port=123
    mysql_url=456
    
[root@kubernetes-m mnt]# kubectl create -f cmp.yaml 
configmap/configmap created
[root@kubernetes-m mnt]# kubectl get configmaps 
NAME        DATA   AGE
configmap   1      5s

[root@kubernetes-m mnt]# kubectl describe configmaps configmap 
Name:         configmap
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
config:
----
zuul_host=123456
zuul_port=123
mysql_url=456

Events:  <none>

下面进行创建文件演示

#这里可以看到DATA位1,说明只有一个文件

2.使用kubectl创建

#创建的帮助,下面有创建的方法以及例子

[root@kubernetes-m mnt]# kubectl create configmap -h


Examples:
  # Create a new configmap named my-config based on folder bar
  kubectl create configmap my-config --from-file=path/to/bar

  # Create a new configmap named my-config with specified keys instead of file basenames on disk
  kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt

  # Create a new configmap named my-config with key1=config1 and key2=config2
  kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2

  # Create a new configmap named my-config from the key=value pairs in the file
  kubectl create configmap my-config --from-file=path/to/bar

  # Create a new configmap named my-config from an env file
  kubectl create configmap my-config --from-env-file=path/to/bar.env
  
  
  
这里我模拟挂载test目录下的2个文件
#当前目录结构
[root@kubernetes-m mnt]# ll test/
total 0
-rw-r--r-- 1 root root 0 Nov  9 21:06 mysql.conf
-rw-r--r-- 1 root root 0 Nov  9 21:06 nginx.conf


#创建configmap
[root@kubernetes-m mnt]# kubectl create configmap cm --from-file=test
configmap/cm created
#后面--from-file接的是目录,也可以是文件

#创建完毕后我们进行查看
[root@kubernetes-m mnt]# kubectl get configmaps 
NAME   DATA   AGE
cm     2      18s
[root@kubernetes-m mnt]# kubectl describe configmaps cm 
Name:         cm
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
mysql.conf:
----

nginx.conf:
----

Events:  <none>

#也可以使用命令行创建单个
kubectl create configmap cm-name --from-literal=abc.host=localhost --from-literal=aaa.port=80

#--from-literal支持引用多个

温馨提示:使用describe的时候,配置文件如果过大,不会完全显示,如果要查看详细信息需要使用kubectl get configmap [cm-name] -o yaml使用yaml展示(输出格式也可以修改为json)

3.使用环境变量引用configmap

引用单个环境变量
首先创建configmap 然后 创建Pod进行引用

apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap
data:
  db.host: localhost
  db.port: "3306"
---
apiVersion: v1
kind: Pod
metadata:
  name: test-demo-configmap
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh","-c","env" ]
      env:                      #引用环境变量
        - name: ZUUL_HOST       #环境变量值 (这个值可以与下面configmap key中不相同)
          valueFrom:            #环境变量值来源
             configMapKeyRef:   #使用configmap值
               name: configmap  #configmap 名称
               key: db.host     #configmap中的值
检查结果

[root@kubernetes-m mnt]# kubectl create -f cmp.yaml 
configmap/configmap created
pod/busybox created
[root@kubernetes-m mnt]# kubectl get pod
NAME      READY   STATUS              RESTARTS   AGE
busybox   0/1     ContainerCreating   0          22s
[root@kubernetes-m mnt]# kubectl logs busybox 
---
ZUUL_HOST=localhost
---
#这里我将原来是db.host变量修改为ZUUL_HOST变量等于

引用文件,不定义key

另外的一种写法,直接引用变量,不自定义Key,主要是用于引用文件,可以使用这种方式

apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh","-c","env" ]
      envFrom:                    #引用文件作为环境变量
      - configMapRef:             #configmap来源
          name: configmap           #configmap名称

####直接创建就可以,这里就是将configmap里面的值全部引用进来
[root@kubernetes-m mnt]# kubectl create -f cmp.yaml 
configmap/configmap created
pod/busybox created
[root@kubernetes-m mnt]# kubectl get pod
NAME      READY   STATUS              RESTARTS   AGE
busybox   0/1     ContainerCreating   0          5s
[root@kubernetes-m mnt]# kubectl get pod --watch
NAME      READY   STATUS              RESTARTS   AGE
busybox   0/1     ContainerCreating   0          10s
busybox   0/1     Completed           0          17s

## 查看日志
[root@kubernetes-m mnt]# kubectl logs busybox 
---
db.host=localhost
db.port=3306

4.通过命令引用configmap

在configmap里面支持命令引用变量的方式

#这里还是拿之前的configmap举例
apiVersion: v1
kind: Pod
metadata:
  name: bosybox
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh","-c","echo $(DB_HOST) $(DB_PORT)" ]
      env:
        - name: DB_HOST
          valueFrom:
            configMapKeyRef:
              name: configmap
              key: db.host
        - name: DB_PORT
          valueFrom:
            configMapKeyRef:
              name: configmap
              key: db.port

#这里还是使用Key的方式,命令行直接echo下面的环境变量就可以

[root@kubernetes-m mnt]# kubectl create -f cmp.yaml 
configmap/configmap created
pod/bosybox created
[root@kubernetes-m mnt]# kubectl get pod --watch
NAME      READY   STATUS              RESTARTS   AGE
bosybox   0/1     ContainerCreating   0          13s
bosybox   0/1     Completed           0          17s
[root@kubernetes-m mnt]# kubectl logs bosybox 
localhost 3306
由于使用的busybox镜像,没有后台执行命令,所以会出现CrashLoopBackOff状态,是属于正常状态


4.通过数据卷挂载引用configmap
配置文件如下,包含configmap文件

apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap
  namespace: default
data:
  nginx.conf: |
    nginx.host: localhost
    nginx.port: "3306"
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh","-c","cat /etc/config/nginx.conf" ]
      volumeMounts:         #挂载声明
      - name: config-volume       #volume名称
        mountPath: /etc/config    #挂载点
  volumes:        
  - name: config-volume  #和volumeMounts的名称要一致
    configMap:
      name: configmap-demo-volume   #configmap名称
将上面的yaml保存到文件进行执行,然后我们直接看pod日志就可以了,从pod日志可以看出我们挂载已经完成,因为默认的busybox镜像中没有nginx.conf,通过挂载才获取到的

[root@kubernetes-m mnt]# kubectl create -f cmp.yaml 
configmap/configmap created
pod/busybox created
[root@kubernetes-m mnt]# kubectl get pod
NAME      READY   STATUS      RESTARTS   AGE
busybox   0/1     Completed   0          19s
[root@kubernetes-m mnt]# kubectl logs busybox 
nginx.host: localhost
nginx.port: "3306"

如果/etc/没有config目录也是可以挂载的,并不影响

如果我们有2个pod都需要挂载configmap,其中一个是在/etc/config/nginx.conf,还有一个是在/etc/config/path/to目录下,这时候就可以使用下面的案例
apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap
  namespace: default
data:
  nginx.conf: |
    nginx.host: localhost
    nginx.port: "3306"
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh","-c","cat /etc/config/path/go/nginx.conf" ]
      volumeMounts:     			#挂载声明
      - name: config-volume			#volume名称
        mountPath: /etc/config       #挂载点
  volumes:
  - name: config-volume   			#和volumeMounts的名称要一致
    configMap:
      name: configmap 				#configmap名称
      items:
      - key: nginx.conf				#configmap中的key
        path: path/go/nginx.conf	 #挂载路径

[root@kubernetes-m mnt]# kubectl create -f cmp.yaml 
configmap/configmap created
pod/busybox created
[root@kubernetes-m mnt]# kubectl get pod 
NAME      READY   STATUS              RESTARTS   AGE
busybox   0/1     ContainerCreating   0          3s
[root@kubernetes-m mnt]# kubectl get pod  --watch
NAME      READY   STATUS              RESTARTS   AGE
busybox   0/1     ContainerCreating   0          9s
busybox   0/1     Completed           0          21s

日志如下

[root@kubernetes-m mnt]# kubectl logs busybox 
nginx.host: localhost
nginx.port: "3306"
posted @ 2021-12-17 10:35  Layzer  阅读(131)  评论(0编辑  收藏  举报