文章中如果有图看不到,可以点这里去 csdn 看看。从那边导过来的,文章太多,没法一篇篇修改好。

【K8S】Kubernetes ConfigMap 的来源与工作原理

一、ConfigMap 的来源

ConfigMap 是 K8s 提供的 配置抽象,用于存放 非敏感的配置信息(键值对)。
它的来源主要有以下几种:

  1. YAML 清单创建

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: app-config
    data:
      LOG_LEVEL: "debug"
      APP_MODE: "production"
    
  2. 命令行直接创建

    # 从字面值
    kubectl create configmap app-config --from-literal=LOG_LEVEL=debug --from-literal=APP_MODE=production
    
    # 从文件
    kubectl create configmap app-config --from-file=config.properties
    
  3. 集成外部配置系统

    • 通过 Config Operator自定义控制器,将 Git/Consul/Etcd/数据库中的配置同步为 ConfigMap。
    • GitOps(ArgoCD/Fleet)模式 下,ConfigMap 也是作为 CRD 管理的一部分。

二、ConfigMap 的工作原理

1. 存储与管理

  • ConfigMap 以标准 K8s 资源对象的形式存储在 etcd 中(和 Pod/Service 一样)。
  • 用户通过 kubectl apply 或 API Server 写入数据时,API Server 会调用 etcd 保存数据
kubectl get configmap app-config -o yaml

会直接从 API Server 获取 etcd 中的数据。


2. Pod 使用方式

Pod 使用 ConfigMap 有三种常见方式:

a) 环境变量注入

containers:
  - name: app
    image: nginx
    env:
      - name: LOG_LEVEL
        valueFrom:
          configMapKeyRef:
            name: app-config
            key: LOG_LEVEL

原理:

  • kubelet 在启动容器前,从 API Server 获取 ConfigMap,注入容器环境变量。
  • 一旦容器启动,环境变量是 不可变 的(除非 Pod 重启)。

b) Volume 挂载

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

原理:

  • kubelet 使用 ConfigMap Volume 插件 将 ConfigMap 数据写入临时文件系统(tmpfs)。
  • 容器看到的是 目录挂载,文件名对应 key,文件内容对应 value
  • ConfigMap 发生变化时,Volume 中的文件会自动更新(kubelet 定期 watch API Server 事件)。

⚠️ 注意:容器应用是否能感知配置更新,取决于应用自身是否支持 热加载


c) 命令行参数(结合 Downward API)

containers:
  - name: app
    image: myapp
    command: ["./start.sh", "--log-level=$(LOG_LEVEL)"]
    env:
      - name: LOG_LEVEL
        valueFrom:
          configMapKeyRef:
            name: app-config
            key: LOG_LEVEL

通过环境变量间接注入到容器启动命令。


3. 控制面与数据面流程(源码视角)

  1. 用户提交 ConfigMap

    • kubectl apply -f configmap.yaml
    • API Server 处理请求,写入 etcd。
  2. Pod 引用 ConfigMap

    • kube-scheduler 调度 Pod 到 Node。
    • kubelet 拉取 PodSpec,发现其依赖 ConfigMap。
  3. kubelet 从 API Server 获取 ConfigMap

    • 通过 informer(watch API Server)监听 ConfigMap 对象。
    • 将数据同步到本地缓存。
  4. kubelet 挂载到 Pod

    • 如果是 env:直接在 PodSpec 中注入值,容器启动时生效。
    • 如果是 volume:调用 projected volume 插件,将 ConfigMap 写入宿主机临时目录,然后挂载进容器。
  5. 更新机制

    • kubelet 持续 watch ConfigMap,如果数据更新:

      • Volume 挂载方式:文件更新。
      • 环境变量方式:Pod 不会自动更新,除非重新创建。

三、ConfigMap 的特性与限制

特性

  • 支持最大 1MB 数据(超过需考虑外部存储)。
  • 支持动态更新(仅 Volume 挂载方式)。
  • 与 Pod 解耦(配置与应用分离)。

限制

  • 环境变量注入后不可变。
  • 无加密(敏感信息要用 Secret)。
  • 大规模集群中,频繁更新 ConfigMap 可能导致 etcd 压力过大。

四、典型使用场景

  • 应用配置中心(应用启动参数、业务参数)。
  • 日志级别、开关配置(如 debug/production)。
  • 轻量级 Feature Flag。
  • 结合 kubectl rollout restart 实现配置变更触发应用重启。

五、ConfigMap 工作机制图

env 注入
volume 挂载
kubectl apply -f configmap.yaml
API Server
etcd 存储
Kubelet (watch ConfigMap)
Pod 环境变量
/etc/config (tmpfs)

总结:
ConfigMap 的来源主要是 YAML/命令行/外部系统同步,本质上存储在 etcd 中。
Pod 引用 ConfigMap 时,kubelet 会 watch API Server 并将数据注入 Pod(env/volume)
它保证了 配置与应用解耦,但同时要注意 更新机制和性能瓶颈

六、Kubernetes ConfigMap 深入解析

1. ConfigMap 的来源与设计初衷

