Kubernetes 配置管理全解析:ConfigMap 与 Secret 核心机制

       在 Kubernetes 中管理应用配置和敏感信息是核心需求。ConfigMap 用于存储非敏感配置数据(如环境变量、配置文件),而 Secret 专用于存储敏感信息(如密码、密钥),两者都通过键值对形式存储数据,并支持挂载为环境变量或文件供 Pod 使用。

一、核心概念对比

特性 ConfigMap Secret
数据类型 非敏感配置(如环境变量、配置文件) 敏感数据(密码、密钥、Token)
存储格式 明文存储(YAML/JSON) Base64 编码(非加密!)
典型应用 应用配置文件、命令行参数 数据库密码、API 密钥、TLS 证书
安全风险 低(禁止存敏感信息) 中(需配合 RBAC/加密增强安全性)
大小限制 1MB(etcd 限制) 1MB(同 ConfigMap)
更新机制 热更新(volume 类型需处理) 需重启 Pod(环境变量方式)

二、ConfigMap:应用配置中心

官方参考文档:ConfigMap详细配置

1.核心概念

  • 作用:解耦容器镜像与配置,存储非机密数据(如端口号、配置文件、命令行参数)。ConfigMap 允配置文件与属性文件分离,以使容器化的用程序具有可移植性。
  • 数据格式:键值对(Key-Value),值可以是短字符串或完整配置文件内容(如 JSON、XML、Properties)。

2.使用方式

  • Kubernetes 空间都可以使用
  • 可以作变量或者路文件使用
  • Pod支持自动更新

3.创建方式

#基于目录创建
kubectl create configmap nginx-config --from-file=nginx-conf/

#从文件创建(如 nginx.conf)
kubectl create configmap nginx --from-file=./nginx.conf


# 从字面量创建
kubectl create configmap app-config --from-literal=user=admin

4.案例1:在 ConfigMap 中将环境变量定义为键

5.1 创建configmap
kubectl create configmap special-config --from-literal=special.how=very  --from-literal=log_level=INFO
5.2 pod中引用configmap
[root@master-1 volumes]# cat pods-volumes-configmap.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: volumes-env-configmap
spec:
  volumes:
  - name: data
    # 指定存储卷类型为configMap
    configMap:
      # 指定configMap的名称
      name: nginx-conf
  containers:
  - name: web
    image: nginx:1.22.1
    imagePullPolicy: IfNotPresent
    #基于存储卷的方式挂载
    volumeMounts:
    - name: data
      mountPath: /etc/nginx/conf.d/
    #环境变量配置部分
    env:
    - name: SPECIAL_LEVEL_KEY
      valueFrom:
        configMapKeyRef:
          name: special-config
          key: special.how
    - name: LOG_LEVEL
      valueFrom:
        configMapKeyRef:
          name: special-config
          key: log_level
[root@master-1 volumes]# kubectl apply -f  pods-volumes-configmap.yaml 
[root@master-1 volumes]# kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE
volumes-env-configmap   1/1     Running   0          7m7s

       如下所示,configmap通过环境变量和存储卷都注入到容器中了。

Kubernetes 配置管理全解析:ConfigMap 与 Secret 核心机制_第1张图片

三、 Secret:敏感信息保险箱

 官方参考文档:Sercet详细配置

1.核心概念

  • 作用:安全存储敏感信息(如密码、API 密钥、TLS 证书)。Secret解决了密token、密等敏感据的配置问题,而不需要把些敏感据暴露到像或者Pod Spec中。Secret可以以Volume或者境变量的方式使用。
  • 编码方式:数据以 Base64 编码存储(非加密!)。

2.Secret类型

内置类型 作用
Opaque(默认)

base64编码格式的Secret,用、密

kubernetes.io/tls

用于 TLS 客户端或者服务器端的

kubernetes.io/dockerconfigjson

Docker 仓库认证,用私有docker registry的认证信息

3.Secret集中创建方式

# 01 基于命令行方式
kubectl create secret generic my-secrets-02 --from-literal=username=YWRtaW4K --from-literal=password=MTIzNjYK

#基于命令行创建nginx.yaml
kubectl create secret generic nginx --from-file=nginx.conf


# 02 基于配置文件创建
[root@master-1 secrets]# echo admin |base64
YWRtaW4K
[root@master-1 secrets]# echo 12366 |base64
MTIzNjYK
[root@master-1 secrets]# vim secret-userinfo.yaml 

apiVersion: v1
kind: Secret
metadata:
  name: my-secrets-01
data:
  # 对于Secret的值进行base64编码,当Pod的容器使用secret时会自动对数据进行解码
  username: YWRtaW4K
  password: MTIzNjYK
[root@master231 secrets]# kubectl apply -f secret-userinfo.yaml 
secret/my-secrets-01 created
[root@master231 secrets]# kubectl get secrets
NAME                                 TYPE                                  DATA   AGE
my-secrets-01                        Opaque                                2      82s

