目录
基本概念
Kubernetes为我们提供了两种配置资源对象,用来管理一些敏感数据的配置以及业务数据的配置,ConfigMap
和 Secret
是 Kubernetes 中用于管理配置数据的两种资源类型,二者在功能上有许多相似之处,但主要区别在于它们的用途和数据处理方式,ConfigMap和Secret的数据都是存储在Kubernetes的etcd中。
ConfigMap
用于存储非敏感的配置数据,如配置信息、环境变量、命令行参数等。数据以键值对的形式存储,数据以明文存储,适合存储不需要保护的配置信息,创建ConfigMap有以下几种方式:
通过yaml配置键值对:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config-yaml
data:
database_url: jdbc:mysql://localhost:3306/mydb
log_level: INFO
通过命令直接配置:
kubectl create configmap my-config \
--from-literal=key1=value1 \
--from-literal=key2=value2
从文件创建:
echo "app.name=MyApp" > app.properties
echo "app.version=1.0" >> app.properties
kubectl create configmap my-config-file \
--from-file=app.properties
在pod中使用ConfigMap:
- 直接配置键值对
env: - name: APP_CONFIG_KEY1 valueFrom: configMapKeyRef: name: example-config //configMap对象名称 key: key1 // configMap中定义的key
-
通过挂载的方式使用ConfigMap(适用配置数据大的场景):
// 将配置内容存储为文件 echo -e "key1=value1\nkey2=value2" > app.properties kubectl create configmap example-config --from-file=app.properties // 创建pod并挂载configMap apiVersion: v1 kind: Pod metadata: name: configmap-example-pod spec: containers: - name: app-container image: nginx volumeMounts: - name: config-volume mountPath: /etc/config # 配置文件挂载路径,将configmap内容挂载到/etc/config路径 volumes: - name: config-volume configMap: name: example-config # 引用 ConfigMap // 验证pod是否挂载成功 kubectl exec -it configmap-example-pod -- /bin/bash cat /etc/config/app.properties 输出结果: key1=value1 key2=value2
Secret
用于存储敏感数据,如密码、令牌、证书等。数据以键值对的形式存储,并且支持编码和加密,默认以Base64编码存储,以保证安全性。Secret有以下几种创建方式:
用Base64编码数据配置键值对:
apiVersion: v1
kind: Secret
metadata:
name: example-secret
type: Opaque
data:
username: dXNlcm5hbWU= # Base64 编码的 'username'
password: cGFzc3dvcmQ= # Base64 编码的 'password'
基于明文创建(k8s会默认用Base64编码):
kubectl create secret generic db-user-pass \
--from-literal=username=admin \
--from-literal=password='S!B\*d$zDsb='
挂载文件:
echo "my-secret-username" > username.txt
echo "my-secret-password" > password.txt
kubectl create secret generic example-secret --from-file=username.txt --from-file=password.txt
//输出结果
apiVersion: v1
kind: Secret
metadata:
name: example-secret
data:
username.txt: bXktc2VjcmV0LXVzZXJuYW1l
password.txt: bXktc2VjcmV0LXBhc3N3b3Jk
pod中使用secret:
- 直接应用键值对
apiVersion: v1 kind: Pod metadata: name: pod-with-secret-env spec: containers: - name: my-container image: nginx env: - name: USERNAME valueFrom: secretKeyRef: name: my-secret //secret对象名称 key: username //secret对象定义的key - name: PASSWORD valueFrom: secretKeyRef: name: my-secret key: password
- 挂载文件
apiVersion: v1 kind: Pod metadata: name: pod-with-secret-volume spec: containers: - name: my-container image: nginx volumeMounts: - name: secret-volume mountPath: "/etc/secret" //将my-secret对象挂载到容器的指定路径下 readOnly: true volumes: - name: secret-volume secret: secretName: my-secret
配置对比
ConfigMap和Secret都是kubernetes内置的资源配置对象,对应不同的使用场景,也有差别。
数据存储形式
特性 | ConfigMap | Secret |
数据类型 | 明文存储 | Base64编码存储 |
数据加密支持 | 不支持 | 支持加密 |
典型用途 | 配置文件、环境变量等非敏感数据 | 密码、API密钥 |
数据访问形式
访问方式 | ConfigMap | Secret |
作为环境变量挂载 | 支持 | 支持 |
作为文件挂载 | 支持 | 支持 |
直接在Pod中引用 | 支持 | 支持(以Base64解码形式提供给容器) |
安全性
特性 | ConfigMap | Secret |
存储安全性 | 明文存储,无加密保护 | 存储支持加密 |
RBAC权限控制 | 支持 | 支持 |
默认保护机制 | 无特殊保护机制 | 受集群安全组件限制,防止非授权访问 |