BottomUp Syncer 是 Kubeocean 系统的核心同步组件之一,负责从物理集群到虚拟算力集群的资源同步。它实现了 Kubernetes Controller 模式,通过监听物理集群的资源变化,将相关信息同步到虚拟集群中,为虚拟算力集群提供实时的资源状态信息。
- 物理节点同步: 监听物理集群节点变化,根据 ResourceLeasingPolicy 计算可抽取资源,创建和更新虚拟节点
- Pod 状态同步: 监控物理集群中 Kubeocean 管理的 Pod 状态变化,同步状态到虚拟集群
- CSI 节点同步: 同步物理集群的 CSI 节点信息到虚拟集群,确保存储功能的可用性
- 资源策略管理: 监听 ResourceLeasingPolicy 变化,触发节点重新评估和资源计算
- 租约管理: 为每个虚拟节点创建和管理租约,确保节点的活跃状态
- 节点重新评估: 支持根据策略变化触发特定节点的重新评估和资源计算
职责: 物理节点控制器,负责虚拟节点的创建和管理
主要功能:
- 监听物理集群节点变化,根据 ClusterBinding 的节点选择器过滤节点
- 根据 ResourceLeasingPolicy 计算可抽取的资源量
- 创建和更新虚拟节点,包括资源容量、标签和注解
- 管理时间窗口和节点污点,处理策略的时间限制
- 启动和管理虚拟节点的租约控制器
关键特性:
- 支持多种资源策略的优先级处理
- 智能的时间窗口管理和污点控制
- 动态资源计算和虚拟节点生命周期管理
职责: 物理 Pod 控制器,负责 Pod 状态同步
主要功能:
- 监听物理集群 Pod 状态变化,只处理 Kubeocean 管理的 Pod
- 验证物理 Pod 的必需注解和标签
- 同步 Pod 状态到对应的虚拟 Pod
- 处理 Pod 删除和状态更新
- 维护物理 Pod 和虚拟 Pod 的映射关系
关键特性:
- 只同步 Kubeocean 管理的 Pod,避免干扰其他工作负载
- 双向映射验证,确保数据一致性
- 优雅的状态同步和错误处理
职责: 物理 CSI 节点控制器,负责存储相关节点信息同步
主要功能:
- 监听物理集群 CSINode 变化
- 同步 CSI 节点信息到虚拟集群
- 管理虚拟 CSI 节点的生命周期
- 处理存储驱动信息的同步
关键特性:
- 支持存储驱动的动态发现
- 确保存储功能的可用性
- 处理 CSI 节点删除的清理
职责: 资源租赁策略控制器,负责策略应用和资源计算
主要功能:
- 监听 ResourceLeasingPolicy 变化
- 验证策略的时间窗口和资源限制配置
- 触发节点重新评估和资源计算
- 管理策略的生命周期和状态更新
关键特性:
- 支持时间窗口和资源限制的验证
- 自动触发节点重新评估
- 处理策略删除的资源回收
职责: 租约控制器,负责虚拟节点的租约管理
主要功能:
- 为每个虚拟节点创建和管理租约
- 定期续约确保节点活跃状态
- 处理租约过期和节点清理
- 支持租约的优雅停止
关键特性:
- 自动租约续约机制
- 支持租约过期处理
- 优雅的停止和清理
flowchart TD
subgraph BUS["BottomUp Syncer"]
BUC[BottomUp Syncer Core]
end
subgraph Controllers["Controllers"]
PNR[PhysicalNodeReconciler]
PPR[PhysicalPodReconciler]
PCR[PhysicalCSINodeReconciler]
RLR[ResourceLeasingPolicyReconciler]
end
subgraph Managers["Managers"]
PM[Physical Manager]
VM[Virtual Manager]
end
subgraph Lease["Lease Management"]
LC[LeaseController]
end
%% Core setup
BUC --> PNR
BUC --> PPR
BUC --> PCR
BUC --> RLR
%% Manager connections
PNR --> PM
PNR --> VM
PPR --> PM
PPR --> VM
PCR --> PM
PCR --> VM
RLR --> VM
%% Lease controller
PNR --> LC
LC --> VM
%% Policy interactions
RLR -.->|触发重新评估| PNR
PNR -.->|获取策略| RLR
%% Data flow
PM -->|物理资源状态| PNR
PNR -->|虚拟节点| VM
PM -->|Pod 状态| PPR
PPR -->|状态同步| VM
PM -->|CSI 信息| PCR
PCR -->|虚拟 CSI| VM
flowchart TD
A[开始 Reconcile] --> B{物理节点存在?}
B -->|否| C[处理节点删除]
B -->|是| D{节点正在删除?}
D -->|是| C
D -->|否| E[获取 ClusterBinding]
E --> F{节点匹配选择器?}
F -->|否| C
F -->|是| G[获取适用策略]
G --> H{有匹配策略?}
H -->|是| I[选择最早策略]
H -->|否| J[使用所有剩余资源]
I --> K{在时间窗口内?}
K -->|否| L[处理时间窗口外]
K -->|是| M[移除时间窗口污点]
J --> N[计算可用资源]
L --> N
M --> N
N --> O{计算成功?}
O -->|否| P[返回错误]
O -->|是| Q[创建或更新虚拟节点]
Q --> R{操作成功?}
R -->|否| S[返回错误]
R -->|是| T[启动租约控制器]
T --> U[设置重新同步间隔]
U --> V[结束]
C --> V
flowchart TD
A[开始处理节点删除] --> B[检查 ClusterID]
B --> C{ClusterID 存在?}
C -->|否| D[返回错误]
C -->|是| E[生成虚拟节点名称]
E --> F[获取虚拟节点]
F --> G{虚拟节点存在?}
G -->|否| H[记录日志并结束]
G -->|是| I{已有删除污点?}
I -->|否| J[添加删除污点]
I -->|是| K[立即强制驱逐所有 Pod]
J --> L[检查污点是否已存在]
L --> M{污点已存在?}
M -->|是| N[直接使用现有节点]
M -->|否| O[创建删除污点对象]
O --> P[设置污点键值对]
P --> Q[添加污点到节点污点列表]
Q --> R[设置删除时间注解]
R --> S[更新虚拟节点]
S --> T{更新成功?}
T -->|否| U[返回更新错误]
T -->|是| V[记录污点添加成功日志]
V --> K
N --> K
K --> W[强制驱逐所有 Pod]
W --> II[检查节点上的 Pod]
II --> LL{有活跃 Pod?}
LL -->|是| MM[设置10秒后重新检查]
LL -->|否| OO[停止租约控制器]
OO --> WW[删除虚拟节点]
WW --> ZZ{删除成功?}
ZZ -->|否| AAA[返回删除错误]
ZZ -->|是| BBB[记录删除成功日志]
BBB --> CCC[结束]
MM --> CCC
flowchart TD
A[开始创建或更新虚拟节点] --> B[生成虚拟节点名称]
B --> C[构建虚拟节点标签和注解]
C --> D[转换物理节点污点]
D --> E[计算可用资源]
E --> F[创建虚拟节点对象]
F --> G[保存期望元数据到注解]
G --> H[检查虚拟节点是否存在]
H --> I{虚拟节点存在?}
I -->|否| J[创建虚拟节点]
I -->|是| K[获取现有虚拟节点]
K --> L[保留用户自定义]
L --> M[更新虚拟节点状态]
M --> N{污点是否变化?}
N -->|是| O[单独更新污点]
N -->|否| P[启动租约控制器]
O --> P
J --> P
P --> Q[结束]
subgraph "保留用户自定义"
L1[获取之前期望的元数据] --> L2[创建当前期望的元数据]
L2 --> L3[保存当前期望元数据]
L3 --> L4[合并用户自定义标签]
L4 --> L5[合并用户自定义注解]
L5 --> L6[合并用户自定义污点]
L6 --> L7[完成用户自定义保留]
end
flowchart TD
A[开始处理时间窗口外] --> B[获取虚拟节点]
B --> C{虚拟节点存在?}
C -->|否| D[设置默认重新同步时间]
C -->|是| E[检查现有时间窗口外污点]
D --> Z[结束]
E --> F[获取策略优雅回收周期]
F --> G{强制回收标志?}
G -->|否| H[设置 NoSchedule 污点效果]
G -->|是| I{优雅回收周期为0?}
I -->|是| J[设置 NoExecute 污点效果]
I -->|否| K{现有污点存在?}
K -->|否| L[设置 NoSchedule 污点效果]
K -->|是| M{污点效果是 NoExecute?}
M -->|是| N[设置默认重新同步时间]
M -->|否| O{污点有时间戳?}
O -->|否| P[设置 NoExecute 污点效果]
O -->|是| Q[计算污点添加时间]
Q --> R{超过优雅回收周期?}
R -->|是| S[设置 NoExecute 污点效果]
R -->|否| T[计算剩余时间]
T --> U[设置剩余时间后重新同步]
H --> V[添加或更新污点]
J --> V
L --> V
P --> V
S --> V
V --> W[更新虚拟节点]
W --> X[设置重新同步时间]
X --> Z[结束]
N --> Z
U --> Z
flowchart TD
A[开始 Reconcile] --> B{物理 Pod 存在?}
B -->|否| C[结束]
B -->|是| D{是 Kubeocean 管理的 Pod?}
D -->|否| C
D -->|是| E{有必需注解?}
E -->|否| F[删除物理 Pod]
E -->|是| G[获取并验证虚拟 Pod]
G --> H{虚拟 Pod 存在且匹配?}
H -->|否| F
H -->|是| I{注解指向当前物理 Pod?}
I -->|否| F
I -->|是| J[同步物理 Pod 到虚拟 Pod]
J --> K{同步成功?}
K -->|否| L[返回错误]
K -->|是| M[结束]
F --> O{删除成功?}
O -->|否| P[返回错误]
O -->|是| M
PhysicalNodeReconciler 实现了智能的资源计算机制,根据 ResourceLeasingPolicy 动态计算可抽取的资源:
- 策略匹配: 根据节点选择器匹配适用的 ResourceLeasingPolicy
- 优先级处理: 当多个策略匹配时,选择创建时间最早的策略
- 时间窗口管理: 检查策略的时间窗口,在窗口外时添加污点
- 资源计算: 根据策略的资源限制计算可抽取的 CPU、内存等资源
- 动态调整: 实时响应策略变化,重新计算资源分配
实现了完整的虚拟节点生命周期管理机制:
- 创建流程: 根据物理节点和策略创建虚拟节点,设置正确的标签和注解
- 更新机制: 监听物理节点变化,实时更新虚拟节点的资源信息
- 删除处理: 当物理节点删除或不匹配选择器时,优雅删除虚拟节点
- 污点管理: 根据时间窗口状态动态管理节点污点
- 租约维护: 为每个虚拟节点维护活跃租约,确保节点可用性
PhysicalPodReconciler 实现了精确的 Pod 状态同步:
- 过滤机制: 只处理带有 Kubeocean 管理标签的 Pod
- 注解验证: 验证物理 Pod 包含必需的虚拟 Pod 映射注解
- 双向验证: 确保虚拟 Pod 的注解正确指向当前物理 Pod
- 状态同步: 将物理 Pod 的状态信息同步到虚拟 Pod
- 清理机制: 当映射关系失效时,自动清理物理 Pod
ResourceLeasingPolicyReconciler 实现了高效的策略触发机制:
- 变化检测: 监听策略的创建、更新和删除事件
- 节点查找: 根据策略的节点选择器查找匹配的节点
- 重新评估: 触发匹配节点的重新评估和资源计算
- 状态更新: 更新策略的状态信息,包括时间窗口状态
- 生命周期管理: 处理策略删除时的资源回收
LeaseController 实现了可靠的租约管理:
- 自动续约: 定期续约确保虚拟节点的活跃状态
- 过期处理: 处理租约过期的情况,确保节点状态正确
- 优雅停止: 支持租约控制器的优雅停止和清理
- 并发控制: 处理多个租约控制器的并发操作
- 错误恢复: 在租约操作失败时进行重试和恢复