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