【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 左右)才能同步更新(见下图)。

相关推荐
掘根2 小时前
【微服务即时通讯】好友管理子服务2
微服务·云原生·架构
Exquisite.2 小时前
Docker容器技术
docker·容器·eureka
Sephiroth.Ma3 小时前
Mac 提示“Docker 已损坏,无法打开”?我这样排查后 10 分钟修好
macos·docker·容器
清水白石0084 小时前
Python 服务优雅停机实战:信号处理、资源收尾与 Kubernetes 滚动发布避坑指南
python·kubernetes·信号处理
是店小二呀4 小时前
Docker部署EasyNode+内网穿透:轻松实现服务器远程管理
服务器·docker·容器
一招定胜负4 小时前
在 Windows 11 家庭版安装 Docker Desktop解决虚拟化问题
运维·docker·容器
i建模4 小时前
Docker API 版本冲突问题
运维·docker·容器
小义_5 小时前
【RH134总结】 八
linux·运维·服务器·云原生·红帽
gordon~95 小时前
docker镜像安装
运维·docker·容器
another heaven5 小时前
【软考 单体式系统与微服务系统】
微服务·云原生·架构