首页/云/Kubernetes 速查/ServiceAccount Token 卷投影
配置与存储54 条

ServiceAccount Token 卷投影

1.24 起不再为每个 ServiceAccount 自动创建长期 Token Secret;工作负载改用 projected serviceAccountToken 获取带过期时间的短期令牌,由 kubelet 轮换。

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

Token 卷投影是什么

从 Kubernetes 1.24 起,集群不再为每个 ServiceAccount 自动创建一个长期有效的 Token Secret:默认仍是把令牌挂进 Pod,但改为 kubelet 通过 TokenRequest API 获取一枚有过期时间的短期令牌,由 kubelet 负责在到期前轮换。需要定制受众、有效期或额外签名数据时,就在 Pod 里显式声明 projected 卷,把 serviceAccountToken 作为投影来源。

基本信息

适用版本1.24 起不再自动创建长期 Token Secret
默认路径/var/run/secrets/kubernetes.io/serviceaccount
投影写法volumes[].projected.sources[].serviceAccountToken
可配字段path、expirationSeconds、audience
轮换机制kubelet 在令牌接近过期时自动重新申请并替换

投影令牌写法

投影令牌写法
spec:
  serviceAccountName: app-sa
  containers:
    - name: app
      image: registry.example.com/app:1.26.0
      volumeMounts:
        - name: token
          mountPath: /var/run/secrets/tokens      # 应用从这里读令牌
  volumes:
    - name: token
      projected:
        sources:
          - serviceAccountToken:
              path: token
              expirationSeconds: 3600             # 期望有效期,实际受服务端上限约束
              audience: api                            # 受众,默认指向 apiserver

手动签发与核对

手动签发与核对
kubectl create token app-sa --duration=1h -n prod                # 命令行签发短期令牌
kubectl auth can-i list pods --as=system:serviceaccount:prod:app-sa -n prod   # 验证该身份的权限
kubectl exec -it web-x -- ls -l /var/run/secrets/tokens          # 看投影令牌文件与大小,不要 cat 出内容
kubectl exec -it web-x -- ls -l /var/run/secrets/kubernetes.io/serviceaccount   # 默认挂载点内容

典型使用场景

  • 应用调用 apiserver:使用自动挂载的短期令牌,无需自己管理 Secret
  • 对接外部系统:通过 audience 指定受众,让令牌只被目标系统接受
  • 跨集群或对接身份联邦:用投影令牌换取外部身份系统中的凭证
  • 替代长期令牌:把依赖固定 Secret 的旧流程改造成按需申请短期令牌
  • 权限验证:配合 kubectl create token 在测试环境快速验证某个 ServiceAccount 的权限

两种令牌对照

维度投影令牌长期 Token Secret
有效期有明确过期时间,可请求时长长期有效,直到被删除
轮换kubelet 到期前自动更新文件无自动轮换,需人工替换
受众限制可指定 audience默认面向 apiserver
版本现状1.24 起为默认方式1.24 起不再自动创建
适用建议新工作负载一律使用仅遗留系统过渡期短期使用
expirationSeconds 是请求值而非承诺值:实际有效期还会受 apiserver 侧的最大时长与最小时长配置约束,因此不要用它的字面值做业务上的时序假设,而是读取令牌本身的声明。
令牌文件会随轮换被替换内容,但路径不变。应用如果启动时把令牌读进内存长期使用,就会在某个时刻拿到过期凭据,正确做法是每次调用前读取文件或由客户端库负责刷新。

易错点

  • 依赖自动创建的长期 Token Secret:1.24 起不再生成,升级后挂载卷会直接找不到对象,脚本与清单需要同步改造
  • 应用启动时把令牌读进内存长期缓存:轮换后仍在用旧令牌,表现为运行一段时间后突然全部请求 401
  • 把 expirationSeconds 当成保证值写进业务逻辑:实际时长受服务端约束,定时任务会踩到过期边界
  • 为省事把令牌打印到日志或环境变量:令牌泄露等同于该 ServiceAccount 的权限泄露

数据来源与参考

  • Kubernetes 官方文档 · ServiceAccount Token 卷投影
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