2. kube-apiserver 基础:架构、请求处理流程与核心组件

kube-apiserver 是 Kubernetes 控制面的核心网关,也是 Serverless 平台控制面所有查询与写入操作的唯一入口。理解其内部架构与请求处理流程,是后续进行查询优化与样本留存的前提。

2.1 整体架构概览

kube-apiserver 采用分层架构,从外到内依次经过 HTTP 层、认证、授权、准入控制、以及最终的存储层。每一层都可以独立扩展或替换,这也是 Kubernetes 可扩展性的基础。

kube-apiserver 分层架构与请求处理流程 kube-apiserver 分层架构与请求处理流程 客户端请求 HTTP 层(路由、超时、限流) 认证(Authentication) 授权(Authorization) 准入控制(Admission Control) 存储层(etcd) 说明:请求依次经过每一层,任何一层拒绝则请求终止并返回错误。

2.2 请求处理流程(详细步骤)

一个典型的 API 请求从客户端发起直到写入 etcd,经历以下 7 个关键步骤:

步骤 组件/阶段 核心职责 常见优化点
1 HTTP 路由 根据请求路径(/api/v1/...)匹配对应的资源处理器 减少不必要的路由重定向
2 认证 验证请求者身份(证书、、BasicAuth) 使用长连接复用认证上下文
3 授权 判断请求者是否有权限执行操作(RBAC/ABAC) 缓存 RBAC 策略评估结果
4 准入控制 修改或验证请求对象(Mutating + Validating) 减少 Webhook 调用次数
5 对象校验 对资源对象进行 Schema 校验 使用 OpenAPI 缓存
6 存储层 将对象序列化后写入 etcd 批量写入、压缩
7 响应返回 将结果封装为 HTTP 响应返回客户端 分页、字段选择
优化提示:在 Serverless 平台中,认证和准入控制是延迟开销最大的两个阶段。建议对 ServiceAccount 使用本地缓存,并将频繁调用的 Webhook 改为内部插件形式。

2.3 核心组件详解

2.3.1 认证(Authentication)

kube-apiserver 支持多种认证方式,按配置顺序依次尝试,直到有一个成功:

  • X.509 客户端证书:通过 TLS 双向认证,kubelet 和 kube-controller-manager 常用。
  • ServiceAccount :Pod 内默认使用的 JWT ,Serverless 平台中函数 Pod 的主要认证方式。
  • Bearer / Webhook :外部身份系统集成(如 OIDC)。
  • 静态 / 密码文件:仅用于测试或遗留场景。

2.3.2 授权(Authorization)

授权模块决定“谁可以做什么”。Kubernetes 默认使用 RBAC(基于角色的访问控制):

  • Role / ClusterRole:定义一组权限规则(verbs + resources)。
  • RoleBinding / ClusterRoleBinding:将角色绑定到用户或 ServiceAccount。
  • 评估顺序:多个授权模块(RBAC、ABAC、Webhook)按顺序执行,任何模块允许即通过。
常见陷阱:在 Serverless 平台中,如果每个函数 Pod 都使用独立的 ServiceAccount,会导致 etcd 中存储大量 RoleBinding 对象,增加 List 操作的延迟。建议使用命名空间级聚合角色来减少对象数量。

2.3.3 准入控制(Admission Control)

准入控制是请求处理流程中唯一可以修改请求对象的阶段。分为两类:

类型 执行时机 典型插件 对性能的影响
Mutating(变更) 先执行 MutatingAdmissionWebhook、DefaultStorageClass 高(涉及网络调用)
Validating(验证) 后执行 ValidatingAdmissionWebhook、PodSecurity 中(可能涉及外部服务)

在 Serverless 场景中,自定义 Webhook 常用于注入 Sidecar、设置资源配额、验证函数配置等。但 Webhook 的延迟会直接增加 API 请求的 P99 延迟,因此需要重点优化。

2.3.4 存储层(etcd)

etcd 是 kube-apiserver 的唯一持久化存储,所有资源对象最终都以 Key-Value 形式存储在 etcd 中。关键特性:

  • Watch 机制:kube-apiserver 通过 etcd 的 Watch 接口监听资源变化,实现控制器模式。
  • 事务支持:使用 etcd 的 Txn 接口保证资源更新的原子性。
  • 存储格式:资源对象以 Protobuf 或 JSON 格式序列化后存储,默认使用 Protobuf(性能更优)。
etcd 存储结构示意 etcd 存储结构示意 etcd 集群 etcd 节点 1 Leader etcd 节点 2 Follower etcd 节点 3 Follower 存储的 Key-Value 示例 /registry/pods/default/my-pod → {Protobuf 序列化的 Pod 对象} /registry/deployments/default/my-deploy → {Protobuf 序列化的 Deployment 对象}

2.4 核心组件交互关系总结

以下表格总结了各组件在请求处理中的角色与关键性能指标:

组件 输入 输出 关键性能指标
HTTP 层 HTTP 请求 路由后的内部请求 QPS、连接数
认证 / 证书 用户身份信息 认证延迟(P99)
授权 用户 + 操作 + 资源 允许/拒绝 策略评估延迟
准入控制 资源对象 修改后的对象 Webhook 延迟
存储层 序列化后的对象 持久化写入 写入延迟、Watch 延迟