【kubernetes】配置管理中心Configmap运用

一,介绍

Configmap(简写 cm)是k8s中的资源对象,用于保存非机密性的配置的,数据可以用key/value键值对的形式保存,也可通过文件的形式保存。

【局限性】:在ConfigMap不是用来保存大量数据的,其数据量不可超过1 MiB。

python 复制代码
kubectl get cm

二,功能

Configmap资源对象,可以有一个 或者多个Configmap,通过 volume 形式映射到容器内部指定目录上,容器中应用程序按照原有方式读取容器特定目录上的配置文件,最总实现统一的配置管理。

三,两种方式

configmap注入方式有两:

  • 一种是将configMap做为存储卷
  • 一种是将configMap通过env中configMapKeyRef,注入到容器中。

四,应用场景

  • 1、当需要将应用配置写进代码中,更新配置也需要打包镜像时。
    configmap可以将配置信息和docker镜像解耦,以便实现镜像的可移植性和可复用性,因为一个configMap其实就是一系列配置信息的集合,可直接注入到Pod中给容器使用。
  • 2、当搭建使用微服务架构,在多个服务共用配置时。
    如果每个服务中单独一份配置的话,那么更新配置就很麻烦,使用configmap可以友好的进行配置共享。

五,创建方法

1,指定"key/value"创建

直接在命令行中,通过--from-literal指定参数,创建configmap。更为常用!

python 复制代码
# 指定key1=config1和key2=config2来创建
kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2

2,指定"配置文件"创建

key1和key2 分别指定一个配置文件,可以连续多个--from-file使用。

python 复制代码
kubectl create configmap my-config --from-file=key1=/path/config-dir/file1.txt --from-file=key2=/path/config-dir/file2.txt

3,指定"目录"创建

目录path/config-dir/下,存放所有配置文件

python 复制代码
kubectl create configmap my-config --from-file=path/config-dir/

4,编写"configmap清单"创建

yaml 复制代码
# cat mysql-configmap.yaml 

apiVersion: v1
kind: ConfigMap     # 指定cm类型
metadata:
  name: mysql       # 指定名称
  labels:
    app: mysql      # 指定cm的标签
data:               # 指定cm数据
  master.cnf: |     # 具体数据名称1
    [mysqld]
    log-bin
    log_bin_trust_function_creators=1
    lower_case_table_names=1
  slave.cnf: |      # 具体数据名称2
    [mysqld]
    super-read-only
    log_bin_trust_function_creators=1

【注意】

  • 符合| 表示,以下内容按"行" 显示。

六,使用

下面以configmap名为mdy-cm为例。做如下进入pod操作:

1,通过环境变量引入,使用valueFrom.configMapKeyRef

yaml 复制代码
# cat mdy-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mdy-pod-configmap
spec:
  containers:
  - name: mdy-pod-tep-configmap
    image: busybox
    command: ["/bin/sh","-c","sleep 3600"]
    imagePullPolicy: IfNotPresent
    env:                       # 引用变量
    - name: mysql-user         # 该名称 定义的是容器内的变量
      valueFrom:               # 数据来源
        configMapKeyRef:       # 通过valueFrom.configMapKeyRef加载 configmap
          name: mdy-cm         # 指定之前定义的 configmap资源名称
          key: mysql.com       # 指定之前定义的 configmap资源中的key, 将value赋值给上面容器内定义的变量
    - name: mysql-pwd          # 同上
      valueFrom:
        configMapKeyRef:
          name: mdy-cm
          key: nginx.conf
  restartPolicy: Never

2,通过环境变量引入:使用envfrom

yaml 复制代码
# cat mdy-pod-envFrom.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mdy-pod-configmap-envfrom
spec:
  containers:
  - name: mdy-pod-tep-configmap-envfrom
    image: busybox
    command: ["/bin/sh","-c","sleep 3600"]
    imagePullPolicy: IfNotPresent
    envFrom:                      # 引入变量
    - configMapRef:               # 定义数据来源configmap
        name: mdy-cm              # 明确configmap的资源名称
  restartPolicy: Never

3,把configmap做成volume,挂载到pod 【常用方式】

该种方式类似与持久化存储。以文件形式挂载到容器内部。

yaml 复制代码
# cat mdy-pod-volume.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: mdy-pod-configmap-volume
spec:
  containers:
  - name: mdy-pod-tep-configmap-volume
    image: busybox
    command: ["/bin/sh","-c","sleep 3600"]
    imagePullPolicy: IfNotPresent
    volumeMounts:                         # 容器内部挂载引入         
    - name: configmap-volume              # 指定挂载卷的名字
      mountPath: /tmp/config              # 容器内挂载指定路径目录
  volumes:                                # 挂载卷
  - name: configmap-volume                # 挂载卷名称,必须在上面指定
    configMap:                            # 采用configmap形式挂载
      name: mdy-cm                        # 之前生成configmap的名称
  restartPolicy: Never

以上三种方式不同:

  • 第一种:通过给容器定义变量名A,然后将configmap中 B=C的值C,赋值给A。即 A = C
  • 第二种:不在定义变量A,直接将configmap中 B=C,作为变量 加载到容器内。即 B = C
  • 第三章:以挂载卷的形式,加载到容器内部。此种方式更为常用

七,Configmap热更新

更新 ConfigMap 的值以后:

1,使用该 ConfigMap 挂载的 "Env"是不会同步更新的。(见下图)

2,使用该 ConfigMap 挂载的" Volume" 中的数据需要一段时间(大概10s 左右)才能同步更新(见下图)。

相关推荐
能不能别报错6 小时前
K8s学习笔记(十六) 探针(Probe)
笔记·学习·kubernetes
能不能别报错8 小时前
K8s学习笔记(十四) DaemonSet
笔记·学习·kubernetes
火星MARK9 小时前
k8s面试题
容器·面试·kubernetes
Serverless社区10 小时前
阿里云函数计算 AgentRun 全新发布,构筑智能体时代的基础设施
阿里云·云原生·serverless·函数计算
赵渝强老师11 小时前
【赵渝强老师】Docker容器的资源管理机制
linux·docker·容器·kubernetes
能不能别报错12 小时前
K8s学习笔记(十五) pause容器与init容器
笔记·学习·kubernetes
稚辉君.MCA_P8_Java12 小时前
kafka解决了什么问题?mmap 和sendfile
java·spring boot·分布式·kafka·kubernetes
乄bluefox12 小时前
保姆级docker部署nacos集群
java·docker·容器
每天进步一点_JL12 小时前
Docker 是什么?
后端·docker·容器
一叶飘零_sweeeet13 小时前
从 0 到 1 掌控云原生部署:Java 项目的 Docker 容器化与 K8s 集群实战指南
docker·云原生·kubernetes·项目部署