在容器化与微服务架构中,应用通常会将配置与代码解耦,避免将配置硬编码到镜像中。
Docker 容器时代,配置多依赖:

  • 环境变量
  • 配置文件挂载
  • 参数传递(docker run -e KEY=VALUE

但这些方法在大规模集群中显得零散且难以统一管理。

Kubernetes 设计 ConfigMap,作为一种 API 对象,用于集中化存储和管理非敏感配置,并且可以与 Pod 动态结合,实现灵活的应用配置管理。

💡 类似于 etcd 的配置中心 + Linux 环境变量/文件系统抽象


2. ConfigMap 的核心原理

  • 存储位置:ConfigMap 以 Key-Value 键值对存储在 etcd 中。

  • 资源对象:它是一个 Kubernetes 内建资源,属于 配置类对象(和 Secret 类似)。

  • 挂载方式

    1. 作为环境变量 → Pod 启动时从 ConfigMap 注入环境变量
    2. 作为卷挂载(Volume) → 将 ConfigMap 中的 Key-Value 渲染成文件
    3. 被 K8s 控制器引用 → 比如 Deployment/StatefulSet 的配置部分引用 ConfigMap

3. ConfigMap 的工作机制

环境变量
Volume
SubPath 动态挂载
ConfigMap 定义 YAML
apiserver 接收请求
存入 etcd 持久化
Pod Spec 引用 ConfigMap
挂载方式
Pod 中通过 $ENV_KEY 使用
Pod 文件系统中生成配置文件
仅挂载单个 key 文件

4. ConfigMap 使用方式

4.1 创建 ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_MODE: "production"
  APP_PORT: "8080"
  log.properties: |
    log.level=INFO
    log.path=/var/log/app.log

4.2 在 Pod 中使用

方式一:作为环境变量

envFrom:
- configMapRef:
    name: app-config

方式二:作为 Volume 挂载

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

方式三:指定 key 挂载

volumes:
- name: log-config
  configMap:
    name: app-config
    items:
    - key: log.properties
      path: log.properties

5. ConfigMap 的特性

  • 解耦配置与镜像:应用镜像无需修改即可通过 ConfigMap 更新配置。
  • 动态更新(有限制):当 ConfigMap 更新后,通过 Volume 挂载的文件会自动更新,但 环境变量不会动态更新(Pod 重启才能生效)。
  • 与 Secret 区分:ConfigMap 用于非敏感数据(日志级别、配置参数),Secret 用于敏感数据(密码、证书)。
  • 命名空间隔离:ConfigMap 是 Namespaced 资源,只能在本 Namespace 内使用。

6. 使用场景

  • 应用环境配置(运行模式、端口、参数等)
  • 日志、监控配置(log4j 配置文件、Prometheus scrape config)
  • 数据库连接参数(非敏感部分,如 host/port,密码走 Secret)
  • 应用开关控制(Feature Flags)

7. 优缺点

优点

  • 配置集中化管理
  • 镜像与配置解耦
  • 可通过 Volume 实现配置热更新
  • 适配多种应用场景(文件/环境变量)

缺点

  • 环境变量方式不可热更新 → 需要重启 Pod
  • 不适合存放大文件(最佳 < 1MB)
  • 更新需要注意回滚策略(如 Pod 未重启导致新旧配置不一致)
  • 配置安全性较低(敏感数据必须用 Secret)

8. ConfigMap 与 Secret 对比

特性ConfigMapSecret
主要用途非敏感配置敏感数据
数据存储明文存储Base64 编码(仍需加密)
动态更新支持Volume 挂载支持Volume 挂载支持
安全性无特殊保护可启用加密、RBAC 控制更严格
典型应用应用配置、参数密码、Token、证书

9. 源码与底层实现简析

  1. 存储层

    • ConfigMap 本质是 K8s 的 API 对象,最终存储在 etcd 中。
  2. Pod 引用逻辑

    • kube-apiserver 接收 ConfigMap 请求 → 存储到 etcd。
    • kubelet 在调度 Pod 时,解析 PodSpec 中的 configMapRef
    • 若是 Volume 挂载,kubelet 会在 /var/lib/kubelet/pods/.../volumes/kubernetes.io~configmap/ 下生成文件,再挂载到容器。
    • 若是 环境变量注入,则在 Pod 启动时由 kubelet 注入容器环境变量,之后不会变更。
  3. 热更新机制

    • 通过 Informer + watch 机制,kubelet 监听 ConfigMap 更新事件,重新生成 Volume 中的文件。
    • 容器进程内的环境变量不可更新,因此此方式需要 Pod 重启。

七、configmap 的生命周期

环境变量 envFrom/configMapKeyRef
Volume 挂载 configMap volume
用户提交 ConfigMap YAML
kube-apiserver 接收请求
存储到 etcd
ConfigMap 对象创建成功
Pod 是否引用?
ConfigMap 保存在 etcd
仅作为配置资源存在
kube-scheduler 调度 Pod
kubelet 拉取 PodSpec
引用方式
Pod 启动时注入 env
不可热更新
kubelet 将 config 写入临时目录
挂载到容器 FS
支持热更新
Informer watch ConfigMap 变化
ConfigMap 更新?
kubelet 监听事件
刷新 Volume 文件
保持现有配置
ConfigMap 删除
kube-apiserver 移除 etcd 中数据
Pod 中挂载路径失效/报错

总结

  • ConfigMap 是 Kubernetes 中配置管理的核心资源,实现了配置与应用的解耦。
  • 三大使用方式:环境变量、Volume 挂载、子路径文件。
  • 动态更新:仅 Volume 方式支持热更新,环境变量不支持。
  • 与 Secret 对比:ConfigMap 管普通配置,Secret 管敏感数据。
  • 最佳实践:结合 ConfigMap + Secret + RBAC + Operator 自动化,实现安全可控的配置管理。
posted @ 2025-10-04 20:40  NeoLshu  阅读(0)  评论(0)    收藏  举报  来源