目录
- 目录
- 0. 项目概述
- 1. 项目分析
- 2. 代码结构分析
0. 项目概述
项目概述
KubeFleet 是一个开源的 Kubernetes 多集群管理解决方案,其核心目标是实现将 Kubernetes 集群视为”牛”(cattle)而不是”宠物”(pets)的理念,即实现集群的标准化管理和自动化运维。
核心概念
- Fleet(舰队):用于管理多个 Kubernetes 集群的解决方案
- Hub Cluster(中心集群):作为控制平面的 Kubernetes 集群
- Member Cluster(成员集群):舰队中的成员 Kubernetes 集群
- Fleet-system Namespace:在所有集群中预留的命名空间,用于运行 Fleet 网络控制器和内部资源
主要功能模块
- 集群加入/离开机制
- 允许成员集群通过注册自定义资源到中心集群来加入或离开舰队
- 提供集群身份验证和授权机制
- 工作负载编排
- 允许用户在中心集群创建资源
- 支持将资源选择性地传播到舰队中的指定成员集群
1. 项目分析
Fleet 是 Kubernetes 社区的一个项目,旨在解决多集群管理中的挑战。它提供了一种标准化的方式来管理多个 Kubernetes 集群,使得集群的加入、离开、身份验证和授权等操作更加简单和可控。
技术栈
- 使用 Go 语言开发
- 基于 Kubernetes 原生 API 和自定义资源定义(CRD)
- 使用 Helm 进行部署
- 支持 Docker 容器化
项目目标和发展方向
- 集群属性支持
- 支持节点级别的 SKU 属性(CPU、GPU、内存等)
- 支持网络拓扑属性
- 调度功能增强
- 支持命名空间资源的调度
- 实现动态调度
- 支持工作负载的亲和性/反亲和性
- 健康检查
- 支持自定义工作负载健康检查
- 扩展模式
- 支持工作负载的扩展模式
- 实现集群间的负载均衡
使用场景
- 多集群管理
- 工作负载分发
- 集群资源优化
- 高可用部署
- 跨集群服务编排
这个项目的主要价值在于提供了一个统一的平台来管理多个 Kubernetes 集群,使得集群管理更加自动化和标准化。它特别适合需要管理多个 Kubernetes 集群的企业级应用场景,比如混合云环境、多区域部署等。
2. 代码结构分析
基于代码结构分析,我来详细说明 KubeFleet 各个模块之间的协作关系:
- 核心控制层
- 集群管理模块
- membercluster 控制器:负责成员集群的生命周期管理
- internalmembercluster 控制器:处理内部成员集群状态
- memberclusterplacement 控制器:处理集群放置策略
- clusterinventory 控制器:维护集群资源清单
- 资源编排模块
- clusterresourceplacement 控制器:负责资源放置决策
- workgenerator 控制器:生成具体的工作负载
- workapplier 控制器:应用工作负载到目标集群
- workv1alpha1 控制器:处理工作负载版本兼容性
- 调度层
- scheduler 模块:负责资源调度决策
- propertyprovider 模块:提供集群属性信息
- clusterschedulingpolicysnapshot 控制器:维护调度策略快照
- 监控和变更追踪
- resourcewatcher 模块:监控资源变化
- clusterresourceplacementwatcher 控制器:监控资源放置变化
- clusterresourcebindingwatcher 控制器:监控资源绑定状态
- metrics 模块:收集和暴露指标
- 安全层
- webhook 模块:处理准入控制
- authtoken 模块:处理认证令牌
模块间协作流程
- 集群加入流程
用户请求 -> webhook验证 -> membercluster控制器 -> internalmembercluster控制器
-> clusterinventory更新 -> 集群状态同步
- 资源部署流程
用户创建资源 -> clusterresourceplacement控制器 -> scheduler决策
-> workgenerator生成工作负载 -> workapplier应用负载 -> resourcewatcher监控状态
- 调度决策流程
propertyprovider提供集群属性 -> clusterschedulingpolicysnapshot更新
-> scheduler进行调度决策 -> memberclusterplacement执行放置
- 状态同步流程
resourcewatcher监控变化 -> clusterresourcebindingwatcher更新绑定
-> metrics收集指标 -> 状态反馈给用户
关键交互点
- 控制器协调:
- 各个控制器通过 Kubernetes 的 informer 机制监听资源变化
- 控制器之间通过自定义资源(CR)进行状态传递
- 使用 finalizer 确保资源清理的完整性
- 调度决策:
- propertyprovider 提供集群属性信息
- scheduler 基于属性和策略进行调度决策
- memberclusterplacement 执行具体的放置操作
- 工作负载管理:
- workgenerator 生成具体的工作负载
- workapplier 负责将工作负载应用到目标集群
- resourcewatcher 监控工作负载状态
- 状态同步:
- 各个 watcher 持续监控资源状态
- metrics 模块收集性能指标
- 状态变化通过 CR 更新反馈
数据流向
- 配置数据流:
用户配置 -> webhook验证 -> 控制器处理 -> 资源创建/更新
- 状态数据流:
集群状态 -> watcher监控 -> 控制器处理 -> 状态更新
- 指标数据流:
系统运行 -> metrics收集 -> 指标暴露 -> 监控系统
这种模块化的设计使得系统具有良好的可扩展性和可维护性,每个模块都有明确的职责,通过标准的 Kubernetes 机制进行协作。同时,模块间的松耦合设计也使得系统更容易进行功能扩展和问题定位。
2.1 membercluster 控制器 与 internalmembercluster 控制器
- 职责定位不同
MemberCluster 控制器:
- 运行在 Hub 集群(中心集群)上
- 负责处理用户创建的 MemberCluster 资源
- 主要职责:
- 管理成员集群的加入/离开流程
- 创建和管理必要的 RBAC 资源
- 创建和管理命名空间
- 创建和管理 InternalMemberCluster 资源
- 处理成员集群的生命周期事件
InternalMemberCluster 控制器:
- 运行在成员集群上
- 负责处理成员集群内部的协调工作
- 主要职责:
- 管理成员集群的健康状态
- 收集和报告集群属性
- 管理成员集群上的代理(agents)
- 维护心跳信息
- 处理资源统计信息
- 功能特点不同
MemberCluster 控制器:
- 提供集群加入/离开的完整流程
- 管理集群级别的权限和访问控制
- 处理集群级别的资源清理
- 维护集群加入状态
- 提供集群级别的条件(conditions)管理
InternalMemberCluster 控制器:
- 提供集群属性收集机制
- 管理集群健康检查
- 处理集群资源统计
- 维护代理状态
- 提供集群心跳机制
- 交互对象不同
MemberCluster 控制器:
- 与 Kubernetes API 服务器交互
- 创建和管理 RBAC 资源
- 创建和管理命名空间
- 管理
InternalMemberCluster
资源
InternalMemberCluster 控制器:
- 与成员集群的 API 服务器交互
- 与属性提供者(PropertyProvider)交互
- 与成员集群上的代理交互
- 管理集群资源统计
- 状态管理不同
MemberCluster 控制器:
- 管理集群加入状态(ReadyToJoin, Joined, Left 等)
- 处理集群级别的条件
- 管理集群级别的资源状态
InternalMemberCluster 控制器:
- 管理集群健康状态
- 管理集群属性状态
- 管理代理状态
- 维护心跳状态
- 资源管理不同
MemberCluster 控制器:
- 管理集群级别的资源(命名空间、RBAC 等)
- 处理集群资源的创建和清理
- 管理集群级别的权限
InternalMemberCluster 控制器:
- 收集和报告集群资源统计
- 管理集群内部代理资源
- 处理集群属性资源
- 工作流程不同
MemberCluster 控制器:
用户创建 MemberCluster -> 创建命名空间和 RBAC -> 创建 InternalMemberCluster
-> 管理集群加入状态 -> 处理集群生命周期事件
InternalMemberCluster 控制器:
启动代理 -> 收集集群属性 -> 更新健康状态 -> 维护心跳
-> 报告资源统计 -> 管理代理状态
总结 这两个控制器是 KubeFleet 中集群管理的两个关键组件,它们协同工作但职责不同:
MemberCluster 控制器
负责集群级别的管理和协调InternalMemberCluster 控制器
负责成员集群内部的运行状态管理
它们通过 Kubernetes 的 API 和自定义资源进行交互,共同确保集群管理的完整性和可靠性。这种设计使得集群管理更加模块化和可维护,同时也提供了更好的扩展性。
2.2 ClusterInventory 控制器
ClusterInventory 控制器主要负责:
- 为每个
MemberCluster
创建和管理对应的ClusterProfile
- 同步集群状态和健康信息
- 处理集群配置文件的清理工作
工作流程:
- 获取 MemberCluster
- 检索 MemberCluster 对象
- 处理对象不存在的情况
- 处理删除操作
- 检查是否标记为删除
- 清理相关的 ClusterProfile
- 移除清理 finalizer
- 管理 Finalizer
- 检查并添加清理 finalizer
- 确保资源正确清理
- 创建/更新 ClusterProfile
- 创建或更新对应的 ClusterProfile
- 设置必要的标签和显示名称
- 同步集群状态
状态同步:
func (r *Reconciler) syncClusterProfileCondition(mc *clusterv1beta1.MemberCluster, cp *clusterinventory.ClusterProfile)
状态同步逻辑:
- 健康状态检查
- 检查成员代理状态
- 验证心跳信息
- 评估 API 服务器健康状态
- 状态条件设置
- 设置控制平面健康状态
- 更新观察到的生成版本
- 提供详细的状态消息
状态同步条件
const (
clusterNoStatusReason = "MemberAgentReportedNoStatus"
clusterHeartbeatLostReason = "MemberAgentHeartbeatLost"
clusterHealthUnknownReason = "MemberAgentReportedNoHealthInfo"
clusterUnHealthyReason = "MemberClusterAPIServerUnhealthy"
clusterHealthyReason = "MemberClusterAPIServerHealthy"
)
健康状态评估
switch {
case memberAgentStatus == nil:
// 处理未报告状态的情况
case mcHealthCond == nil:
// 处理缺少健康条件的情况
case memberAgentLastHeartbeat == nil || time.Since(memberAgentLastHeartbeat.Time) > r.ClusterUnhealthyThreshold:
// 处理心跳丢失的情况
case mcHealthCond.Status == metav1.ConditionUnknown:
// 处理未知状态的情况
case mcHealthCond.Status == metav1.ConditionFalse:
// 处理不健康状态的情况
default:
// 处理健康状态的情况
}
使用场景
- 集群健康监控
- 监控集群 API 服务器状态
- 跟踪心跳信息
- 评估集群健康状态
- 集群配置管理
- 维护集群配置文件
- 同步集群状态
- 管理集群元数据
- 资源生命周期管理
- 处理集群加入/离开
- 管理资源清理
- 维护资源状态
2.3 ClusterResourcePlacement 策略详解
1. 放置类型策略 (PlacementType)
ClusterResourcePlacement 支持三种主要的放置类型:
type PlacementType string
const (
PickAll PlacementType = "PickAll" // 选择所有集群
PickN PlacementType = "PickN" // 选择指定数量的集群
PickFixed PlacementType = "PickFixed" // 选择固定的集群列表
)
1.1 PickAll
- 选择所有可用的成员集群
- 适用于需要全量部署的场景
- 不考虑集群数量限制
1.2 PickN
- 选择指定数量的集群
- 可以结合亲和性规则进行选择
- 支持动态调整集群数量
1.3 PickFixed
- 选择固定的集群列表
- 通过 ClusterNames 指定目标集群
- 适用于静态部署场景
2. 集群选择策略
2.1 固定集群列表
type PlacementPolicy struct {
// 固定集群名称列表
ClusterNames []string `json:"clusterNames,omitempty"`
}
- 直接指定目标集群名称
- 仅适用于 PickFixed 类型
- 提供精确的集群选择
2.2 集群数量选择
type PlacementPolicy struct {
// 选择指定数量的集群
NumberOfClusters *int32 `json:"numberOfClusters,omitempty"`
}
- 指定需要选择的集群数量
- 仅适用于 PickN 类型
- 支持动态调整
2.3 集群亲和性
type Affinity struct {
// 集群亲和性规则
ClusterAffinity *ClusterAffinity `json:"clusterAffinity,omitempty"`
}
type ClusterAffinity struct {
// 必须满足的亲和性规则
RequiredDuringSchedulingIgnoredDuringExecution *ClusterSelector
// 优先满足的亲和性规则
PreferredDuringSchedulingIgnoredDuringExecution []PreferredClusterSelector
}
- 支持必须满足和优先满足的规则
- 基于标签选择器进行匹配
- 提供灵活的集群选择机制
3. 拓扑分布约束
type TopologySpreadConstraint struct {
// 最大偏差
MaxSkew *int32
// 拓扑键
TopologyKey string
// 不满足约束时的行为
WhenUnsatisfiable UnsatisfiableConstraintAction
}
- 控制资源在拓扑域中的分布
- 支持最大偏差限制
- 提供不满足约束时的处理策略
4. 容忍度策略
type Toleration struct {
// 污点键
Key string
// 操作符
Operator corev1.TolerationOperator
// 值
Value string
// 效果
Effect corev1.TaintEffect
}
- 支持集群污点容忍
- 提供灵活的匹配规则
- 影响资源调度决策
5. 应用策略
5.1 比较选项
type ComparisonOptionType string
const (
PartialComparison ComparisonOptionType = "PartialComparison" // 部分比较
FullComparison ComparisonOptionType = "FullComparison" // 完全比较
)
- 支持部分和完全比较
- 影响资源更新策略
- 优化性能开销
5.2 应用时机
type WhenToApplyType string
const (
Always WhenToApplyType = "Always" // 始终应用
IfNotDrifted WhenToApplyType = "IfNotDrifted" // 仅在未漂移时应用
)
- 控制资源应用时机
- 支持条件性应用
- 优化资源更新
5.3 应用类型
type ApplyStrategyType string
const (
ClientSideApply ApplyStrategyType = "ClientSideApply" // 客户端应用
ServerSideApply ApplyStrategyType = "ServerSideApply" // 服务端应用
ReportDiff ApplyStrategyType = "ReportDiff" // 仅报告差异
)
- 提供多种应用策略
- 支持不同的应用场景
- 优化资源管理
6. 回滚策略
type RolloutStrategy struct {
// 回滚类型
Type RolloutStrategyType
// 滚动更新配置
RollingUpdate *RollingUpdateConfig
// 应用策略
ApplyStrategy *ApplyStrategy
}
type RollingUpdateConfig struct {
// 最大不可用数量
MaxUnavailable *intstr.IntOrString
// 最大超出数量
MaxSurge *intstr.IntOrString
// 不可用等待时间
UnavailablePeriodSeconds *int
}
- 支持滚动更新
- 提供回滚机制
- 控制更新过程
7. 资源选择策略
type ClusterResourceSelector struct {
// API 组
Group string
// API 版本
Version string
// 资源类型
Kind string
// 资源名称
Name string
// 标签选择器
LabelSelector *metav1.LabelSelector
}
- 支持多种资源选择方式
- 提供灵活的匹配规则
- 优化资源管理
8. 状态监控策略
type ClusterResourcePlacementStatus struct {
// 选中的资源
SelectedResources []ResourceIdentifier
// 资源索引
ObservedResourceIndex string
// 放置状态
PlacementStatuses []ResourcePlacementStatus
// 条件
Conditions []metav1.Condition
}
- 提供详细的状态信息
- 支持状态监控
- 便于问题诊断
9. 漂移检测策略
type DriftedResourcePlacement struct {
// 资源标识
ResourceIdentifier
// 观察时间
ObservationTime metav1.Time
// 目标集群观察到的生成版本
TargetClusterObservedGeneration int64
// 首次漂移观察时间
FirstDriftedObservedTime metav1.Time
// 观察到的漂移
ObservedDrifts []PatchDetail
}
- 支持漂移检测
- 提供漂移详情
- 便于问题追踪
10. 最佳实践
10.1 放置策略选择
- 简单部署:使用 PickFixed
- 动态选择:使用 PickN + 亲和性
- 全量部署:使用 PickAll
10.2 应用策略选择
- 标准部署:使用 ClientSideApply
- 复杂场景:使用 ServerSideApply
- 监控场景:使用 ReportDiff
10.3 回滚策略配置
- 设置合适的 MaxUnavailable
- 配置适当的等待时间
- 考虑服务可用性
10.4 漂移检测
- 启用漂移检测
- 配置适当的比较选项
- 监控漂移状态
总结
ClusterResourcePlacement 提供了丰富的策略支持,能够满足各种复杂的集群部署需求。从简单的固定部署到复杂的动态选择和资源管理,都能通过合适的策略组合来实现。合理使用这些策略,可以构建出高效、可靠的集群部署方案。
2.4 WorkGenerator 控制器工作原理
概述
WorkGenerator 控制器是 Fleet 系统中资源分发和管理的核心组件,主要负责根据 ClusterResourceBinding 对象生成 Work 对象,实现资源的精确控制和灵活管理。
核心组件
type Reconciler struct {
client.Client
MaxConcurrentReconciles int
recorder record.EventRecorder
InformerManager informer.Manager
}
- Client: Kubernetes API 客户端,用于与 Kubernetes API 交互
- MaxConcurrentReconciles: 控制并发调和的限制,防止系统过载
- recorder: 事件记录器,用于记录重要事件
- InformerManager: 资源缓存管理器,优化资源访问性能
工作流程
调和循环
- 获取绑定对象
- 获取 ClusterResourceBinding 对象
- 检查对象是否存在
- 处理删除状态
- 状态检查
- 检查绑定状态是否为 Bound 或 Unscheduled
- 验证目标集群是否存在
- 确保 Finalizer 存在
- 资源同步
- 获取所有相关的 Work 对象
- 同步 Work 对象
- 应用覆盖规则
- 状态更新
- 更新绑定对象状态
- 设置相关条件
- 处理错误情况
资源覆盖机制
- 覆盖类型
- ClusterResourceOverride: 集群级别的资源覆盖
- ResourceOverride: 命名空间级别的资源覆盖
- 覆盖规则
type OverrideRule struct { OverrideType OverrideType JSONPatchOverrides []JSONPatchOverride }
- 覆盖应用
- 支持 JSON Patch 操作
- 支持变量替换
- 支持删除操作
关键功能实现
Work 对象生成
func (r *Reconciler) syncAllWork(ctx context.Context, resourceBinding *fleetv1beta1.ClusterResourceBinding, existingWorks map[string]*fleetv1beta1.Work, cluster *clusterv1beta1.MemberCluster) (bool, bool, error)
主要步骤:
- 获取资源快照
- 应用覆盖规则
- 生成新的 Work 对象
- 更新现有 Work 对象
覆盖规则应用
func (r *Reconciler) applyOverrides(resource *placementv1beta1.ResourceContent, cluster *clusterv1beta1.MemberCluster, croMap map[placementv1beta1.ResourceIdentifier][]*placementv1alpha1.ClusterResourceOverrideSnapshot, roMap map[placementv1beta1.ResourceIdentifier][]*placementv1alpha1.ResourceOverrideSnapshot) (bool, error)
功能特点:
- 支持集群级别和资源级别的覆盖
- 处理资源冲突
- 应用 JSON Patch 操作
状态管理
条件状态
- ResourceBindingOverridden
- 表示资源覆盖是否成功应用
- ResourceBindingWorkSynchronized
- 表示 Work 对象是否同步完成
- ResourceBindingApplied
- 表示资源是否成功应用
- ResourceBindingDiffReported
- 表示资源差异是否已报告
状态更新
- 跟踪 Work 对象状态
- 更新绑定对象状态
- 处理错误情况
错误处理
错误类型
- 用户错误 (UserError)
- 由用户配置或操作导致的错误
- 通常不需要重试
- API 服务器错误 (APIServerError)
- 与 Kubernetes API 交互时的错误
- 可能需要重试
- 意外行为错误 (UnexpectedBehaviorError)
- 系统内部异常
- 需要记录和调查
错误恢复
- 实现重试机制
- 提供详细的错误报告
- 支持状态回滚
性能优化
并发控制
- 限制并发调和数量
- 防止系统过载
- 优化资源使用
- 使用工作队列
- 管理任务调度
- 控制处理速率
- 资源缓存管理
- 使用 Informer 缓存
- 减少 API 调用
资源管理
- 批量处理更新
- 减少 API 调用次数
- 提高处理效率
- 优化状态更新
- 减少不必要的更新
- 提高系统性能
最佳实践
使用建议
- 合理设置并发限制
- 根据系统资源调整
- 避免过度并发
- 谨慎使用覆盖规则
- 避免复杂的覆盖规则
- 保持规则简单明确
- 监控状态变化
- 及时发现问题
- 快速响应异常
注意事项
- 避免过度使用覆盖规则
- 规则越多,维护成本越高
- 可能影响系统性能
- 注意资源冲突处理
- 合理设置优先级
- 避免冲突升级
- 关注性能影响
- 监控系统负载
- 及时优化配置
总结
WorkGenerator 控制器通过 Work 对象实现了资源的精确控制和灵活管理,是 Fleet 系统中不可或缺的组件。它提供了丰富的功能,包括资源覆盖、状态管理、错误处理等,同时通过性能优化确保了系统的稳定性和效率。合理使用和配置该控制器,可以构建出高效、可靠的集群部署方案。