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 侧的最大时长与最小时长配置约束,因此不要用它的字面值做业务上的时序假设,而是读取令牌本身的声明。
令牌文件会随轮换被替换内容,但路径不变。应用如果启动时把令牌读进内存长期使用,就会在某个时刻拿到过期凭据,正确做法是每次调用前读取文件或由客户端库负责刷新。