3. 平台架构总览:校准平台整体架构、核心模块划分、与Kubernetes API交互方式

资源配额校准平台并非一个单体应用,而是一套围绕 “声明式配额定义 → 持续差异检测 → 自动修正 → 审计闭环” 设计的微服务与控制器组合体。本章从宏观视角拆解平台的骨架、模块职责以及它与 Kubernetes API 的通信模式,为后续章节的模块级实战打下基础。

3.1 整体架构分层

平台采用经典的四层架构:接入层、控制层、数据层 和 Kubernetes 集群层。每一层职责清晰,层间通过 gRPC 或 RESTful API 解耦。

资源配额校准平台四层架构总览 资源配额校准平台 — 四层架构总览 接入层 Web Portal | GitOps Webhook | CLI 工具 | OpenAPI 网关 控制层(核心引擎) 配额策略引擎 | 差异计算器 | 自动修正控制器 | 审计日志服务 数据层 PostgreSQL(配额基线) | Redis(缓存/锁) | 对象存储(审计归档) Kubernetes 集群层 kube-apiserver | ResourceQuota CRD | LimitRange | 命名空间
架构要点:控制层是整个平台的“大脑”,它不直接操作 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 的交互遵循 “只读监听 + 条件写入” 原则,避免对集群造成不必要的写压力。具体采用以下三种模式:

  1. List-Watch 模式(差异计算器)
    通过 client-go 的 Informer 机制,监听所有命名空间的 ResourceQuota 和 LimitRange 对象变化。本地维护一份增量缓存,差异计算器直接从缓存读取,不反复请求 API Server。
  2. 条件写入模式(自动修正控制器)
    仅在差异计算器报告“期望值与实际值偏差超过阈值”时,才发起 PATCH 或 PUT 请求。写入前先通过 resourceVersion 做乐观锁校验,防止并发覆盖。
  3. Webhook 模式(准入校验)
    平台可选部署 MutatingWebhookConfiguration,在 Pod 创建或 ResourceQuota 更新时拦截请求,校验配额声明是否与基线一致。此模式为“防御性”交互,非核心路径。
平台与 Kubernetes API 交互流程 平台与 Kubernetes API 交互流程 平台控制层 差异计算器 自动修正控制器 Kubernetes API Server /api/v1/namespaces/{ns}/resourcequotas Watch / List / Patch / Create ① List-Watch (Informer) ② 差异报告 (gRPC) ③ Patch / Create (条件写入) 交互原则 只读监听(List-Watch)占 95% 请求量;写入仅在差异超过阈值时触发,且带 resourceVersion 乐观锁。

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 造成突发压力