4.案例1:使用Secret 据定义容器变量(命令行方式)

       将 Secret 中定义的值 backend-username 赋给 SECRET_USERNAME 境变量。

4.1 以命令行方式创建secret
[root@master-1 volumes]#  kubectl create secret generic backend-user --from-literal=backend-username='backend-admin'
secret/backend-user created
[root@master-1 volumes]#  kubectl get secret backend-user -o yaml
apiVersion: v1
data:
  backend-username: YmFja2VuZC1hZG1pbg==
kind: Secret
metadata:
  creationTimestamp: "2025-07-21T05:37:14Z"
  name: backend-user
  namespace: default
  resourceVersion: "52740"
  selfLink: /api/v1/namespaces/default/secrets/backend-user
  uid: 1bf48214-d103-48d6-ba11-1798a66aa964
type: Opaque
4.2 pod中引用secret
[root@master-1 volumes]# cat pods-volumes-secret-001.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: volumes-env-secret
spec:
  volumes:
  - name: data
    # 指定存储卷类型为secret
    secret:
      # 指定secret的名称
      secretName: backend-user
  containers:
  - name: web
    image: nginx:1.22.1
    imagePullPolicy: IfNotPresent
    #基于存储卷的方式挂载
    volumeMounts:
    - name: data
      mountPath: /liux-secrets
    #环境变量配置部分
    env:
    - name: SECRET_USERNAME   # 环境变量名称(将注入容器运行时)
      valueFrom:     # 指定值来源(从其他K8s资源获取)
        secretKeyRef:  # 引用Secret资源中的特定键值
          name: backend-user       # Secret资源名称(需提前存在)
          key: backend-username    # Secret中的键名(对应实际存储的值)

[root@master-1 volumes]# kubectl apply -f pods-volumes-secret-001.yaml
pod/volumes-env-secret created
[root@master-1 volumes]# kubectl get pods
NAME                 READY   STATUS    RESTARTS   AGE
volumes-env-secret   1/1     Running   0          6s

[root@master-1 volumes]# kubectl exec -it volumes-env-secret -- sh
# env
...
SECRET_USERNAME=backend-admin

       如下所示,已经将secret定义的值引入到pod容器的环境变量中了,也通过volumes挂载到容器中了。

Kubernetes 配置管理全解析:ConfigMap 与 Secret 核心机制_第2张图片Kubernetes 配置管理全解析:ConfigMap 与 Secret 核心机制_第3张图片

5.案例2: Docker Registry认证信息

       在Kubernetes中需要导入Docker私有镜像仓库的登录信息,才能从私有仓库拉取镜像,登录信息的存使用Secret加密存

5.1 响应式创建harbor的认证信息
kubectl create secret docker-registry liux-harbor --docker-username=admin --docker-password=12366 [email protected] --docker-server=harbor.liux.com
5.2 Pod引用secret

      注意,请确保你创建的用户必须在harbor中对相应的项目有访问权限!

[root@master-1 pod]# cat pods-harbor-secrets.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: secrets-harbor-001
spec:
  # 指定harbor的secret认证信息,可以指定多个。
  imagePullSecrets:
  - name: liux-harbor
  containers:
  - name: web
    image: harbor.liux.com/liux-apps/apps:v1
     # 指定镜像的拉取策略,若不指定,当tag为latest时,默认是Always,当tag非latest时,则默认策略为IfNotPresent
    imagePullPolicy: Always
    # imagePullPolicy: IfNotPresent

[root@master-1 pod]# kubectl apply -f pods-harbor-secrets.yaml 

四、最佳实践与安全要点

1.Secret 安全增强

  • 启用加密存储:配置 Kubernetes API Server 使用--encryption-provider-config加密 ETCD 中的 Secret。
  • 最小权限原则:通过 RBAC 限制 Secret 访问权限
  • 避免环境变量传递:防止敏感信息在日志或环境变量中暴露

2.动态更新支持

  • ConfigMap/Secret 更新后,挂载为文件的卷会自动同步更新(默认更新周期约 1 分钟)。
  • 环境变量不支持热更新,需重建 Pod。

3.配置分离策略

  • 按环境(dev/test/prod)创建不同的 ConfigMap/Secret。

五、典型应用场景

1.ConfigMap

  • 数据库连接地址(非密码部分)
  • 应用特性开关(Feature Flags)
  • Nginx 配置文件

2.Secret

  • 账户密码
  • SSH 私钥
  • Cloud Provider API Token

       通过合理使用 ConfigMap 与 Secret,您将实现 Kubernetes 应用配置的安全、高效管理,确保敏感信息与镜像解耦,提升部署的灵活性与安全性。

你可能感兴趣的:(Kubernetes 配置管理全解析:ConfigMap 与 Secret 核心机制)