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

相关推荐
自律的kkk4 分钟前
docker配置镜像加速器
运维·docker·容器
Lill_bin1 小时前
JVM内部结构解析
jvm·后端·spring cloud·微服务·云原生·ribbon
青云交2 小时前
大数据新视界 --大数据大厂之Kubernetes与大数据:容器化部署的最佳实践
数据库·kubernetes·容器编排·资源管理·大数据处理·扩展性、故障恢复·存储持久化·监控、日志管理、性能提升
苏少朋2 小时前
Docker安装 ▎Docker详细讲解 ▎数据卷挂载 ▎Nginx安装理解
linux·nginx·docker·容器
晚枫20002 小时前
kafka发送事件的几种方式
spring boot·分布式·docker·容器·kafka·intellij-idea·linq
二进制杯莫停2 小时前
初识zookeeper
分布式·zookeeper·云原生
StevenZeng学堂3 小时前
【Kubernetes笔记】为什么DNS解析会超时?
网络协议·docker·云原生·kubernetes
云计算练习生4 小时前
深入剖析Docker容器安全:挑战与应对策略
安全·docker·容器
wellshake6 小时前
在 Docker 中部署无头 Chrome:在 Browserless 中运行
chrome·docker·容器
爱吃龙利鱼15 小时前
nginx实现https安全访问的详细配置过程
运维·nginx·安全·云原生·https