Kubernetes 配置管理全解析:ConfigMap 与 Secret 核心机制
Kubernetes中ConfigMap和Secret是管理应用配置和敏感数据的关键机制。ConfigMap用于存储非敏感配置,支持热更新;Secret专用于密码、密钥等敏感信息,采用Base64编码。两者都支持通过环境变量或文件挂载方式,但Secret需配合RBAC确保安全。最佳实践包括:启用Secret加密存储、按环境分离配置、避免敏感信息通过环境变量传递。ConfigMap适用于应用配置、特
在 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通过环境变量和存储卷都注入到容器中了。

三、 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挂载到容器中了。


5.案例2: 导入Docker Registry认证信息
在Kubernetes中需要导入Docker私有镜像仓库的登录信息,才能从私有仓库拉取镜像,登录信息的存储使用Secret加密存储。
5.1 响应式创建harbor的认证信息
kubectl create secret docker-registry liux-harbor --docker-username=admin --docker-password=12366 --docker-email=admin@liux.com --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 应用配置的安全、高效管理,确保敏感信息与镜像解耦,提升部署的灵活性与安全性。
更多推荐

所有评论(0)