Technical documentation

Kubernetes 里机器账号怎么创建:为什么 Pod 不能直接用人类账户

Kubernetes 里机器账号怎么创建:为什么 Pod 不能直接用人类账户

Kubernetes 中的机器账号即 ServiceAccount,是专为应用进程设计的命名空间级身份,与面向人类操作的普通用户账户在创建方式、作用域及生命周期管理上存在本质区别。

为何不能直接用人类账户管理 Pod?

Pod 无法直接使用人类账户是因为架构强制区分人与机两类主体,通过专用 ServiceAccount 机制确保自动化进程拥有独立且受控的身份标识,避免权限混淆。

在 Kubernetes 集群的架构设计中,你无法通过 API 直接创建一个“普通用户”来让 Pod 使用。这并非技术上的硬伤,而是为了严格区分两类完全不同的身份主体:面向人的账户和面向应用进程的 ServiceAccount。

如果把普通用户比作需要人工审批的实体员工,那么 ServiceAccount 就是自动生成的临时工牌,只在特定工位(Pod)有效。这种机制确保了工作负载的身份管理不依赖外部人员变动,从根本上解决了自动化运维中“人走权失”的难题。

普通用户 vs ServiceAccount:创建方式的根本差异

普通用户账户通常由外部身份提供商(如 LDAP、OIDC)统一管理,它们并不是 Kubernetes API 可创建的对象[1]。这意味着管理员无法像创建资源那样,直接在集群内生成一个新的普通用户。相反,ServiceAccount是专为应用进程设计的受管对象,完全由 Kubernetes API 控制其生命周期[2]。它天生绑定在特定的命名空间内,随部署边界而存在,天然具备隔离性。

对比维度 普通用户 (User) ServiceAccount (SA)
创建方式 外部系统管理,不可由 K8s API 直接创建 由 Kubernetes API 直接管理
作用域 全局范围,跨命名空间 严格限制在单个命名空间内
主要用途 人类管理员或开发者交互 应用进程与 API Server 通信
生命周期 随人员入职/离职变更 随工作负载部署/销毁同步
典型场景 kubectl 命令行操作 Pod 内部进程发起 API 请求

这种分离不仅明确了责任边界,也为后续的 RBAC 授权提供了清晰的切入点。认证回答“你是谁”,而授权层决定“你能做什么”。若只关注身份认证而忽略权限绑定,极易误判安全水位。值得注意的是,许多团队在迁移旧有应用时,容易忽视一个隐性成本:学习曲线与工具链适配。当开发者习惯了用 kubectl --as=alice 这种基于人类身份的调试模式后,转向 ServiceAccount 往往意味着要重新理解 Token 的生命周期管理、动态投影机制以及如何在 CI/CD 流水线中安全地注入凭据。这种从“人治”到“机治”的思维转换,往往比配置本身更耗时,却也是构建稳定自动化体系的必经之路。

为什么要把人和机器身份分开管理?

分离人与机器身份是为防止人员变动导致服务中断,并杜绝多人共用静态密钥引发的审计盲区,从而保障自动化流程的持续稳定与责任可追溯。

将两者混同会导致严重的权限混乱。如果允许进程直接使用人类账户,一旦该人员离职或权限变更,所有关联的自动化服务都会瞬间失效或失控。更危险的是,共享静态密钥往往意味着多人共用一个身份,这违背了审计追踪的最小化原则。

工程实践要求机器身份独立于人类账户。ServiceAccount的存在,让进程访问严格限定在运行上下文内,避免人员账户被滥用为通用凭证[1]。当 Pod 启动时,它携带的是专属的令牌,而非某个开发者的个人凭据。这种设计确保了即使某台节点被攻破,攻击者也只能在该节点的命名空间内活动,无法横向移动去触碰其他服务。

Kubernetes 里机器账号怎么创建:进程如何获得身份并发起请求

Pod 进程由 Kubelet 自动注入关联 ServiceAccount 凭据向 API Server 发起认证,无需人工干预即可确立身份,但通过验证仅代表确认访问者身份而非授予具体操作权限。

Pod 内的应用进程并非凭空向 API Server 发送请求,而是自动携带其关联的 ServiceAccount 凭据发起认证。这一过程完全由 Kubelet 和容器运行时在底层接管,开发者无需手动注入 Token[1]。当请求到达 API Server 后,服务器会验证凭据的有效性,一旦通过,该主体即刻被标记为 system:authenticated[2]。这就像你进入大楼刷了工卡,保安确认了你的身份,但这并不代表你能直接走进财务室或机房。

从凭证到认证:Pod 进程的身份确立过程

认证只是第一步,它只解决了“你是谁”的问题。Kubernetes 将经过验证的请求方统一归入 system:authenticated 组,这是一个基础的安全状态,意味着该请求来自一个合法的、可识别的主体,而非匿名的陌生人[1]。这种机制确保了每一个操作都有迹可循,杜绝了无主体请求的风险。但请记住,拿到这个“入场券”并不代表拥有了自由行动的权利。

认证之后:RBAC 如何控制实际访问范围

