首页/云/Kubernetes 速查/ServiceAccount 与令牌挂载控制
集群运维与排障54 条

ServiceAccount 与令牌挂载控制

ServiceAccount 是 Pod 的工作负载身份:默认自动挂载令牌,不需要访问 API 的 Pod 建议关闭自动挂载,减少凭据暴露面。

Kubernetes 速查云更新于 2026-10-13

ServiceAccount 是 Pod 的身份

ServiceAccount 是命名空间内的身份对象:Pod 借它向 apiserver 认证,进程读取挂载进容器的令牌就能调用 API。每个命名空间默认有一个 default 账号,Pod 没指定身份时用它,并自动挂载令牌。不需要访问 API 的负载建议关闭自动挂载,减少凭据暴露面。要注意 SA 只回答「我是谁」,能不能做事由 RBAC 决定,两者缺一不可。

基本信息

适用平台Kubernetes 各版本,命名空间级对象
默认账号每个命名空间一个 default,除非显式指定其他账号
令牌挂载路径/var/run/secrets/kubernetes.io/serviceaccount
关闭自动挂载Pod 级 spec.automountServiceAccountToken,或 SA 上的同名字段
授权方式Role 或 ClusterRole 配合 RoleBinding 与 ClusterRoleBinding

典型使用场景

  • 应用访问 API:Controller、Operator 通过 SA 与 RBAC 获得最小权限
  • 镜像拉取凭据:把拉取密钥挂在 SA 上由所有 Pod 继承
  • 安全基线:对不需要 API 的负载统一关闭令牌挂载
  • 多组件隔离:一个组件一个 SA,权限边界清晰便于审计
  • 迁移与交接:通过 SA 名称快速定位某负载具备哪些权限

创建与控制挂载

创建与控制挂载
kubectl create serviceaccount app-sa -n prod
kubectl patch sa app-sa -n prod -p '{"automountServiceAccountToken": false}'   # SA 级关闭
# Pod 级关闭(优先于 SA 级设置):
#   spec.serviceAccountName: app-sa
#   spec.automountServiceAccountToken: false
kubectl get sa -n prod                                  # 核对账号是否存在
kubectl auth can-i list pods --as=system:serviceaccount:prod:app-sa -n prod

配置位置与影响范围

配置位置写法影响范围
ServiceAccountautomountServiceAccountToken: false该账号下的 Pod,可被 Pod 级声明覆盖
Podspec.automountServiceAccountToken: false只影响该 Pod,优先级更高
Podspec.serviceAccountName: app-sa指定该 Pod 使用的身份
RBACRoleBinding 绑定 SA 与角色决定这个身份能做什么
关闭自动挂载后,依赖 in-cluster 配置的客户端库会取不到令牌,第一次调用 API 就报权限或配置错误;动手前先确认应用是否真的需要访问集群 API。
一个应用一个 SA 更利于审计:共用 default 会让权限边界模糊,任何一处放宽都影响该命名空间下的所有负载。
新版集群使用有期限的绑定式令牌并由 kubelet 自动轮换,老版本可能是长期有效的静态令牌;做安全评估时先确认集群版本与令牌类型,再判断凭据泄漏的影响面。

易错点

  • 关闭自动挂载却没确认应用用法:容器启动或首次调用 API 时直接失败,排查容易先怀疑网络
  • 多个应用共用 default 账号:审计与授权边界模糊,一处放宽波及全部负载
  • 以为不挂载令牌就安全:历史长期令牌一旦被读出可长期使用,仍需最小授权与定期轮换
  • 给 SA 绑了过宽的角色:任何能读到该令牌的 Pod 都等于拿到等同权限,最小授权仍是底线

数据来源与参考

  • Kubernetes 官方文档 · ServiceAccounts
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