2. kube-apiserver 架构深度解析:组件内部模块与交互流程
kube-apiserver 是 Kubernetes 控制面的核心网关,所有对集群状态的读写操作都必须经过它。理解其内部模块的职责与交互顺序,是进行安全回滚验证的前提。本章将逐一拆解认证、授权、准入控制、API 路由与存储层五个核心模块,并展示请求的完整生命周期。
2.1 五层模块总览
kube-apiserver 采用“请求处理管道”架构,每个模块在管道中承担特定职责。下表总结了各模块的核心功能与常见实现:
| 模块 | 职责 | 常见实现/组件 | 失败后果 |
|---|---|---|---|
| 认证 (Authentication) | 验证请求发起者的身份 | X.509 证书、Bearer 、Webhook TokenReview | 401 Unauthorized |
| 授权 (Authorization) | 判断已认证用户是否有权执行操作 | RBAC、ABAC、Webhook SubjectAccessReview | 403 Forbidden |
| 准入控制 (Admission Control) | 在持久化前对请求进行修改或校验 | MutatingWebhookConfiguration、ValidatingWebhookConfiguration、内置插件 (如 NamespaceLifecycle) | 请求被拒绝或数据不一致 |
| API 路由 (API Routing) | 将请求分发至对应的 REST 处理器 | Gorilla Mux / 自定义路由树 | 404 Not Found |
| 存储层 (Storage Layer) | 将资源对象持久化到 etcd | etcd3 客户端、Watch 缓存、Codec (序列化/反序列化) | 数据丢失或集群不可用 |
2.2 请求处理管道:模块交互流程
一个典型的 API 请求会依次经过认证 → 授权 → 准入控制 → API 路由 → 存储层。下图展示了这一完整流程:
2.3 模块深度解析
2.3.1 认证 (Authentication)
认证模块是请求进入 apiserver 的第一道关卡。它从 HTTP 请求中提取身份信息,并验证其有效性。kube-apiserver 支持同时启用多种认证方式,按顺序尝试,直到有一个成功:
- X.509 客户端证书:通过 TLS 握手时提供的证书中的 CN 字段识别用户。
- Bearer :从
Authorization: Bearer <>头中提取,支持静态 文件、ServiceAccount 或 Webhook TokenReview。 - Webhook TokenReview:将 发送给外部认证服务,由外部服务返回用户信息。
--client-ca-file、---auth-file 等认证参数是否一致。如果回滚后认证配置不匹配,所有 kubectl 请求都会返回 401。
2.3.2 授权 (Authorization)
认证通过后,授权模块根据用户身份和请求属性(操作、资源、命名空间)判断是否允许执行。授权策略按配置顺序评估,第一个匹配的规则决定允许或拒绝:
- RBAC (Role-Based Access Control):最常用,通过 Role/ClusterRole 和 RoleBinding/ClusterRoleBinding 绑定权限。
- ABAC (Attribute-Based Access Control):基于 JSON 策略文件,灵活性高但管理复杂。
- Webhook SubjectAccessReview:将授权决策委托给外部服务。
2.3.3 准入控制 (Admission Control)
准入控制是请求持久化前的最后一道防线,分为两个阶段:
- Mutating Admission:修改请求内容(如注入默认值、Sidecar 容器)。
- Validating Admission:校验请求合法性(如检查资源配额、Pod 安全策略)。
准入控制通过内置插件和动态 Webhook 实现。内置插件在 apiserver 启动时加载,Webhook 则通过 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration 资源动态注册。
# 查看当前启用的准入插件
kube-apiserver --enable-admission-plugins=NamespaceLifecycle,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook
2.3.4 API 路由 (API Routing)
API 路由模块负责将 HTTP 请求映射到对应的 REST 处理器。它根据请求的路径(如 /api/v1/pods)、HTTP 方法(GET、POST、PUT、DELETE)和资源版本(v1、v1beta1)进行匹配。路由树支持版本化 API 组,例如:
/api/v1/:核心 API 组/apis/apps/v1/:命名 API 组/apis/rbac.authorization.k8s.io/v1/:RBAC API 组
2.3.5 存储层 (Storage Layer)
存储层是 apiserver 与 etcd 之间的桥梁。它负责将资源对象序列化为 JSON 或 Protobuf 格式,并通过 etcd 的 gRPC API 进行读写。存储层还维护了一个 Watch 缓存,用于高效处理客户端的长轮询请求。
| 存储层组件 | 职责 | 回滚影响 |
|---|---|---|
| Codec | 资源对象的序列化/反序列化 | 新旧版本 Codec 可能不兼容,导致数据读取失败 |
| Storage Interface | 封装 etcd 的 CRUD 操作 | 接口变更可能导致存储操作异常 |
| Watch Cache | 缓存资源变更事件,减少 etcd 压力 | 缓存版本不一致可能导致 Watch 事件丢失 |
2.4 模块交互的完整时序
下图以“创建 Pod”请求为例,展示各模块的详细交互时序:
2.5 回滚验证中的模块关注点
在回滚 kube-apiserver 时,每个模块都可能成为风险点。下表总结了各模块在回滚场景下的关键验证项:
| 模块 | 回滚验证项 | 验证方法 |
|---|---|---|
| 认证 | 证书文件、 文件、Webhook 配置是否一致 | 对比新旧版本启动参数 |
| 授权 | RBAC 资源是否被新版本修改 | etcd 中备份 RBAC 对象并对比 |
| 准入控制 | Webhook 服务地址、证书、插件列表是否兼容 | 测试创建/更新资源 |
| API 路由 | API 版本是否被弃用或移除 | 检查 API 版本可用性 |
| 存储层 | etcd 数据格式是否兼容 | 使用 etcdctl get 检查关键资源 |