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_lives
, ui_properties_file_name
, game.properties
, user-interface.properties
。3、Secret
Secret 用于存储敏感信息,如密码、OAuth令牌、SSH密钥等。但不是绝对安全,因为只是 Base64 编码而不是加密。
Secret 的核心特性:
- Base64编码存储:数据在
etcd
中默认以Base64编码形式存储。(注意:Base64是编码,不是加密!可轻松解码。)
- 存储敏感数据:专为密码、令牌、密钥等设计。
- 命名空间资源:同 ConfigMap。
- 类型(Type):Secret有多种类型,用于不同用途,最常见的是
Opaque
(用户自定义数据)。
3.1 创建 Secret
方式一:通过命令行从字面值创建
方式二:通过命令行从文件创建
方式三:通过 YAML 清单文件创建(需要手动Base64编码)
- 先对数据进行Base64编码:
- 创建YAML文件
secret.yaml
:
- 应用YAML文件:
kubectl apply -f secret.yaml
3.2 在 Pod 中使用 Secret
用法与 ConfigMap 极其相似。
方式一:作为环境变量(不推荐用于高度敏感的数据)
环境变量可能被意外泄露(如日志记录、核心转储),因此对于极其敏感的数据,建议使用卷挂载。
方式二:作为卷挂载(推荐)
Secret卷由
tmpfs
(基于内存的文件系统)支持,永远不会写入磁盘,更安全。挂载后,容器内
/etc/secret/
目录下会出现两个文件:username
和 password
。当你读取这些文件时,得到的是自动解码后的原始明文数据。特殊类型:
imagePullSecrets
,用于存储拉取私有镜像仓库的认证信息,这是一种特殊的使用方式:4、最佳实践
- 明确区分:严格遵守“敏感数据用 Secret,非敏感数据用 ConfigMap”的原则。
- Secret并非绝对安全:默认的Base64编码不是加密,任何有API访问权限的人都能解码获取原始数据。对于生产环境,务必启用
etcd
的静态加密。
- 避免通过环境变量传递Secret:环境变量有意外暴露的风险(日志、调试信息)。对于高度敏感的数据,优先使用卷挂载。
- 不可更新性:ConfigMap和Secret被挂载为卷后,其更新不是立即同步的,有一定的延迟。更新后,kubelet会最终同步到Pod,但依赖于
cacheTTL
的设置。
- 不可变配置:对于不会更改的配置,可以设置
immutable: true
,提升性能和安全型。
- 使用
stringData
字段(仅Secret):在 Secret 的 YAML 中,你可以使用stringData
字段直接写入明文,Kubernetes会在创建时自动为你做Base64编码。
- Author:mcbilla
- URL:http://mcbilla.com/article/26685c7d-7c1d-80d8-a5c3-e34ceab9edb7
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts