4. kube-apiserver 架构:API Server 请求处理流程、认证模块选型

kube-apiserver 是 Kubernetes 控制平面的前端网关与数据总线。所有对集群状态的查询、变更、监听操作都必须经过 apiserver。理解其请求处理流水线,以及认证模块的选型策略,是构建生产级集群的基石。

4.1 请求处理全流程

一个典型的 kubectl apply -f pod.yaml 请求,从客户端到达 etcd 存储,会依次经过以下 6 个阶段:

  1. HTTP(S) 接收:apiserver 监听 6443(安全端口)或 8080(非安全端口,生产禁用)。
  2. 认证(Authentication):从请求中提取身份信息,验证客户端身份合法性。
  3. 授权(Authorization):判断已认证的用户/ServiceAccount 是否有权限执行请求操作。
  4. 准入控制(Admission Control):通过一系列插件对请求对象进行修改或校验。
  5. 对象校验与持久化:对资源对象进行 schema 校验,并序列化写入 etcd。
  6. 响应返回:将操作结果或 watch 事件返回给客户端。
关键认知:认证阶段只解决“你是谁”的问题,不解决“你能做什么”。授权与准入控制是后续独立阶段。生产环境必须关闭 --insecure-port,仅暴露安全端口。
kube-apiserver 请求处理流水线 HTTP 接收 端口 6443 认证 X509 / SA / OIDC 授权 RBAC / ABAC 准入控制 Mutating / Validating 校验 & 持久化 etcd 写入 响应 阶段说明 • 认证:提取客户端证书 CN/O、ServiceAccount 或 OIDC ID ,生成 user info。 • 授权:将 user info 与策略(RBAC Role/ClusterRole)匹配,决定 allow/deny。 • 准入控制:先执行 Mutating 插件(如默认标签注入),再执行 Validating 插件(如 PodSecurity)。 • 持久化:apiserver 将最终对象 JSON 写入 etcd,并返回 201 Created 或 200 OK。

4.2 认证模块选型对比

Kubernetes 支持多种认证策略,可同时启用多个 authenticator。请求到达时,apiserver 按顺序尝试每个 authenticator,只要有一个成功即通过认证。生产环境最常用的三种策略如下:

认证模块 身份载体 适用场景 运维复杂度 安全等级
X509 客户端证书 kubeconfig 中的 client-cert + client-key 集群管理员、kubelet 节点身份、控制面组件间通信 中(证书轮换需手动或 cert-manager) 高(私钥不传输,仅签名验证)
ServiceAccount Pod 内挂载的 JWT (/var/run/secrets/kubernetes.io/serviceaccount/) Pod 内应用访问 API、CI/CD 流水线、Operator 框架 低(自动挂载、自动轮换) 中( 泄露风险,需配合 RBAC 最小权限)
OIDC(OpenID Connect) 外部 IdP 签发的 ID (如 Dex、Keycloak、Azure AD) 企业 SSO 集成、多集群统一认证、临时用户访问 高(需部署 IdP、配置 OIDC 发现端点) 高(支持 MFA、 时效短、可撤销)
选型避坑:不要在生产集群中启用 --enable-bootstrap-auth(静态密码)或 ---auth-file(静态 文件)。这些机制无法轮换、无法审计,属于遗留功能。OIDC 是面向企业级 SSO 的首选方案,但需要额外维护身份提供商的高可用。

4.3 X509 客户端证书认证详解

X509 认证是 Kubernetes 最底层的身份验证机制。apiserver 启动时通过 --client-ca-file 指定 CA 证书,所有携带由该 CA 签发的客户端证书的请求均被信任。

  • 身份提取规则:证书的 CN(Common Name)作为用户名,O(Organization)作为用户组。例如 CN=admin, O=system:masters 会被识别为 admin 用户,属于 system:masters 组。
  • 典型用途:kubelet 使用 kubelet-client 证书向 apiserver 注册节点;kube-controller-manager 和 kube-scheduler 使用独立的客户端证书与控制面通信。
  • 证书轮换:Kubernetes 1.20+ 支持 kubelet 证书自动轮换(--rotate-certificates),但管理员证书仍需手动或通过 cert-manager 管理。
