K8s 中 ConfigMap 使用介绍

一、基本介绍

ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时,Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。ConfigMap 的主要作用就是为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。 官方介绍


使用 ConfigMap 的限制条件:

  1. ConfigMap 需要在 Pod 启动前创建出来;
  2. 并且只有当 ConfigMap 和 Pod 处于同一命名空间时,才可以被 Pod 引用;
  3. 当 Pod 挂载 ConfigMap 绑定的目录时,目录下的目录并不会挂载到 Pod 内,只有目录下的文件会被挂载。

二、ConfigMap 使用介绍

1.ConfigMap 的创建

1)使用目录创建

kubectl create configmap nginx-html --from-file=/etc/nginx/html
  • --from-file:指定在目录下的所有文件都会被用在 ConfigMap 里边创建一个键值对,键的名字就是文件名,值就是文件里内容。

2)使用文件创建

[root@localhost ~]# kubectl create configmap index-html --from-file=/etc/nginx/html/index.html
  • 指定多个文件:kubctl create configmap index-html --from-file=1.txt --from-file=2.txt

3)使用字面值创建

kubectl create configmap dashboard --from-literal=dashboard.username=root --from-literal=dashboard.password=123123

  • 一般比较常见的便是使用文件创建,因为在有些时候可能需要将配置文件,挂载到容器内。
  • 不过,我们也可以通过挂载数据卷的方式,来实现实现容器与配置文件的解耦。

2.Pod 中使用 ConfigMap

1)使用 ConfigMap 来替代环境变量

[root@localhost ~]# vim 1.yaml
apiVersion: v1								# API 版本 (使用 kubectl explain ConfigMap(具体类型) 即可查看到对应版本号)
kind: ConfigMap								# 类型为 ConfigMap
metadata:
  name: cm-01								# ConfigMap 的名称 (绑定时需要用到)
data:
  hostname: "河北彭于晏"						# Key  Value
  password: "123123"
---
apiVersion: v1
kind: Pod
metadata:
  name: zhangsan
spec:
  containers:
  - name: zhangsan
    image: busybox:1.28.4
    imagePullPolicy: IfNotPresent
    command: ['/bin/sh','-c','env']
    env:									# 配置环境变量
    - name: HostName						# 变量名
      valueFrom:
        configMapKeyRef:
          name: cm-01						# ConfigMap 名称 (要和上面对应)
          key: hostname						# ConfigMap 里边的 Key (要和上面对应)
    - name: Password
      valueFrom:
        configMapKeyRef:
          name: cm-01
          key: password
  restartPolicy: Never						# 当容器退出后. 不会进行重启操作
[root@localhost ~]# kubectl create -f 1.yaml
[root@localhost ~]# kubectl get | grep zhangsan
[root@localhost ~]# kubectl logs zhangsan | egrep 'HostName|Password'

在这里插入图片描述
2)使用 ConfigMap 配置命令行参数

[root@localhost ~]# vim 2.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-01
data:
  hostname: "河北彭于晏"
  password: "123123"
---
apiVersion: v1
kind: Pod
metadata:
  name: zhangsan
spec:
  containers:
  - name: zhangsan
    image: busybox:1.28.4
    imagePullPolicy: IfNotPresent
    command: ['/bin/sh','-c','echo $(hostname) $(password)']
    envFrom:													# 1.6 版本后新增字段
    - configMapRef:
        name: cm-01
  restartPolicy: Never
[root@localhost ~]# kubectl create -f 2.yaml					# 启动前需要先将 1.yaml 文件 delete (因为 Pod 名称一样)
[root@localhost ~]# kubectl get | grep zhangsan
[root@localhost ~]# kubectl logs zhangsan
  • 在 K8s 1.6 版本后引入新字段 envFrom,可以实现 ConfigMap 中所有的 key:value 自动生成为环境变量。
  • envenvFrom 的区别:前者是可以自定义变量名,但需要重复性操作;后者是不能自定义变量名,但是很便捷。
  • configMapKeyRefconfigMapRef 的区别:前者是需要指定 keyconfigmap,后者是只需要指定 configMap 即可。

在这里插入图片描述

3)通过数据卷插件使用 ConfigMap

[root@localhost ~]# kubectl create configmap nginx-html --from-file=/etc/nginx/html/
[root@localhost ~]# vim nginx-html.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.21.0
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
    volumeMounts:
    - name: html								# 挂载数据卷 (要跟下面的 name 名字相同)
      mountPath: /var/www/html					# 容器内的挂载路径
  volumes:
  - name: html									# 创建一个数据卷
    configMap:									# ConfigMap 方式
      name: nginx-html							# 要跟创建的 ConfigMap 相同 (绑定关系)
[root@localhost ~]# kubectl create -f nginx-html.yaml
[root@localhost ~]# kubectl get pod | grep nginx
[root@localhost ~]# kubectl exec -it nginx -- /bin/bash

在这里插入图片描述

这里出现了个问题:就是当我们对 ConfigMap 修改时,挂载到容器内的配置会不会一同修改呢。

请看下面操作:

[root@localhost ~]# kubectl edit configmap nginx-html
[root@localhost ~]# kubectl describe configmap nginx-html | grep -C 8 Data

在这里插入图片描述

还有一个点就是,如果我们修改 ConfigMap 对应的配置文件,容器内的配置还会更新吗。

其实是不会的,请看下面的结构:

index.html  <--  ConfigMap  <--  Container					# 所以修改 index.html 文件并不会使 Container 实现热更新

4)SubPath 作用

  • 同一个 Pod 中多个容器挂载同一个卷时提供隔离;
  • ConfigMapSecret 作为文件挂载到容器中而不覆盖挂载目录下的文件。
[root@localhost ~]# vim nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: zhangsan
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: sub-volume
      mountPath: /zhangsan
  - name: tomcat
    image: tomcat
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: sub-volume
      mountPath: /zhangsan
  volumes:
  - name: sub-volume
    hostPath:									# 数据卷的类型为:挂载到宿主机指定目录
      path: /zhangsan
[root@localhost ~]# kubectl create -f nginx.yaml
[root@localhost ~]# kubectl get pod | grep zhangsan
[root@localhost ~]# kubectl exec -it zhangsan -c nginx -- /bin/bash			#  Pod 内有多个容器时. 需要使用 -c 指定容器

在这里插入图片描述

当我们想要实现在同一数据卷,但数据相互隔离的操作时,就需要用到 SubPath

[root@localhost ~]# vim nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: zhangsan
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: sub-volume
      mountPath: /zhangsan
      subPath: nginx							# 这里的名字会在挂载目录下创建一个相同名字的目录
  - name: tomcat
    image: tomcat
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: sub-volume
      mountPath: /zhangsan
      subPath: tomcat							# 这里的名字会在挂载目录下创建一个相同名字的目录
  volumes:
  - name: sub-volume
    hostPath:
      path: /zhangsan
[root@localhost ~]# kubectl create -f nginx.yaml
[root@localhost ~]# kubectl get pod | grep zhangsan
[root@localhost ~]# kubectl exec -it zhangsan -c nginx -- /bin/bash

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46902396/article/details/121143037