3. 平台架构总览:校准平台整体架构、核心模块划分、与Kubernetes API交互方式
资源配额校准平台并非一个单体应用,而是一套围绕 “声明式配额定义 → 持续差异检测 → 自动修正 → 审计闭环” 设计的微服务与控制器组合体。本章从宏观视角拆解平台的骨架、模块职责以及它与 Kubernetes API 的通信模式,为后续章节的模块级实战打下基础。
3.1 整体架构分层
平台采用经典的四层架构:接入层、控制层、数据层 和 Kubernetes 集群层。每一层职责清晰,层间通过 gRPC 或 RESTful API 解耦。
架构要点:控制层是整个平台的“大脑”,它不直接操作 Kubernetes 资源,而是通过 Kubernetes 客户端库(client-go) 与 API Server 交互。数据层存储的是“期望状态”,而非集群实时状态。
3.2 核心模块划分
平台内部按功能边界拆分为 6 个核心模块,每个模块可独立部署、独立扩缩容。下表列出模块名称、职责与关键依赖:
| 模块名称 | 核心职责 | 关键依赖 |
|---|---|---|
| 配额策略引擎 | 解析 GitOps 仓库中的 YAML 配额声明,校验语法与业务规则 | PostgreSQL(策略库)、Redis(规则缓存) |
| 差异计算器 | 对比“期望配额”与集群“实际配额”,生成差异报告 | Kubernetes API(List/Watch ResourceQuota) |
| 自动修正控制器 | 根据差异报告自动 Apply 或 Patch 集群 ResourceQuota 对象 | Kubernetes API(Create/Update)、审计日志服务 |
| 审计日志服务 | 记录所有配额变更、人工审批、异常事件,支持回放与追溯 | PostgreSQL(审计表)、对象存储(归档) |
| Web Portal | 提供可视化仪表盘、手动触发校准、审批工作流 | 控制层 gRPC 接口、OIDC 认证 |
| GitOps Webhook | 接收 Git 仓库的 Push/MR 事件,触发预校验与自动同步 | GitLab/GitHub Webhook、策略引擎 |
3.3 与 Kubernetes API 的交互方式
平台与 Kubernetes API 的交互遵循 “只读监听 + 条件写入” 原则,避免对集群造成不必要的写压力。具体采用以下三种模式:
- List-Watch 模式(差异计算器)
通过client-go的 Informer 机制,监听所有命名空间的ResourceQuota和LimitRange对象变化。本地维护一份增量缓存,差异计算器直接从缓存读取,不反复请求 API Server。 - 条件写入模式(自动修正控制器)
仅在差异计算器报告“期望值与实际值偏差超过阈值”时,才发起PATCH或PUT请求。写入前先通过resourceVersion做乐观锁校验,防止并发覆盖。 - Webhook 模式(准入校验)
平台可选部署MutatingWebhookConfiguration,在 Pod 创建或 ResourceQuota 更新时拦截请求,校验配额声明是否与基线一致。此模式为“防御性”交互,非核心路径。
3.4 关键交互代码片段
以下代码展示差异计算器如何使用 client-go 的 Informer 监听 ResourceQuota 对象,并计算与基线配额的差异:
// 使用 Informer 监听所有命名空间的 ResourceQuota
factory := informers.NewSharedInformerFactory(clientset, 0)
informer := factory.Core().V1().ResourceQuotas().Informer()
informer.AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) {
quota := obj.(*corev1.ResourceQuota)
diff := calculateDiff(quota, baselineQuota)
if diff.HasDeviation() {
reportQueue.Add(diff)
}
},
UpdateFunc: func(oldObj, newObj interface{}) {
newQuota := newObj.(*corev1.ResourceQuota)
diff := calculateDiff(newQuota, baselineQuota)
if diff.HasDeviation() {
reportQueue.Add(diff)
}
},
})
stopCh := make(chan struct{})
factory.Start(stopCh)
factory.WaitForCacheSync(stopCh)
避坑提示:Informer 的本地缓存默认 5 分钟与 API Server 同步一次。如果配额变更频率极高(如秒级弹性场景),建议将
ResyncPeriod 缩短至 30 秒,或直接使用 ListWatch 手动控制同步周期。
3.5 架构设计决策总结
| 决策项 | 选择 | 理由 |
|---|---|---|
| 控制层与数据层通信 | gRPC + Protobuf | 低延迟、强类型、支持双向流(审计日志推送) |
| 配额基线存储 | PostgreSQL + Git YAML 双源 | Git 作为单一事实来源,DB 作为高性能查询缓存 |
| Kubernetes 客户端库 | client-go + 动态客户端 | 支持 CRD 扩展(未来可对接自定义配额资源) |
| 写入限速 | 令牌桶 + 指数退避 | 防止异常场景下对 API Server 造成突发压力 |