在Kubernetes集群中,Pod作为工作负载的基本单元,除了运行业务应用容器外,还经常需要访问各类资源,例如Kubernetes API、ConfigMap、Secret、自定义CRD,甚至云厂商API或内部系统。那么,Pod是凭借何种身份进行访问的呢?核心机制在于ServiceAccount与Token的结合。
01 Kubernetes 中的身份体系概览
Kubernetes身份体系主要包含三类常见身份:

Pod从不以User身份访问API,它只能依赖ServiceAccount进行身份认证。
02 什么是 ServiceAccount?
ServiceAccount(SA)是Kubernetes专为Pod设计的“机器身份”:
- 属于Namespace级别资源
- 用于Pod访问Kubernetes API
- 可绑定RBAC权限规则
- 通常同一类Pod共享一个SA
每个Namespace默认都会创建一个名为default的ServiceAccount。如果Pod未显式指定serviceAccountName,则会自动使用该默认SA。
03 Pod 是如何拿到身份的?——Token 注入机制
当Pod绑定ServiceAccount后,Kubernetes会自动完成以下三步:
① 创建 Token(JWT)
- 由kube-apiserver签发
- 本质是一个符合JWT标准的令牌
② 自动挂载到 Pod
Token默认挂载路径为:
/var/run/secrets/kubernetes.io/serviceaccount/
该目录包含三个关键文件:
token:身份凭证JWT
ca.crt:API Server的CA证书
namespace:当前Pod所在命名空间
③ Pod 使用 Token 访问 API
应用只需在请求头中设置:
Authorization: Bearer <token>
即可调用Kubernetes API。整个过程对应用开发者基本透明。
04 ServiceAccount 与 RBAC 的关系
ServiceAccount仅代表身份,本身不具备任何权限。权限完全由RBAC(基于角色的访问控制)绑定关系决定:
ServiceAccount → Role / ClusterRole → API 权限
示例逻辑:
- Pod使用SA:
app-sa
app-sa绑定某个Role
Role定义具体操作权限(如get、list、watch)
- 最终决定Pod能访问哪些资源
简而言之:ServiceAccount = 身份,RBAC = 权限。
05 Token 的两种形态(关键区分)
① 旧版:Secret-based Token(逐渐废弃)
特点:
- Token存储在Secret资源中
- 永不过期,存在安全风险
- 早期Kubernetes集群常见
② 新版:Bound ServiceAccount Token(推荐)
Kubernetes 1.24及以上版本默认启用:
- Token不再持久化保存于Secret
- 由kubelet按需动态生成
- 具备过期时间,增强安全性
- 绑定特定Pod、SA及Audience
优势:
- 安全性更高,支持自动轮转
- 无需管理长期凭证
- 已成为生产环境的标准做法
06 Pod 访问 Kubernetes API 的完整流程
完整身份认证与鉴权链路如下:
Pod
↓ 读取 /var/run/secrets/kubernetes.io/serviceaccount/token
↓ 向 kube-apiserver 发起请求
↓ API Server 验证 Token 有效性
↓ 识别关联的 ServiceAccount
↓ 依据 RBAC 规则进行鉴权
↓ 允许或拒绝访问
07 最佳实践与常见误区
最佳实践
常见误区
- 所有Pod共用同一个默认SA
- 为SA绑定过高权限(如
cluster-admin)
- 在容器镜像中硬编码Token
- 将ServiceAccount误用作“用户”账户
08 小结:ServiceAccount 是 Pod 的“身份证”
核心要点总结:
① Pod 访问 API 必须使用 ServiceAccount
这是Kubernetes设计的强制身份机制。
② Token 是身份凭证,权限由 RBAC 决定
明确区分身份认证与权限鉴权。
③ 新版 Token 更安全,已成主流
生产环境应优先采用Bound ServiceAccount Token。
④ ServiceAccount 是安全边界的重要一环
它是实现零信任架构和最小权限原则的基础组件。
|