Kubernetes API 访问控制全景:认证、授权、准入控制三大关卡概述

Kubernetes 的 API 访问控制并非单一环节,而是一条由三个独立且顺序执行的拦截关卡组成的链路。任何对 API Server 的请求,无论来自 kubectl、Pod 内的 ServiceAccount 还是外部自动化工具,都必须依次通过这三道防线。理解这一链路的结构,是后续分析错误处理逻辑的基础。

核心原则: 三个关卡按顺序执行,前一个关卡失败则请求立即被拒绝,不会进入后续关卡。这种设计确保了安全策略的严格分层,同时也意味着错误类型与拦截阶段强相关。

1. 三大关卡总览

下表从职责、核心组件、典型失败场景三个维度,快速对比认证、授权、准入控制三个关卡。

关卡 核心职责 关键组件 典型失败原因
认证 (Authentication) 验证“你是谁?” Client Certificate、Bearer Token、OpenID Connect、Webhook Token Review 证书过期、Token 无效、x509 签名不匹配
授权 (Authorization) 验证“你能做什么?” RBAC、ABAC、Node Authorization、Webhook SubjectAccessReview Role/ClusterRole 缺失、Verb 不匹配、资源范围错误
准入控制 (Admission Control) 验证“请求内容是否合规?” MutatingAdmissionWebhook、ValidatingAdmissionWebhook、内置插件 (NamespaceLifecycle, PodSecurity) 违反安全策略、资源配额不足、Webhook 超时

2. 认证 (Authentication):第一道防线

认证阶段负责确认请求发起方的身份。API Server 支持多种认证方式,它们按优先级顺序尝试,只要有一种认证成功即通过。

  • X.509 客户端证书: 通过 --client-ca-file 指定的 CA 验证证书链,提取 CN 和 O 字段作为用户名和组。
  • Bearer Token: 包括 ServiceAccount Token、Bootstrap Token、静态 Token 文件。
  • OpenID Connect (OIDC): 集成外部身份提供商,如 Azure AD、Okta。
  • Webhook Token Review: 将 Token 发送给外部认证服务,由外部决定身份。
  • Anonymous 请求: 如果所有认证方式都失败,且启用了 --anonymous-auth=true,则视为 system:anonymous 用户。
常见错误陷阱: 认证失败时,API Server 返回 401 Unauthorized。但很多开发者误以为“认证失败”应该返回 403 Forbidden。实际上,401 表示“未认证”,403 表示“已认证但无权限”。在错误处理链路中,区分这两个状态码是第一步。

3. 授权 (Authorization):第二道防线

认证通过后,请求进入授权阶段。授权模块检查经过认证的用户(或 ServiceAccount)是否拥有执行当前请求的操作权限。

Kubernetes 最常用的授权模式是 RBAC (Role-Based Access Control)。其核心判断逻辑围绕四个要素:

  • User/Group/ServiceAccount: 请求发起方。
  • Verb: get, list, create, update, delete, watch 等。
  • Resource: pods, deployments, secrets 等。
  • Namespace/Cluster: 资源作用域。

授权失败时,API Server 返回 403 Forbidden,并在响应体中包含详细的 RBAC 评估信息,例如:

{
  "kind": "Status",
  "apiVersion": "v1",
  "status": "Failure",
  "message": "pods \"my-pod\" is forbidden: User \"dev-user\" cannot get resource \"pods\" in API group \"\" in the namespace \"production\"",
  "reason": "Forbidden",
  "details": {
    "name": "my-pod",
    "kind": "pods"
  },
  "code": 403
}

4. 准入控制 (Admission Control):第三道防线

准入控制是请求被持久化到 etcd 之前的最后一道关卡。它分为两个阶段:

  1. Mutating Admission: 修改请求内容(例如注入 Sidecar、设置默认值)。
  2. Validating Admission: 验证请求内容是否符合策略(例如检查镜像仓库是否允许、Pod 安全标准是否满足)。

准入控制通过 Webhook 机制与外部服务集成,这是错误处理最复杂的环节。Webhook 超时、证书错误、服务不可用都会导致请求被拒绝。

工程落地要点: 准入控制阶段的错误通常不是“权限不足”,而是“请求内容违规”或“外部服务故障”。错误处理策略需要区分:是用户需要修改请求参数,还是运维需要修复 Webhook 服务。

5. 三大关卡交互流程

下图展示了请求从进入 API Server 到最终持久化的完整拦截链路,以及每个阶段可能产生的错误类型。

Kubernetes API 访问控制三大关卡交互流程 API 请求 关卡 1:认证 (Authentication) 401 Unauthorized 关卡 2:授权 (Authorization) 403 Forbidden 关卡 3:准入控制 (Admission Control) Mutating → Validating 400 Bad Request / 500 Internal Server Error etcd 持久化 任一关卡失败,请求立即终止并返回对应 HTTP 状态码,不会进入下一阶段

6. 错误类型与拦截阶段映射

在实际工程中,错误处理策略必须与拦截阶段对齐。下表总结了每个阶段最常见的错误类型及其对应的 HTTP 状态码:

拦截阶段 HTTP 状态码 典型错误消息片段 错误根因
认证 401 Unauthorized, Invalid certificate, Token has expired 凭证无效、过期、不匹配
授权 403 Forbidden: User cannot list resource RBAC 规则缺失、Verb 或资源不匹配
准入控制 (Mutating) 400 / 500 admission webhook "xxx" denied the request Webhook 服务拒绝、超时、证书错误
准入控制 (Validating) 400 failed to validate: spec.replicas must be >= 1 请求参数违反校验规则

7. 工程落地启示

理解三大关卡的职责和错误特征,对于构建健壮的错误处理机制至关重要:

  • 错误分类是第一步: 收到 401 时,优先检查凭证;收到 403 时,优先检查 RBAC;收到 400 时,优先检查请求体或 Webhook 日志。
  • Webhook 是错误重灾区: 准入控制阶段的错误往往不是用户操作问题,而是集群运维问题(证书、网络、服务崩溃)。错误处理逻辑需要区分“用户可修复”和“运维需介入”。
  • 错误信息解析: API Server 返回的错误消息结构是统一的 Status 对象,包含 reason、message、details 字段。后续章节将深入解析如何从这些字段中提取可操作的错误码。