K8s-配置管理中心 configmap

发布于:2025-08-15 ⋅ 阅读:(11) ⋅ 点赞:(0)

在 Kubernetes 里,ConfigMap(配置管理中心)是用来存储和管理配置数据的一种对象,可以把应用的配置信息从代码中分离出来,方便修改和维护。

一、ConfigMap 的核心作用

  • 解耦配置和镜像

    • 你不需要每次改配置都重新打镜像,只改 ConfigMap 就行。

  • 集中管理配置

    • 在集群内所有 Pod 都能读取到同一份配置。

  • 多种挂载方式

    • 可以作为 环境变量命令行参数文件挂载 到容器中。

1、Configmap 是 k8s 中的资源, 相当于配置文件,可以有一个或者多个 Configmap
2、Configmap 可以做成 Volume,k8s pod 启动之后,通过 volume 形式映射到容器内
部指定目录上
3、容器中应用程序按照原有方式读取容器特定目录上的配置文件。
4、在容器看来,配置文件就像是打包在容器内部特定目录,整个过程对应用没有任何
侵入。

二、创建 ConfigMap 的方法

1、直接用 YAML 定义

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
  namespace: default
data:
  APP_ENV: production
  APP_PORT: "8080"
  db.conf: |
    host=127.0.0.1
    port=3306
    user=root


kubectl apply -f configmap.yaml

2、命令行创建(键值对)

kubectl create configmap app-config \
  --from-literal=APP_ENV=production \
  --from-literal=APP_PORT=8080

3、从文件创建

kubectl create configmap app-config \
  --from-file=nginx.conf \
  --from-file=db.conf

4、指定目录创建 configmap

[root@k8s1 ~]# mkdir test-a 
[root@k8s1 ~]# cd test-a/ 
[root@k8s1 test-a]# cat my-server.cnf 
server-id=1 
[root@k8s1 test-a]# cat my-slave.cnf 
server-id=2 

#指定目录创建 configmap 
[root@k8s1 test-a]# kubectl create configmap mysql-config --
from-file=/root/test-a/ 

#查看 configmap 详细信息 
[root@k8s1 test-a]# kubectl describe configmap mysql-config 
Name: mysql-config 
Namespace: default 
Labels: <none> 
Annotations: <none> 
Data 
==== 
my-server.cnf: 
---- 
server-id=1 
my-slave.cnf: 
---- 
server-id=2 
Events: <none>

三、在 Pod 中使用 ConfigMap

1、作为环境变量

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: myapp
    image: nginx
    env:
    - name: APP_ENV
      valueFrom:
        configMapKeyRef:
          name: app-config
          key: APP_ENV

2、全部作为环境变量导入

envFrom:
- configMapRef:
    name: app-config

3、挂载为文件

volumeMounts:
- name: config-volume
  mountPath: /etc/config
volumes:
- name: config-volume
  configMap:
    name: app-config

这样 ConfigMap 中的每个 key 都会变成 /etc/config/ 下的一个文件。

更新 ConfigMap

kubectl edit configmap app-config
kubectl apply -f configmap.yaml

更新 ConfigMap 不会自动更新已运行的 Pod,通常需要 kubectl rollout restart deployment 重新加载。

4、使用 configMapKeyRef

###创建一个存储 MySQL 配置的 ConfigMap
vim mysql-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  labels:
    app: mysql
data:
  log: "1"
  lower: "1"


kubectl apply -f mysql-configmap.yaml
##创建一个 Pod,引用 ConfigMap 中的内容

vim mysql-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
spec:
  containers:
  - name: mysql
    image: busybox
    command: ["/bin/sh", "-c", "sleep 3600"]
    env:
    - name: log_bin        # 定义环境变量 log_bin
      valueFrom:
        configMapKeyRef:
          name: mysql      # 指定 ConfigMap 的名字
          key: log         # 指定 ConfigMap 中的 key
    - name: lower          # 定义环境变量 lower
      valueFrom:
        configMapKeyRef:
          name: mysql
          key: lower
  restartPolicy: Never



kubectl apply -f mysql-pod.yaml

###验证环境变量

kubectl exec -it mysql-pod -- /bin/sh
/ # printenv
log_bin=1
lower=1

5、环境变量引入:使用 envfrom

vim mysql-pod-envfrom.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod-envfrom
spec:
  containers:
  - name: mysql
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ["/bin/sh", "-c", "sleep 3600"]
    envFrom:
    - configMapRef:
        name: mysql   # 指定 ConfigMap 的名字
  restartPolicy: Never


kubectl apply -f mysql-pod-envfrom.yaml 

kubectl exec -it mysql-pod-envfrom -- /bin/sh
/ # printenv 
lower=1 
log=1

6、把 configmap 做成 volume,挂载到 pod

vim  mysql-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  labels:
    app: mysql
data:
  log: "1"
  lower: "1"
  my.cnf: |           # 多行内容(文件)
    [mysqld]
    Welcome=xiaop




log 和 lower 是普通的键值对(环境变量风格)。

my.cnf 使用了 | 代表多行字符串,这在挂载成文件时非常有用。

my.cnf 的内容会原样写入到 Pod 中的文件。
##Pod(挂载 ConfigMap 为文件)

vim mysql-pod-volume.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod-volume
spec:
  containers:
  - name: mysql
    image: busybox
    command: ["/bin/sh", "-c", "sleep 3600"]
    volumeMounts:
    - name: mysql-config
      mountPath: /tmp/config     # 挂载路径
  volumes:
  - name: mysql-config
    configMap:
      name: mysql                # 对应 ConfigMap 的名字
  restartPolicy: Never



volumes.configMap.name 指定使用的 ConfigMap。

volumeMounts.mountPath 指定挂载到容器内部的路径(这里是 /tmp/config)。

ConfigMap 里的每个 key 会变成一个文件:

log → /tmp/config/log

lower → /tmp/config/lower

my.cnf → /tmp/config/my.cnf

文件内容就是 ConfigMap 中对应 key 的值。
##验证效果

# 创建 ConfigMap
kubectl apply -f mysql-configmap.yaml

# 创建 Pod
kubectl apply -f mysql-pod-volume.yaml

# 进入容器
kubectl exec -it mysql-pod-volume -- /bin/sh

# 查看挂载的 ConfigMap 文件
cd /tmp/config
ls
# 输出:
# log  lower  my.cnf

# 查看文件内容
cat log
# 1
cat lower
# 1
cat my.cnf
# [mysqld]
# Welcome=xiaop

####有待补充。。。。。

网站公告

今日签到

点亮在社区的每一天
去签到