2. kube-apiserver 深度解析:API 聚合层、认证授权准入链、请求处理流程、资源配额管理
kube-apiserver 是 Kubernetes 控制面的核心网关,所有对集群状态的查询和变更操作都必须经过它。本章深入剖析其内部架构,包括 API 聚合层、认证/授权/准入控制链、完整的请求处理流程以及资源配额管理机制,帮助你在选型和性能验证中做出精准决策。
2.1 API 聚合层:扩展 API 的基石
API 聚合层(API Aggregation Layer)允许你将第三方或自定义的 API 服务无缝集成到 Kubernetes API 中,使其看起来像原生资源一样。它通过 APIService 对象进行注册。
核心价值:无需修改 kube-apiserver 核心代码即可扩展 API,支持自定义控制器、监控系统、服务网格等组件的集成。
2.1.1 API 聚合层架构
2.1.2 APIService 对象示例
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
name: v1beta1.custom.metrics.k8s.io
spec:
group: custom.metrics.k8s.io
version: v1beta1
service:
name: custom-metrics-server
namespace: monitoring
groupPriorityMinimum: 100
versionPriority: 15
insecureSkipTLSVerify: false
caBundle: <base64-encoded-ca-cert>
2.2 认证、授权与准入控制链
每个 API 请求在到达资源存储(etcd)之前,必须依次通过认证、授权和准入控制三个阶段。这条链是集群安全的第一道防线。
2.2.1 三阶段处理流程
2.2.2 认证模块对比
| 认证方式 | 原理 | 适用场景 | 性能影响 |
|---|---|---|---|
| X.509 客户端证书 | 通过 TLS 握手验证证书 CN/O 字段 | 节点、kube-controller-manager 等组件 | 低(TLS 握手开销) |
| Bearer | 验证 JWT 或静态 | ServiceAccount、用户令牌 | 低(本地验证) |
| Webhook | 将 发送到外部服务验证 | 集成企业 OIDC/LDAP | 中(网络延迟) |
| Anonymous | 允许未认证请求(需授权策略配合) | 健康检查、只读监控 | 无 |
2.2.3 授权模式选择
- RBAC(推荐):基于角色访问控制,通过 Role/ClusterRole 和 RoleBinding/ClusterRoleBinding 实现细粒度权限。
- ABAC:基于属性的访问控制,策略文件静态配置,灵活性低,不推荐新集群使用。
- Webhook:将授权决策委托给外部服务,适合需要自定义策略引擎的场景。
- AlwaysDeny / AlwaysAllow:仅用于测试或特殊场景,生产环境禁止使用。
性能建议:RBAC 使用本地缓存,性能最佳。Webhook 授权会增加请求延迟,建议在外部授权服务前加本地缓存层。
2.3 请求处理流程
一个完整的 API 请求从客户端发出到最终写入 etcd,经历多个内部阶段。理解这个流程对性能调优和故障排查至关重要。
2.3.1 请求处理阶段
- HTTP 路由匹配:根据请求路径和 HTTP 方法匹配对应的资源处理器。
- 认证:按配置顺序尝试所有认证模块,提取用户身份信息。
- 授权:根据用户身份和请求资源进行权限检查。
- 准入控制(Mutating):修改请求对象的准入插件(如
MutatingAdmissionWebhook、DefaultStorageClass)。 - 对象验证:对请求对象进行结构化和语义验证。
- 准入控制(Validating):验证请求对象的准入插件(如
ValidatingAdmissionWebhook、PodSecurity)。 - 资源配额检查:检查请求是否超出命名空间或集群的资源配额。
- 存储写入:将对象序列化后写入 etcd。
- 响应返回:构造 HTTP 响应并返回给客户端。
2.3.2 请求处理时序图
2.4 资源配额管理
资源配额(ResourceQuota)用于限制命名空间级别的资源消耗总量,防止单个命名空间耗尽集群资源。kube-apiserver 在准入控制阶段执行配额检查。
2.4.1 配额类型
| 类别 | 资源字段 | 说明 |
|---|---|---|
| 计算资源 | requests.cpu、requests.memory、limits.cpu、limits.memory |
限制 Pod 的 CPU 和内存请求/限制总和 |
| 存储资源 | requests.storage、persistentvolumeclaims |
限制 PVC 请求的存储总量和数量 |
| 对象数量 | pods、services、configmaps、secrets 等 |
限制各类 Kubernetes 对象的数量 |
| 扩展资源 | requests.nvidia.com/gpu 等 |
限制自定义扩展资源的使用 |
2.4.2 配额评估流程
- 请求到达:创建或更新资源的请求进入准入控制阶段。
- 配额匹配:根据请求的命名空间查找对应的
ResourceQuota对象。 - 资源计算:计算当前命名空间已使用的资源总量 + 请求的资源量。
- 阈值比较:将计算结果与配额限制进行比较。
- 决策:如果超出限制,拒绝请求并返回 403 Forbidden;否则允许继续。
性能陷阱:配额检查需要实时计算命名空间内所有相关资源的使用量,在大量并发创建 Pod 的场景下,会显著增加 kube-apiserver 的 CPU 和 etcd 负载。建议对高频创建/删除的命名空间谨慎设置配额,或使用
--quota-resource-count-minimum 参数调整缓存策略。
2.4.3 配额示例
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-quota
namespace: production
spec:
hard:
requests.cpu: "10"
requests.memory: "20Gi"
limits.cpu: "20"
limits.memory: "40Gi"
pods: "50"
services: "10"
persistentvolumeclaims: "20"
requests.storage: "100Gi"
2.5 性能关键点总结
- API 聚合层:每个扩展 API 服务器都会增加代理延迟,建议将扩展服务部署在集群内并启用连接池。
- 认证链:Webhook 认证是主要延迟来源,优先使用本地认证方式(X.509、ServiceAccount )。
- 准入 Webhook:Mutating 和 Validating Webhook 会串行执行,超时设置(默认 30s)和失败策略(Fail/Ignore)直接影响集群可用性。
- 配额检查:大量 ResourceQuota 对象或高频资源变更会触发频繁的 etcd 读取,建议使用
--watch-cache和--watch-cache-sizes优化。 - 请求并发:kube-apiserver 默认最大并发请求数为 400(
--max-requests-inflight),超出部分会排队,导致客户端超时。
性能验证建议:使用
kubectl top apiserver 或 Prometheus 监控 apiserver_request_duration_seconds 指标,重点关注 p99 延迟和拒绝率。在选型时,根据集群规模(节点数、Pod 数、API 请求 QPS)合理配置 kube-apiserver 的副本数和资源限制。