k8s的ConfigMap是什么, 为什么设计ConfigMap, 如何使用ConfigMap

ConfigMap简介, 为什么设计ConfigMap

在k8s中, ConfigMap是一种API对象, 用于将非机密的配置数据存储到键值对中。

Configmap作用是, 把配置数据从应用代码中分隔开, 让镜像和配置文件解耦,实现了镜像的可移植性。

举例:

我有一个Squid(正向代理)的Pod, 需要获取用户配置的白名单做访问控制。 每个用户设置的白名单都不一样, 而且用户可以随时对白名单做增、删、改,所以这个白名单的配置不能写死在代码里。

我们可以把白名单配置存储到k8s的ConfigMap, 这样配置数据和镜像就实现了解耦,Pod中可以动态地获取白名单的配置。

如何使用ConfigMap

使用ConfigMap时, Pod可以将其用作环境变量、命令行参数或存储卷中的配置文件。

下面给出一个具体的案例,将ConfigMap用作存储卷中的配置文件,Pod中通过读取配置文件的内容,就获取到了配置信息。

ConfigMap示例

需求描述: 我有一个Squid的Pod, 用户可以修改一些配置信息,例如:白名单, 父级代理。 要求创建一个ConfigMap存储这些配置,并且将ConfigMap用作存储卷中的配置文件.

配置信息如下:

复制代码
whitelist: www.baidu.com:443,www.google.com:443 # 白名单
customerProxy: 192.168.52.204:3128 # Squid的父级代理

步骤

首先创建一个Squid Pod, 可以参考Squid Pod部署

再创建ConfigMap, 新建文件squid-configmap.yaml, 内容如下:

yaml 复制代码
kind: ConfigMap
apiVersion: v1
metadata:
  name: squid-configmap
  namespace: squid
data:
  whitelist: "www.baidu.com,www.google.com"
  parentProxy: "192.168.52.204:3128"

修改Deployment, 将ConfigMap映射到Pod的/etc/squid-config目录下。 具体做法是编辑squid-deployment.yaml, 添加如下内容:

yaml 复制代码
volumes:
  - name: squid-config-volume
    configMap:
      name: squid-configmap
containers:
  - name: squid
    volumeMounts:
      - mountPath: /etc/squid-config
        name: squid-config-volume

完整的squid-deployment.yaml如下

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: squid
  namespace: squid
  labels:
    name: squid
spec:
  replicas: 1
  selector:
    matchLabels:
      app: squid
  template:
    metadata:
      labels:
        app: squid
    spec:
      volumes:
        - name: squid-volume
          persistentVolumeClaim:
            claimName: squid-claim
        - name: squid-config-volume
          configMap:
            name: squid-configmap
      dnsPolicy: ClusterFirstWithHostNet
      hostNetwork: true
      containers:
        - name: squid
          image: squid:IMAGE_PLACEHOLDER
          imagePullPolicy: IfNotPresent
          livenessProbe:
            httpGet:
              path: /healthz
              port: 5000
            initialDelaySeconds: 5
            periodSeconds: 10
            failureThreshold: 3
          resources:
            limits:
              memory: "4Gi"
          volumeMounts:
            - mountPath: /var/log/squid
              name: squid-volume
            - mountPath: /etc/squid-config
              name: squid-config-volume

应用configmap, deployment, 等待Pod Ready

复制代码
kubectl create -f squid-configmap.yaml
kubectl -n squid delete deploy squid
kubectl create -f squid-deployment.yaml

测试

先确认ConfigMap内容包含了配置信息

复制代码
# kubectl -n squid get cm squid-configmap -o yaml
apiVersion: v1
data:
  customerProxy: 192.168.52.204:3128
  whitelist: www.baidu.com,www.google.com
kind: ConfigMap
metadata:
  ...

再进入Pod,确认/etc/squid-config目录下的文件内容

复制代码
# kubectl -n squid exec -it squid-64bbc7d8f5-dqklp -- /bin/bash
cat /etc/squid-config/customerProxy
192.168.52.204:3128
# cat /etc/squid-config/whitelist
www.baidu.com,www.google.com

编辑configmap中的配置,等待一段时间后进入容器确认/etc/squid-config/的文件内容也随之更新

复制代码
# kubectl -n squid edit cm squid-congfimap
把whitelist的值设置为www.4399.com, 等待一段时间后进入容器中,查看`/etc/squid-config/whitelist`的内容更新为www.4399.com

参考

【1】 Kubernetes Documentation - ConfigMaps

【2】 kubernetes核心技术-ConfigMap

相关推荐
鹤落晴春7 小时前
【K8s】Pod调度、configMaps
云原生·容器·kubernetes
张忠琳7 小时前
【runc 1.4.2】(Part 2)runc 1.4.2 超深度分析 — CLI层:main.go、命令文件、runner、信号处理、TTY
云原生·kubernetes·runc
极客先躯8 小时前
高级java每日一道面试题-2026年02月02日-实战篇[Docker]-如何实现容器的持久化存储?
docker·容器·面试宝典·持久化·存储·韵味·java高级面试题
阿里云云原生9 小时前
AI 提效是“假象”还是“红利”?用 LoongSuite + SLS 构建组织级 AI 编码度量看板
云原生
极客先躯10 小时前
高级java每日一道面试题-2026年02月01日-实战篇[Docker]-Docker Volume 的生命周期管理是怎样的?
java·运维·docker·容器·持久化·架构图·容器卷
Java识堂11 小时前
如何对微服务进行拆分?
微服务·云原生·架构
某林21211 小时前
Isaac Sim 5.1.0 无头服务器部署与 RTX 显存段错误排障全记录
运维·服务器·docker·容器·isaac
m0_7381207212 小时前
Docker 环境下 Vulfocus 靶场搭建全流程(附镜像源问题解决方案)
运维·服务器·网络·安全·docker·容器
Plastic garden13 小时前
K8s知识(3) Pod亲和性,调度
云原生·容器·kubernetes