身份确认之后,真正的关卡才刚刚开始。取得 ServiceAccount 凭据绝不等于获得了任意 API 权限,后续的资源访问必须经过 RBAC(基于角色的访问控制)的二次判断[2]。这里存在一个清晰的逻辑分界:认证层负责回答“是谁”,而授权层负责回答“能做什么”。

如果审计人员只检查某个 Pod 是否持有有效的身份凭证,却忽略了其绑定的 RBAC 规则,就会误以为拥有有效身份的进程具备最小权限,从而埋下安全隐患[1]。这种两段式结构揭示了 Kubernetes 机器身份认证的核心边界:身份层降低了伪造主体的风险,而授权层才真正决定了事故的爆炸半径。只有同时校验身份与绑定规则,才能确保进程仅执行必要的动作。

在实际操作中,很多团队习惯给默认 ServiceAccount 赋予宽泛权限,或者在测试环境中过度使用 ClusterRole,导致生产环境面临巨大的隐患。一个值得警惕的视角是:ServiceAccount 的默认行为往往比显式配置更具破坏力。例如,当你在 Deployment 中未指定 serviceAccountName 时,Pod 会自动挂载默认的 ServiceAccount,而这个默认账号在早期版本中甚至可能拥有读取整个命名空间 Secrets 的权限。因此,在引入新的微服务时,除了创建对应的 SA,必须立即审查其默认角色绑定,主动切断不必要的继承路径,而不是等到发生安全事故后再去修补。

Kubernetes 里机器账号怎么创建:命名空间作用域与安全边界

ServiceAccount 由 API 直接管理并严格限定于特定命名空间内,这种设计为工作负载构建了天然安全边界,将机器身份的有效范围锁定在部署环境之中。

普通用户无法通过 API 创建,而 ServiceAccount 却由 API 直接管理并限定在特定命名空间内。[1][2] 这种设计让机器身份天然带有“围墙”,将工作负载的访问权限锁定在部署边界之内。

命名空间如何限制机器账号的影响范围

ServiceAccount的生命周期与命名空间强绑定,一个账号只能在其创建的命名空间内生效。[1][2] 这意味着开发环境的测试服务即便拥有最高权限的账号,也无法跨越边界去触碰生产集群的资源。不同环境通过物理隔离的命名空间构建起第一道防线,彻底切断了跨域误操作的可能。若混淆这一模型,把机器身份当作全局通用的“万能钥匙”,一旦某个节点凭证泄露,攻击者就能在整台集群中任意游走,爆炸半径瞬间扩大。

最小权限原则在机器身份中的体现

持有有效凭据仅意味着完成了身份认证,并不代表获得了资源访问权。[1][2] Pod 进程向 API Server 发起请求时,系统首先确认其身份属于 system:authenticated,随后才由 RBAC 判定具体动作是否被允许。[1][2] 许多审计误区在于只检查 Pod 是否挂载了 Token,却忽略了背后的 RoleBinding 配置。这种割裂会导致“可认证”被错误等同于“最小权限”。真正的安全边界需要身份层与授权层共同治理:前者解决“你是谁”,后者决定“你能做什么”。[1][2]

对比项 混淆身份模型的风险 ServiceAccount 隔离方案
作用范围 全局共享,单点泄露即全服沦陷 仅限当前命名空间,故障不扩散
权限判定 仅依赖 Token 有效性,易越权 需同时满足身份 + RBAC 绑定双重校验
环境隔离 开发/生产共用同一套身份池 物理隔离,杜绝跨环境访问
审计重点 仅验证身份存在性 需同步核查授权策略匹配度

身份层的隔离降低了无主体请求的风险,而授权层则精准控制了实际的爆炸半径。[1][2] 只有当两者协同工作时,Kubernetes 的机器身份体系才算真正建立了安全闭环。


FAQ:关于机器身份认证的常见疑问

Q: 我可以直接给 Pod 分配一个管理员级别的 ServiceAccount 吗? A: 技术上可行,但极度危险。虽然可以通过 ClusterRoleBinding 实现,但这违反了最小权限原则。一旦 Pod 被入侵,攻击者将获得整个集群的控制权。最佳实践是为每个服务创建独立的、权限最小的 ServiceAccount。

Q: ServiceAccount 和普通用户在权限上有什么本质不同? A: ServiceAccount 是命名空间级别的,且生命周期与工作负载绑定;普通用户通常是全局的,由外部系统管理。在 Kubernetes 中,Pod 默认只能使用 ServiceAccount,无法直接使用普通用户进行 API 调用。

Q: 如何防止 ServiceAccount 的 Token 泄露? A: 除了遵循最小权限原则外,还可以启用动态 Token 投影(Token Projection),让 ServiceAccount 能够获取临时的、带 TTL 的 JWT 令牌,减少长期静态密钥的风险。


参考来源

  1. Authenticating | Kubernetes · https://kubernetes.io/docs/reference/access-authn-authz/authentication/(A级)
  2. Managing Service Accounts | Kubernetes · https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/(A级)