Kubernetes ConfigMap 和 Secret 是用于管理配置数据的两种重要资源,它们允许将配置与容器镜像分离,提高应用的可移植性和安全性。
ConfigMap
ConfigMap 用于存储非敏感的配置数据,如应用配置文件、命令行参数、环境变量等。
ConfigMap 的创建方式
- 从字面值创建:
bashkubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2
- 从文件创建:
bashkubectl create configmap my-config --from-file=config.properties
- 从目录创建:
bashkubectl create configmap my-config --from-file=./config-dir/
- 从 YAML 文件创建:
yamlapiVersion: v1 kind: ConfigMap metadata: name: my-config data: key1: value1 key2: value2 app.properties: | server.port=8080 database.url=jdbc:mysql://localhost:3306/mydb
ConfigMap 的使用方式
- 作为环境变量:
yamlapiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: nginx env: - name: KEY1 valueFrom: configMapKeyRef: name: my-config key: key1
- 作为命令行参数:
yamlapiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: nginx command: ["/bin/sh", "-c"] args: ["echo $(KEY1)"] env: - name: KEY1 valueFrom: configMapKeyRef: name: my-config key: key1
- 挂载为文件:
yamlapiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: nginx volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: my-config
Secret
Secret 用于存储敏感信息,如密码、OAuth 令牌、SSH 密钥、证书等。
Secret 的类型
-
Opaque:默认类型,用于存储任意用户数据
-
kubernetes.io/service-account-token:用于存储 Service Account 令牌
-
kubernetes.io/dockercfg:用于存储 Docker registry 凭据
-
kubernetes.io/dockerconfigjson:用于存储 Docker registry JSON 配置
-
kubernetes.io/basic-auth:用于存储基本认证凭据
-
kubernetes.io/ssh-auth:用于存储 SSH 认证凭据
-
kubernetes.io/tls:用于存储 TLS 证书
Secret 的创建方式
- 从字面值创建:
bashkubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=secret123
- 从文件创建:
bashkubectl create secret generic my-secret --from-file=./username.txt --from-file=./password.txt
- 从 YAML 文件创建:
yamlapiVersion: v1 kind: Secret metadata: name: my-secret type: Opaque data: username: YWRtaW4= password: c2VjcmV0MTIz
注意:Secret 的 data 字段中的值必须是 Base64 编码的。
- 使用 stringData:
yamlapiVersion: v1 kind: Secret metadata: name: my-secret type: Opaque stringData: username: admin password: secret123
stringData 会自动进行 Base64 编码。
Secret 的使用方式
Secret 的使用方式与 ConfigMap 类似:
- 作为环境变量:
yamlapiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: nginx env: - name: USERNAME valueFrom: secretKeyRef: name: my-secret key: username
- 挂载为文件:
yamlapiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: nginx volumeMounts: - name: secret-volume mountPath: /etc/secrets volumes: - name: secret-volume secret: secretName: my-secret
- 拉取镜像:
yamlapiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: my-private-registry/my-image imagePullSecrets: - name: registry-secret
ConfigMap 与 Secret 的区别
| 特性 | ConfigMap | Secret |
|---|---|---|
| 数据类型 | 非敏感数据 | 敏感数据 |
| 存储方式 | 明文存储 | Base64 编码(非加密) |
| 访问控制 | 普通 RBAC | 更严格的 RBAC |
| 大小限制 | 1 MiB | 1 MiB |
| 挂载方式 | 文件、环境变量 | 文件、环境变量 |
安全最佳实践
-
使用 Secret 存储敏感数据:永远不要将密码、密钥等敏感信息存储在 ConfigMap 中。
-
启用 Secret 加密:使用 KMS(Key Management Service)对 etcd 中的 Secret 进行加密。
-
限制 Secret 访问:使用 RBAC 限制对 Secret 的访问权限。
-
使用临时文件:将 Secret 挂载为临时文件(tmpfs),避免持久化到磁盘。
-
定期轮换密钥:定期更新 Secret 中的敏感信息。
-
使用外部密钥管理:对于高安全性要求,考虑使用外部密钥管理系统(如 HashiCorp Vault)。
-
审计 Secret 访问:启用审计日志,记录对 Secret 的访问。
注意事项
-
Base64 不是加密:Secret 中的数据只是 Base64 编码,不是加密,需要额外的安全措施。
-
大小限制:ConfigMap 和 Secret 都有 1 MiB 的大小限制,超出限制需要拆分。
-
版本管理:ConfigMap 和 Secret 的更新不会自动触发 Pod 重启,需要使用 Deployment 的滚动更新或手动重启。
-
不可变性:可以将 ConfigMap 和 Secret 设置为不可变(immutable),提高性能和安全性。