# 使用 openssl 生成客户端证书示例
openssl genrsa -out admin.key 2048
openssl req -new -key admin.key -out admin.csr -subj "/CN=admin/O=system:masters"
openssl x509 -req -in admin.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out admin.crt -days 365

# 将证书写入 kubeconfig
kubectl config set-credentials admin --client-certificate=admin.crt --client-key=admin.key
kubectl config set-context admin-context --cluster=my-cluster --user=admin

4.4 ServiceAccount 认证详解

ServiceAccount 是 Pod 内应用访问 API 的标准方式。每个 Namespace 会自动创建一个 default ServiceAccount,并挂载对应的 JWT 到 Pod 中。

  • 类型:Kubernetes 1.24+ 默认使用 Bound Service Account ,该 绑定到特定 ServiceAccount、Pod 和节点,具有更短的过期时间(默认 1 年)且支持自动轮换。
  • 验证:apiserver 使用 --service-account-key-file 指定的公钥验证 签名。 中携带 ServiceAccount 名称和 Namespace,apiserver 将其映射为 user: system:serviceaccount:<ns>:<sa-name>。
  • 安全实践:每个应用使用独立的 ServiceAccount,并通过 RBAC 授予最小权限。禁止使用 default ServiceAccount 执行敏感操作。
# 创建专用 ServiceAccount 并绑定 RBAC
apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-app-sa
  namespace: production
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: production
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: my-app-sa-binding
  namespace: production
subjects:
- kind: ServiceAccount
  name: my-app-sa
  namespace: production
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

4.5 OIDC 认证详解

OIDC 允许 Kubernetes 集群信任外部身份提供商(IdP),实现单点登录(SSO)和集中式用户管理。apiserver 通过 OIDC 发现端点获取 IdP 的公钥和配置,验证客户端提交的 ID 。

  • 核心参数:--oidc-issuer-url(IdP 地址)、--oidc-client-id(集群在 IdP 注册的客户端 ID)、--oidc-username-claim(从 中提取用户名的字段,通常为 email 或 sub)。
  • 验证流程:客户端从 IdP 获取 ID (JWT 格式),在 kubectl 或 API 请求中通过 -- 或 Authorization: Bearer 头传递。apiserver 使用 IdP 的 JWKS 端点验证签名、issuer 和 audience。
  • 组映射:通过 --oidc-groups-claim 指定从 中提取用户组的字段(如 groups),Kubernetes 将其映射为 RBAC 绑定的组名。
生产配置示例(使用 Dex 作为 IdP):
--oidc-issuer-url=https://dex.example.com
--oidc-client-id=kubernetes-cluster-1
--oidc-username-claim=email
--oidc-groups-claim=groups
--oidc-ca-file=/etc/ssl/certs/dex-ca.crt
三种认证模块交互架构 客户端 kubectl / kubelet / Pod 携带证书 / kube-apiserver 认证链(顺序尝试) ① X509 Authenticator ② ServiceAccount Authenticator ③ OIDC Authenticator 身份源 CA 证书 / 密钥 OIDC IdP (Dex/Keycloak) HTTPS 请求 验证签名 / 公钥 认证链执行逻辑 1. apiserver 按配置顺序依次调用 authenticator,第一个返回成功的即终止链。 2. 若所有 authenticator 均失败,返回 401 Unauthorized。 3. 认证通过后,请求携带 user info(用户名、UID、组)进入授权阶段。

4.6 认证模块组合策略

生产集群通常同时启用 X509 和 ServiceAccount 认证,并根据企业需求叠加 OIDC。以下推荐组合:

集群类型 推荐认证组合 理由
小型开发集群 X509 + ServiceAccount 管理员使用证书,Pod 内应用使用 SA ,运维成本最低。
中型生产集群 X509 + ServiceAccount + OIDC 管理员和 CI/CD 使用证书/SA,开发人员通过 OIDC SSO 登录,审计链路完整。
大型多集群联邦 OIDC(主)+ ServiceAccount(从) 统一身份平台管理所有集群用户,ServiceAccount 仅用于 Pod 内通信。
性能考量:OIDC 认证每次请求都需要验证 JWT 签名,但签名验证是本地 CPU 操作(RSA/ECDSA),延迟通常在微秒级。apiserver 会缓存 IdP 的 JWKS 公钥(默认 5 分钟刷新),不会对 IdP 产生实时流量压力。