ServiceAccount, Secret, ConfigMap
ServiceAccount
应用场景
- 提供对存储在
Secret
中的敏感信息的只读访问 - 授予跨名字空间访问的权限
- Pod 需要与外部服务器通信
- 使用
imagePullSecret
完成私有镜像仓库的身份认证 - 外部服务需要与 kube-apiserver 通信,如 CI/CD
- 集群上的第 3 方软件,该软件依赖不同 Pod 的 ServiceAccount
手动获取 ServiceAccount Token
TokenRequest API
(推荐)- 以 Volume 的方式挂载(推荐)
- ServiceAccount Token Secret (不推荐)这些 Token 不会过期,有安全隐患,
LegacyServiceAccountTokenNoAutoGeneration
默认启用
Secret 的应用
Secret 可以将少量敏感信息(大小不超过 1M)与应用分离,保存敏感信息的 k8s 对象,如密码,令牌或密钥等信息,可以通过文件的方式挂载到容器中使用,也可以通过环境变量的方式注入到容器中。ConfigMap 可用于保存一些配置文件(大小不超过 1M)。
- 如容器启动注入环境变量
- 向 Pod 提供 SSH 密钥或密码等信息
- 从私有镜像仓库拉取镜像
Secret 的内置类型
以下类型的数据都是用 base64 编码,使用的时候都是自动解码,用户无需干预
Opaque
用户定义的任意数据kubernetes.io/service-account-token
ServiceAccount 的令牌kubernetes.io/dockercfg
~/.docker/config.json 旧版kubernetes.io/dockerconfigjson
~/.docker/config.json 新版kubernetes.io/basic-auth
基本的身份验证kubernetes.io/ssh-auth
SSH 身份的认证的私钥凭据kubernetes.io/tls
用于 TLS 客户端或服务器端的数据bootstrap.kubernetes.io/token
启动引导令牌数据
Secret 的其他要点
- 保持最少特权访问原则
kubernetes.io/enforce-mountable-secrets: "true"
- 将 Secret 标记为不可更改
immutable: true
Secret 的替代方案
- 可以使用 ServiceAccount 替代
- 可是使用设备插件来替代
- 对于身份验证,可以使用
CertificateSigningRequest
定制的签名验证来为 Pod 发放证书 - 可以使用第三方工具,来提供机密数据
Secret 使用的良好实践
集群管理员
- 配置静态加密,配置 kube-apiserver 使用
EncryptionConfiguration
对象对 Secret 进行对称加解密 - 配置 Secret 资源的最小特权访问
- 组件:限制仅最高特权的系统级组件可以访问,仅在组件的正常行为需要时才授予权限
- 人员:限制对 Secret 的访问,仅允许集群管理员访问 etcd
- 对访问 Secret 的用户或 Pod(因为用户可以通过 Pod 访问到 Secret)做记录
- 在 ServiceAccount 上使用
kubernetes.io/enforce-mountable-secrets
注解来强制执行有关如何在 Pod 中使用 Secret 的特定规则 - 改进 etcd 的管理策略,不在使用 etcd 所使用的持久存储时,考虑格式化对应的设备;在多个 etcd 实例之间使用 SSL/TLS 通信以保护传输中的 Secret
- 配置对外部 Secret 的访问,可以使用第三方 Secret 的解决方案,然后配置 Pod 访问该数据
开发者
- 限制特定容器集合才能访问 Secret,如果一个 Pod 中仅有一个容器需要访问 Secret,则可以 mount volume 或者使用环境变量的方式,避免其他容器访问该 Secret
- 读取后保护 Secret 数据,应用程序必须避免以明文记录 Secret 数据,必须避免将这些数据传输给不受信任的一方
- 避免共享 Secret manifest,提防 Secret manifest 中包含 base64 编码的数据
ConfigMap 的应用
ConfigMap 可以为应用提供配置文件信息,如
nginx
配置文件- 应用启动所需准备的配置文件
Secret 与 ConfigMap 的对比
相同之处:
- 二者都可以通过环境变量的方式注入容器
- 二者都可以通过文件的方式挂载到容器内部
- 二者的大小限制都是不超过 1M
- 都可以设置为
immutable: true
- 二者的访问都可以单独配置对应的权限
- 对于以文件方式挂载,二者都支持热更新,但是如果使用了
subPath
则容器不会接收到更新,当然设置了immutable: true
就不会有任何作用了
不同之处:
- Secret 保存的都是通过 base64 编码或者其他加密方式经过处理的数据
- ConfigMap 保存的数据是原始数据,没有对数据做任何加工处理
- ConfigMap 需要保证数据信息是 KV 结构才能以环境变量的方式注入容器
- Secret 需要自己设置对应的环境变量名称去注入到容器
- Secret 可以使用定制的方式,对机密数据加密与解密
- Secret 存储敏感信息,ConfigMap 存储非敏感信息