1.1 前言

应用部署的一个最佳实践是将应用所需的配置信息与程序分离,这样可以使应用程序被更好地复用,通过不同的配置也能实现更灵活的功能。将应用打包为容器镜像后,可以通过环境变量或者外挂文件的方式在创建容器时进行配置注入,但在大规模容器集群的环境中,对多个容器进行不同的配置将变得非常复杂。

FROM nginx:1.24.0
COPY ./xxxx.conf  /etc/nginx/conf.d

1.2 ConfigMap简介

官网:https://kubernetes.io/zh-cn/docs/concepts/configuration/configmap/

ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。ConfigMap 将你的环境配置信息和 容器镜像 解耦,便于应用配置的修改。

从 Kubernetes 1.2 开始提供了一种统一的应用配置管理方案— ConfigMap。 ConfigMap 具有命名空间隔离性!

1.3 ConfigMap 使用方式

  1. 生成容器内的环境变量。
  2. 以 Volume 的形式挂载为容器内部的文件或目录。

ConfigMap 以一个或多个 key:value 的形式保存在 Kubernetes 系统中供应用使用,既可以用于表示一个变量的值(例如 name=maoxiansheng ), 也可以用于表示一个完整配置文件的内容(例如 server.xml=<? xml...>... )。

1.4 ConfigMap 创建方式

1.4.1 基于目录的形式创建 ConfigMap

# Step 1:准备测试文件
$ vim test.conf
server {
   listen   80;
   server_name test.tanke.love;
   location / {
     root /data/test;
     index  index.html  index.htm;
   }
}

$ vim study.conf
server {
   listen   80;
   server_name study.tanke.love;
   location / {
     root /data/study;
     index  index.html  index.htm;
   }
}

# Step 2:基于目录的形式创建ConfigMap
$ kubectl create cm filedir --from-file=configmap/

# Step 3:查看ConfigMap资源
$ kubectl get cm filedir

# Step 4:查看创建ConfigMap资源清单
$ kubectl get cm filedir -oyaml

1.4.2 基于文件的形式创建 ConfigMap

# Step 1:通过文件形式创建(使用场景最多,声明变量多使用,少则使用命令行形式创建)
$ vim study.conf
server {
   listen   80;
   server_name study.tanke.love;
   location / {
     root /data/study;
     index  index.html  index.htm;
   }
}

$ kubectl create cm test-file-cm --from-file=study.conf (如果需要还可以继续添加--from-file=***)

# Step2:查看创建的ConfigMap资源清单
$ kubectl get cm test-file-cm -oyaml

# Step 3:创建ConfigMap时修改配置文件的名称(了解)
$ kubectl create cm test-file-cm  --from-file=study.conf=default.conf

--from-file=env02.conf=env.conf 解析:--from-file=<新文件名称>=<源文件名称>

1.4.3 基于环境变量的形式创建 ConfigMap

# Step1:创建环境变量形式的ConfigMap
$ vim mysql-configmap.conf
MYSQL_ROOT_PASSWORD=root
MYSQL_USER=maoxiansheng
MYSQL_PASSWORD=maoxiansheng

# Step 2:创建ConfigMap资源
$ kubectl create cm mysql-env  --from-env-file=mysql-configmap.conf

# Step 3:查看资源清单
$ kubectl get cm mysql-env -oyaml
apiVersion: v1
data:
  MYSQL_PASSWORD: maoxiansheng
  MYSQL_ROOT_PASSWORD: root
  MYSQL_USER: maoxiansheng
kind: ConfigMap
metadata:
  creationTimestamp: "2025-08-18T11:15:52Z"
  name: mysql-env
  namespace: default
  resourceVersion: "404905"
  uid: f9e0cce2-d317-495c-a6ad-46ea08d8f459

1.4.4 基于命令行的形式创建 ConfigMap

$ kubectl create cm mysql-cm --from-literal=MYSQL_ROOT_PASSWORD=root  --from-literal=MYSQL_USER=maoxiansheng --from-literal=MYSQL_PASSWORD=maoxiansheng

1.5 ConfigMap 的资源使用

1.5.1 ConfigMap 少数变量配置

# Step 1:准备测试文件
$ vim mysql-env.conf
MYSQL_ROOT_PASSWORD=root
MYSQL_USER=maoxiansheng
MYSQL_PASSWORD=maoxiansheng

# Step 2:创建ConfigMap资源
$ kubectl create cm mysql-env  --from-env-file=mysql-env.conf

# Step 3:创建资源清单
$ vim mysql-pod.yml
---
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
spec:
  containers:
  - name: mysql
    image: m.daocloud.io/docker.io/mysql:8.0
    env:
    - name: MYSQL_ROOT_PASSWORD
      valueFrom:
        configMapKeyRef:
          name: mysql-env
          key: MYSQL_ROOT_PASSWORD
    - name: MYSQL_USER
      valueFrom:
        configMapKeyRef:
          name: mysql-env
          key: MYSQL_USER
    - name: MYSQL_PASSWORD
      valueFrom:
        configMapKeyRef:
          name: mysql-env
          key: MYSQL_PASSWORD
    - name: MYSQL_DATABASE
      value: maoxiansheng
    ports:
    - containerPort: 3306


# Step 5:创建deploy资源
$ kubectl apply -f mysql-pod.yml

# Step 6:进入MySQL Pod
$ kubectl exec -it mysql-pod  -- bash

# Step 7:登录MySQL
bash-5.1# mysql -uroot -proot

1.5.2 ConfigMap 多环境变量配置

场景:多个环境变量需要注入,直接性 ConfigMap 文件全部注入,使用较多。

# Step 1:创建资源清单
$ vim mysql-pods.yml
---
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pods
spec:
  containers:
  - name: mysql
    image: m.daocloud.io/docker.io/mysql:8.0
    envFrom: 			      # 固定语法格式
    - configMapRef:    	# 固定语法格式
        name: mysql-env   # configMap名称

# Step 2:创建资源
$ kubectl apply -f mysql-pods.yml

# Step 3:查看变量是否注入Pod中
$ kubectl exec mysql-pods -- env | grep MYSQL

提示:同一个 Configmap 资源可以被多个 Pod 挂载呦!

1.5.3 Prefix 参数使用(了解)

为方便区分环境变量是否是以 ConfigMap 形式注入 Pod 中,在 yaml 文件中添加prefix(场景较少)

# Step 1:准备测试文件
$ vim mysql-env.conf
ROOT_PASSWORD=root
USER=maoxiansheng
PASSWORD=maoxisheng

# Step 2:创建Configmap
$ kubectl create cm mysql-env  --from-env-file=mysql-env.conf

# Step 3:创建资源清单
$ vim mysql-pods.yml
---
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pods
spec:
  containers:
  - name: mysql
    image: m.daocloud.io/docker.io/mysql:8.0
    envFrom: 			      # 固定语法格式
    - configMapRef:    	# 固定语法格式
        name: mysql-env   # configMap名称
      # 添加如下参数
      prefix: MYSQL_ # 名称自己拟定,相当于给变量名加一个前缀

# Step 4:创建资源
$ kubectl create -f mysql-pods.yml

# Step 5:查看容器内环境变量
$ kubectl exec  mysql-pods  -- env | grep MYSQL

1.5.4 ConfigMap 文件形式挂载

以配置文件形式挂在容器中,一个容器可以挂载多个 ConfigMap。但是挂载路径不能重复,容器启动时就会加载配置文件。

# Step 1:准备测试文件
$ vim default.conf
server {
    listen       80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    location /status {
        stub_status on;
     }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

# Step 2:创建ConfigMap资源
$ kubectl create cm nginx-conf --from-file=default.conf 

# Step 3:查看ConfigMap资源清单内容
$ kubectl get cm nginx-conf -oyaml

# Step 4:创建nginx pod,并把cm挂载容器中
$ vim nginx-pods.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pods
spec:
  containers:
  - image: registry.cn-hangzhou.aliyuncs.com/hujiaming/nginx:1.24.0
    name: nginx
    volumeMounts:
    - name: nginxconf
      mountPath: /etc/nginx/conf.d           # 挂载路径
  volumes:
    - name: nginxconf
      configMap:
        name: nginx-conf                     # configMap名称

# Step 5:创建deploy资源
$ kubectl apply -f nginx-pods.yaml 

# Step 6:查看Pod IP地址
$ kubectl get po -owide
nginx-pods               1/1     Running   0             14s     172.16.215.205   prod-k8s-master01   <none>           <none>

# Step 7:测试
$ curl 172.16.215.205/status

当 ConfigMap 配置文件出现变动时,如果程序可以实现热加载功能,会定时自动加载挂载的 ConfigMap ;如果程序不实现热加载,配置文件变动则挂载的 ConfigMap 不会变动。

1.5.5 ConfigMap 的限制条件

  1. ConfigMap 必须在 Pod 之前创建,Pod 才能引用。
  2. 如果 Pod 使用 envFrom 基于 ConfigMap 定义环境变量,则无效的环境变量名称(例如名称以数字开头)将被忽略。
  3. ConfigMap 受命名空间限制,只有处于相同命名空间中的 Pod 才可以引用。
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