在 Kubernetes 中管理应用配置和敏感信息是核心需求。ConfigMap 用于存储非敏感配置数据(如环境变量、配置文件),而 Secret 专用于存储敏感信息(如密码、密钥),两者都通过键值对形式存储数据,并支持挂载为环境变量或文件供 Pod 使用。
特性 | ConfigMap | Secret |
---|---|---|
数据类型 | 非敏感配置(如环境变量、配置文件) | 敏感数据(密码、密钥、Token) |
存储格式 | 明文存储(YAML/JSON) | Base64 编码(非加密!) |
典型应用 | 应用配置文件、命令行参数 | 数据库密码、API 密钥、TLS 证书 |
安全风险 | 低(禁止存敏感信息) | 中(需配合 RBAC/加密增强安全性) |
大小限制 | 1MB(etcd 限制) | 1MB(同 ConfigMap) |
更新机制 | 热更新(volume 类型需处理) | 需重启 Pod(环境变量方式) |
官方参考文档:ConfigMap详细配置
#基于目录创建
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
kubectl create configmap special-config --from-literal=special.how=very --from-literal=log_level=INFO
[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通过环境变量和存储卷都注入到容器中了。
官方参考文档:Sercet详细配置
内置类型 | 作用 |
Opaque(默认) | base64编码格式的Secret,用来存储密码、密钥等 |
kubernetes.io/tls | 用于 TLS 客户端或者服务器端的数据 |
kubernetes.io/dockerconfigjson |
Docker 仓库认证,用来存储私有docker registry的认证信息 |
# 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
将 Secret 中定义的值 backend-username 赋给 SECRET_USERNAME 环境变量。
[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
[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中需要导入Docker私有镜像仓库的登录信息,才能从私有仓库拉取镜像,登录信息的存储使用Secret加密存储。
kubectl create secret docker-registry liux-harbor --docker-username=admin --docker-password=12366 [email protected] --docker-server=harbor.liux.com
注意,请确保你创建的用户必须在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
通过合理使用 ConfigMap 与 Secret,您将实现 Kubernetes 应用配置的安全、高效管理,确保敏感信息与镜像解耦,提升部署的灵活性与安全性。