ServiceAccount, Secret, ConfigMap


ServiceAccount

应用场景

  1. 提供对存储在 Secret 中的敏感信息的只读访问
  2. 授予跨名字空间访问的权限
  3. Pod 需要与外部服务器通信
  4. 使用imagePullSecret完成私有镜像仓库的身份认证
  5. 外部服务需要与 kube-apiserver 通信,如 CI/CD
  6. 集群上的第 3 方软件,该软件依赖不同 Pod 的 ServiceAccount

手动获取 ServiceAccount Token

  1. TokenRequest API(推荐)
  2. 以 Volume 的方式挂载(推荐)
  3. ServiceAccount Token Secret (不推荐)这些 Token 不会过期,有安全隐患,LegacyServiceAccountTokenNoAutoGeneration默认启用

Secret 的应用

Secret 可以将少量敏感信息(大小不超过 1M)与应用分离,保存敏感信息的 k8s 对象,如密码,令牌或密钥等信息,可以通过文件的方式挂载到容器中使用,也可以通过环境变量的方式注入到容器中。ConfigMap 可用于保存一些配置文件(大小不超过 1M)。

  1. 如容器启动注入环境变量
  2. 向 Pod 提供 SSH 密钥或密码等信息
  3. 从私有镜像仓库拉取镜像

Secret 的内置类型

以下类型的数据都是用 base64 编码,使用的时候都是自动解码,用户无需干预

  1. Opaque 用户定义的任意数据
  2. kubernetes.io/service-account-token ServiceAccount 的令牌
  3. kubernetes.io/dockercfg ~/.docker/config.json 旧版
  4. kubernetes.io/dockerconfigjson ~/.docker/config.json 新版
  5. kubernetes.io/basic-auth 基本的身份验证
  6. kubernetes.io/ssh-auth SSH 身份的认证的私钥凭据
  7. kubernetes.io/tls 用于 TLS 客户端或服务器端的数据
  8. bootstrap.kubernetes.io/token 启动引导令牌数据

Secret 的其他要点

  1. 保持最少特权访问原则 kubernetes.io/enforce-mountable-secrets: "true"
  2. 将 Secret 标记为不可更改 immutable: true

Secret 的替代方案

  1. 可以使用 ServiceAccount 替代
  2. 可是使用设备插件来替代
  3. 对于身份验证,可以使用CertificateSigningRequest定制的签名验证来为 Pod 发放证书
  4. 可以使用第三方工具,来提供机密数据

Secret 使用的良好实践

集群管理员

  1. 配置静态加密,配置 kube-apiserver 使用EncryptionConfiguration对象对 Secret 进行对称加解密
  2. 配置 Secret 资源的最小特权访问
    • 组件:限制仅最高特权的系统级组件可以访问,仅在组件的正常行为需要时才授予权限
    • 人员:限制对 Secret 的访问,仅允许集群管理员访问 etcd
    • 对访问 Secret 的用户或 Pod(因为用户可以通过 Pod 访问到 Secret)做记录
  3. 在 ServiceAccount 上使用kubernetes.io/enforce-mountable-secrets注解来强制执行有关如何在 Pod 中使用 Secret 的特定规则
  4. 改进 etcd 的管理策略,不在使用 etcd 所使用的持久存储时,考虑格式化对应的设备;在多个 etcd 实例之间使用 SSL/TLS 通信以保护传输中的 Secret
  5. 配置对外部 Secret 的访问,可以使用第三方 Secret 的解决方案,然后配置 Pod 访问该数据

开发者

  1. 限制特定容器集合才能访问 Secret,如果一个 Pod 中仅有一个容器需要访问 Secret,则可以 mount volume 或者使用环境变量的方式,避免其他容器访问该 Secret
  2. 读取后保护 Secret 数据,应用程序必须避免以明文记录 Secret 数据,必须避免将这些数据传输给不受信任的一方
  3. 避免共享 Secret manifest,提防 Secret manifest 中包含 base64 编码的数据

ConfigMap 的应用

ConfigMap 可以为应用提供配置文件信息,如

  1. nginx 配置文件
  2. 应用启动所需准备的配置文件

Secret 与 ConfigMap 的对比

相同之处:

  1. 二者都可以通过环境变量的方式注入容器
  2. 二者都可以通过文件的方式挂载到容器内部
  3. 二者的大小限制都是不超过 1M
  4. 都可以设置为immutable: true
  5. 二者的访问都可以单独配置对应的权限
  6. 对于以文件方式挂载,二者都支持热更新,但是如果使用了subPath则容器不会接收到更新,当然设置了immutable: true就不会有任何作用了

不同之处:

  1. Secret 保存的都是通过 base64 编码或者其他加密方式经过处理的数据
  2. ConfigMap 保存的数据是原始数据,没有对数据做任何加工处理
  3. ConfigMap 需要保证数据信息是 KV 结构才能以环境变量的方式注入容器
  4. Secret 需要自己设置对应的环境变量名称去注入到容器
  5. Secret 可以使用定制的方式,对机密数据加密与解密
  6. Secret 存储敏感信息,ConfigMap 存储非敏感信息