乐闻世界logo
搜索文章和话题

Kubernetes ConfigMap 和 Secret 的区别是什么?如何使用它们管理应用配置?

2月21日 15:53

Kubernetes ConfigMap 和 Secret 是用于管理配置数据的两种重要资源,它们允许将配置与容器镜像分离,提高应用的可移植性和安全性。

ConfigMap

ConfigMap 用于存储非敏感的配置数据,如应用配置文件、命令行参数、环境变量等。

ConfigMap 的创建方式

  1. 从字面值创建
bash
kubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2
  1. 从文件创建
bash
kubectl create configmap my-config --from-file=config.properties
  1. 从目录创建
bash
kubectl create configmap my-config --from-file=./config-dir/
  1. 从 YAML 文件创建
yaml
apiVersion: 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 的使用方式

  1. 作为环境变量
yaml
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: nginx env: - name: KEY1 valueFrom: configMapKeyRef: name: my-config key: key1
  1. 作为命令行参数
yaml
apiVersion: 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
  1. 挂载为文件
yaml
apiVersion: 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 的类型

  1. Opaque:默认类型,用于存储任意用户数据

  2. kubernetes.io/service-account-token:用于存储 Service Account 令牌

  3. kubernetes.io/dockercfg:用于存储 Docker registry 凭据

  4. kubernetes.io/dockerconfigjson:用于存储 Docker registry JSON 配置

  5. kubernetes.io/basic-auth:用于存储基本认证凭据

  6. kubernetes.io/ssh-auth:用于存储 SSH 认证凭据

  7. kubernetes.io/tls:用于存储 TLS 证书

Secret 的创建方式

  1. 从字面值创建
bash
kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=secret123
  1. 从文件创建
bash
kubectl create secret generic my-secret --from-file=./username.txt --from-file=./password.txt
  1. 从 YAML 文件创建
yaml
apiVersion: v1 kind: Secret metadata: name: my-secret type: Opaque data: username: YWRtaW4= password: c2VjcmV0MTIz

注意:Secret 的 data 字段中的值必须是 Base64 编码的。

  1. 使用 stringData
yaml
apiVersion: v1 kind: Secret metadata: name: my-secret type: Opaque stringData: username: admin password: secret123

stringData 会自动进行 Base64 编码。

Secret 的使用方式

Secret 的使用方式与 ConfigMap 类似:

  1. 作为环境变量
yaml
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: nginx env: - name: USERNAME valueFrom: secretKeyRef: name: my-secret key: username
  1. 挂载为文件
yaml
apiVersion: 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
  1. 拉取镜像
yaml
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: my-private-registry/my-image imagePullSecrets: - name: registry-secret

ConfigMap 与 Secret 的区别

特性ConfigMapSecret
数据类型非敏感数据敏感数据
存储方式明文存储Base64 编码(非加密)
访问控制普通 RBAC更严格的 RBAC
大小限制1 MiB1 MiB
挂载方式文件、环境变量文件、环境变量

安全最佳实践

  1. 使用 Secret 存储敏感数据:永远不要将密码、密钥等敏感信息存储在 ConfigMap 中。

  2. 启用 Secret 加密:使用 KMS(Key Management Service)对 etcd 中的 Secret 进行加密。

  3. 限制 Secret 访问:使用 RBAC 限制对 Secret 的访问权限。

  4. 使用临时文件:将 Secret 挂载为临时文件(tmpfs),避免持久化到磁盘。

  5. 定期轮换密钥:定期更新 Secret 中的敏感信息。

  6. 使用外部密钥管理:对于高安全性要求,考虑使用外部密钥管理系统(如 HashiCorp Vault)。

  7. 审计 Secret 访问:启用审计日志,记录对 Secret 的访问。

注意事项

  1. Base64 不是加密:Secret 中的数据只是 Base64 编码,不是加密,需要额外的安全措施。

  2. 大小限制:ConfigMap 和 Secret 都有 1 MiB 的大小限制,超出限制需要拆分。

  3. 版本管理:ConfigMap 和 Secret 的更新不会自动触发 Pod 重启,需要使用 Deployment 的滚动更新或手动重启。

  4. 不可变性:可以将 ConfigMap 和 Secret 设置为不可变(immutable),提高性能和安全性。

标签:Kubernetes