type
status
date
slug
summary
tags
category
password

1、概述

ConfigMap 和 Secret 是 Kubernetes 用来将配置数据与容器应用分离的 API 对象。它们允许你将配置数据(如配置文件、环境变量、命令行参数)外部化,从而提高容器化应用程序的可移植性。
ConfigMap 和 Secret 的特性对比:
特性
ConfigMap
Secret
数据敏感性
非敏感配置数据
敏感信息(密码、令牌等)
存储编码
明文
Base64编码(非加密)
kubectl get
直接显示明文值
仅显示Opaque和大小,不显示内容
典型用途
应用配置、环境变量、命令行参数
数据库密码、API密钥、TLS证书、镜像仓库密码
资源类型
命名空间级别
命名空间级别
大小限制
~1MiB
~1MiB

2、ConfigMap

ConfigMap 用于存储非敏感的、明文的配置数据,比如配置文件、环境变量、命令行参数等。
ConfigMap 的核心特性:
  • 明文存储:数据以明文形式存储(Base64编码不是必须的,与Secret不同)。
  • 存储非敏感数据:适用于配置如数据库地址、端口、功能开关、日志级别等不包含密码、密钥的信息。
  • 命名空间资源:ConfigMap 是命名空间(Namespace)级别的资源,只能在同一个命名空间内的 Pod 中引用。
  • 数据大小限制:单个 ConfigMap 的数据大小大约限制在 1MiB 以内。

2.1 创建 ConfigMap

有多种方式可以创建 ConfigMap:
方式一:通过命令行从字面值创建
方式二:通过命令行从文件创建(非常适合挂载配置文件)
假设你有一个 nginx.conf 配置文件:
方式三:通过 YAML 清单文件创建

2.2 在 Pod 中使用 ConfigMap

主要有两种方式将 ConfigMap 的数据注入到 Pod 的容器中:
方式一:作为环境变量(Environment Variables)
方式二:作为卷(Volume)挂载(最常用)
这种方式会将 ConfigMap 中的每个键都变成一个文件,键值就是文件内容。非常适合挂载整个配置文件。
挂载后,容器内 /etc/config/ 目录下会出现四个文件:player_initial_livesui_properties_file_namegame.propertiesuser-interface.properties

3、Secret

Secret 用于存储敏感信息,如密码、OAuth令牌、SSH密钥等。但不是绝对安全,因为只是 Base64 编码而不是加密。
Secret 的核心特性:
  • Base64编码存储:数据在etcd中默认以Base64编码形式存储。(注意:Base64是编码,不是加密!可轻松解码。)
  • 存储敏感数据:专为密码、令牌、密钥等设计。
  • 命名空间资源:同 ConfigMap。
  • 类型(Type):Secret有多种类型,用于不同用途,最常见的是Opaque(用户自定义数据)。

3.1 创建 Secret

方式一:通过命令行从字面值创建
方式二:通过命令行从文件创建
方式三:通过 YAML 清单文件创建(需要手动Base64编码)
  1. 先对数据进行Base64编码:
    1. 创建YAML文件 secret.yaml
      1. 应用YAML文件:kubectl apply -f secret.yaml

      3.2 在 Pod 中使用 Secret

      用法与 ConfigMap 极其相似。
      方式一:作为环境变量(不推荐用于高度敏感的数据)
      环境变量可能被意外泄露(如日志记录、核心转储),因此对于极其敏感的数据,建议使用卷挂载。
      方式二:作为卷挂载(推荐)
      Secret卷由tmpfs(基于内存的文件系统)支持,永远不会写入磁盘,更安全。
      挂载后,容器内 /etc/secret/ 目录下会出现两个文件:username 和 password。当你读取这些文件时,得到的是自动解码后的原始明文数据
      特殊类型:imagePullSecrets,用于存储拉取私有镜像仓库的认证信息,这是一种特殊的使用方式:

      4、最佳实践

      1. 明确区分:严格遵守“敏感数据用 Secret,非敏感数据用 ConfigMap”的原则。
      1. Secret并非绝对安全:默认的Base64编码不是加密,任何有API访问权限的人都能解码获取原始数据。对于生产环境,务必启用etcd的静态加密
      1. 避免通过环境变量传递Secret:环境变量有意外暴露的风险(日志、调试信息)。对于高度敏感的数据,优先使用卷挂载
      1. 不可更新性:ConfigMap和Secret被挂载为卷后,其更新不是立即同步的,有一定的延迟。更新后,kubelet会最终同步到Pod,但依赖于cacheTTL的设置。
      1. 不可变配置:对于不会更改的配置,可以设置 immutable: true,提升性能和安全型。
      1. 使用stringData字段(仅Secret):在 Secret 的 YAML 中,你可以使用stringData字段直接写入明文,Kubernetes会在创建时自动为你做Base64编码。
        Docker系列:ContainerdKubernetes系列:数据存储(Volumn、PV、PVC、StorageClass)
        Loading...