解释k8s种ConfigMap和Secret的作用,如何在Pod中挂载环境变

一、ConfigMap & Secret 核心定位

属于Kubernetes的配置管理特性,用于解耦应用与配置

1. ConfigMap

作用 :存储非敏感配置数据
存储内容

  • 环境变量
  • 命令行参数
  • 配置文件(如JSON/XML/YAML)
  • 系统参数(如JVM参数)
2. Secret

作用 :存储敏感信息
存储内容

  • 数据库凭证
  • API密钥
  • TLS证书
  • SSH密钥
对比特性
特性 ConfigMap Secret
数据加密 明文存储 Base64编码
适用场景 非敏感配置 凭证/密钥
存储限制 1MB 1MB
自动更新 支持(需配置) 支持(需配置)

二、Pod挂载方式

1. 环境变量注入
yaml:pod-env.yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
    - name: app
      image: myapp:v1
      env:
        - name: DB_HOST
          valueFrom:
            configMapKeyRef:
              name: db-config
              key: host
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: password
2. 文件卷挂载
yaml:pod-volume.yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
    - name: app
      image: myapp:v1
      volumeMounts:
        - name: config-volume
          mountPath: /etc/app/config
        - name: secret-volume
          mountPath: /etc/app/secret
  volumes:
    - name: config-volume
      configMap:
        name: app-config
    - name: secret-volume
      secret:
        secretName: app-secret

三、最佳实践

  1. 敏感数据必用Secret:即使Base64不是加密,也比明文安全
  2. 热更新策略
    • 环境变量方式:修改后需重建Pod
    • 文件卷方式:kubelet定期同步更新(默认1分钟间隔)
  3. 配置分离:按环境(dev/test/prod)创建不同ConfigMap
  4. 权限控制:通过RBAC限制Secret访问权限

四、创建配置示例

创建ConfigMap:

bash 复制代码
kubectl create configmap app-config \
  --from-literal=DB_HOST=mysql-service \
  --from-literal=CACHE_ENABLED=true

创建Secret:

bash 复制代码
# 从文件创建
kubectl create secret generic db-credentials \
  --from-file=./ssl.cert \
  --from-literal=password='S!B\#d3z'

# 专门类型Secret
kubectl create secret tls https-cert \
  --cert=path/to/cert.crt \
  --key=path/to/cert.key

上述配置实现了什么功能?开发时如何创建对应的ConfigMap和Secret?

yaml:deployment.yaml 复制代码
apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      - name: app
        envFrom:        # 环境变量注入方式
        - configMapRef: # 加载 ConfigMap 所有键值作为环境变量
            name: app-config
        - secretRef:    # 加载 Secret 所有键值作为环境变量
            name: db-credentials
相关推荐
小猿姐21 小时前
唯品会大规模数据库云原生实践:基于 KubeBlocks 管理数千实例的统一运维之路
运维·elasticsearch·云原生
阿里云云原生1 天前
AgentTeams 和 Claude Tag 都进入群聊模式,是新范式还是新叙事?
云原生·agent
阿里云云原生2 天前
Higress v2.2.3 发布:正式入驻 CNCF Sandbox,AI Gateway 与 Ingress 迁移能力双向加固
云原生
lichenyang4533 天前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang4533 天前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang4533 天前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
阿里云云原生3 天前
香港站【企业 AI Agent 工程化实战专场】来啦,邀您7月9日见!
云原生·agent
阿里云云原生3 天前
研发域与运维域的“数字握手”:通过 Agentic Skills 实现 DevOps 全链路自动化
云原生
运维开发故事5 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson7 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js