Kubernetes ServiceAccount 显示 0 Secrets:旧的取令牌命令不再适用
Kubernetes 1.24 起新建账户不再默认生成长期 token Secret。区分旧字段命令、TokenRequest 与 Pod 投射令牌,核对身份、期限与实际访问。
创建 ServiceAccount 成功,但 kubectl describe serviceaccount 显示 Tokens: <none>,从 .secrets[0].name 取名称也没有输出。若集群使用 Kubernetes 1.24 起的默认行为,这不表示账户创建失败:集群不再为每个 ServiceAccount 自动创建长期令牌 Secret。
需要临时从集群外访问 API 时,使用 TokenRequest 获取有期限的令牌;程序运行在 Pod 内时,优先使用投射到 Pod 的令牌。不要为了恢复旧教程的输出,先重装集群或给账户增加 cluster-admin。
先确认版本、空间和实际对象
以下名称是示例,替换为真实账户与命名空间:
kubectl version
kubectl config current-context
kubectl -n team-app get serviceaccount app-reader -o yaml
核对服务端版本,不只看 kubectl 客户端版本。.secrets 为空与读取了不存在的 .secret 字段也不同;先看实际对象,避免在一个拼错的 JSONPath 后继续解码空输出。查询错了命名空间,不能证明账户没有凭据。
Kubernetes 1.24 起默认不再为每个 ServiceAccount 自动生成旧式令牌 Secret。当前版本不能照搬关闭旧的 LegacyServiceAccountTokenNoAutoGeneration 特性门的办法。
在 1.24 以前的集群看到空列表时,仍需按该版本核对令牌控制器、实际配置和字段,不直接套用新版本结论。反过来,升级后的已有账户也可能留下旧令牌;看到一个旧 Secret,并不能证明新账户还会自动生成。
集群外的临时调用,申请短期令牌
由获准的身份为已存在的账户申请令牌:
kubectl -n team-app create token app-reader --duration=1h
该命令会输出敏感令牌,只在受控终端使用,不把输出写进工单、版本库或共享 CI 日志。--duration 是申请值,服务端实际签发期限可能更短或更长;不要用极大数值假装得到了永久令牌。
申请者需要创建该账户 token 子资源的权限。命令本身返回 Forbidden 时,应检查申请权限;取得令牌后业务 API 返回 Forbidden,则检查账户对目标动作的授权。这是两次不同的权限判断,不能用扩大所有权限来替代排查。
如果令牌已被识别为 system:serviceaccount:<namespace>:<name>,列出 Pod 等业务请求仍返回 Forbidden,可继续检查 RoleBinding 的 ServiceAccount 主体和命名空间。
令牌还需要与接收方接受的 audience 一致。访问外部服务时按其信任配置选择 audience,不随意复制另一服务的值。API 地址、CA 验证和账户命名空间继续使用项目原有配置,不能为试令牌跳过 TLS 校验。
如果短期令牌用于 Vault 的 Kubernetes 登录,登录失败时还需区分应用 JWT 的 audience 与 Vault 调用 TokenReview 的身份,可继续检查 Vault 的受众与 TokenReview 配置。
短期令牌到期后需要重新申请。交互登录可重新登录,长期自动化则需要设计续取与重新加载,而不是把这次终端输出硬编码到应用中。
Pod 内的程序,检查投射凭据与重新加载
Pod 的 spec.serviceAccountName 决定身份。当前默认机制使用 TokenRequest 获取短期令牌并通过投射卷挂载,由 kubelet 在接近到期时轮换,不要求 ServiceAccount 的 .secrets 中出现一个长期 Secret。
若应用没有得到预期的凭据,检查实际 Pod 的账户、卷及 automountServiceAccountToken;Pod 中显式的设置优先于 ServiceAccount 的设置。不需要访问 API 的程序可以关闭自动挂载,不应为了让检查输出好看而重新打开。
应用还要能重新读取轮换后的文件。只在启动时把令牌读入内存,之后一直使用旧值,可能在到期后认证失败。使用与当前客户端库相容的集群内配置和令牌加载方式;自定义投射卷时明确受众、路径与期限,不复制别的应用的值。
旧工具只认 Secret,需要单独处理兼容性
某些旧集成仍从 ServiceAccount 的 .secrets 查长期凭据,可能报告 Could not find any secrets associated with the Service Account.。短期令牌签发成功,不会自动修复这类旧工具的发现逻辑;先检查工具是否支持当前认证方式和令牌更新。
确实无法使用 TokenRequest、且经过凭据管理评估时,仍可手工创建长期 ServiceAccount token Secret,但它不会自动过期或轮换。不要为方便长期自动化默认采用这一方式。手工创建的关联 Secret 也不保证出现在账户 .secrets 列表中,绑定关系由 Secret 上的账户注解表达,不需要把 Secret 名称强制改成账户名称。
成功标准是目标调用使用正确账户、受众与 CA 后完成所需动作,并在令牌更新或 Pod 替换后仍能正常认证;Secrets 数量增加不是验收标准。修改认证接入前保存原配置,回退时确认旧凭据仍有效。代码回退不能让已过期或已撤销的令牌恢复,也不应为了回退恢复不必要的高权限。


