Azure Fleet 功能分析之1

2025/03/24 k8s multi-cluster 共 10469 字,约 30 分钟

目录

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 各个模块之间的协作关系:

  1. 核心控制层
  • 集群管理模块
    • membercluster 控制器:负责成员集群的生命周期管理
    • internalmembercluster 控制器:处理内部成员集群状态
    • memberclusterplacement 控制器:处理集群放置策略
    • clusterinventory 控制器:维护集群资源清单
  • 资源编排模块
    • clusterresourceplacement 控制器:负责资源放置决策
    • workgenerator 控制器:生成具体的工作负载
    • workapplier 控制器:应用工作负载到目标集群
    • workv1alpha1 控制器:处理工作负载版本兼容性
  1. 调度层
  • scheduler 模块:负责资源调度决策
  • propertyprovider 模块:提供集群属性信息
  • clusterschedulingpolicysnapshot 控制器:维护调度策略快照
  1. 监控和变更追踪
  • resourcewatcher 模块:监控资源变化
  • clusterresourceplacementwatcher 控制器:监控资源放置变化
  • clusterresourcebindingwatcher 控制器:监控资源绑定状态
  • metrics 模块:收集和暴露指标
  1. 安全层
  • webhook 模块:处理准入控制
  • authtoken 模块:处理认证令牌

模块间协作流程

  1. 集群加入流程
用户请求 -> webhook验证 -> membercluster控制器 -> internalmembercluster控制器
-> clusterinventory更新 -> 集群状态同步
  1. 资源部署流程
用户创建资源 -> clusterresourceplacement控制器 -> scheduler决策
-> workgenerator生成工作负载 -> workapplier应用负载 -> resourcewatcher监控状态
  1. 调度决策流程
propertyprovider提供集群属性 -> clusterschedulingpolicysnapshot更新
-> scheduler进行调度决策 -> memberclusterplacement执行放置
  1. 状态同步流程
resourcewatcher监控变化 -> clusterresourcebindingwatcher更新绑定
-> metrics收集指标 -> 状态反馈给用户

关键交互点

  1. 控制器协调:
    • 各个控制器通过 Kubernetes 的 informer 机制监听资源变化
    • 控制器之间通过自定义资源(CR)进行状态传递
    • 使用 finalizer 确保资源清理的完整性
  2. 调度决策:
    • propertyprovider 提供集群属性信息
    • scheduler 基于属性和策略进行调度决策
    • memberclusterplacement 执行具体的放置操作
  3. 工作负载管理:
    • workgenerator 生成具体的工作负载
    • workapplier 负责将工作负载应用到目标集群
    • resourcewatcher 监控工作负载状态
  4. 状态同步:
    • 各个 watcher 持续监控资源状态
    • metrics 模块收集性能指标
    • 状态变化通过 CR 更新反馈

数据流向

  1. 配置数据流:
用户配置 -> webhook验证 -> 控制器处理 -> 资源创建/更新
  1. 状态数据流:
    集群状态 -> watcher监控 -> 控制器处理 -> 状态更新
    
  2. 指标数据流:
系统运行 -> metrics收集 -> 指标暴露 -> 监控系统

这种模块化的设计使得系统具有良好的可扩展性和可维护性,每个模块都有明确的职责,通过标准的 Kubernetes 机制进行协作。同时,模块间的松耦合设计也使得系统更容易进行功能扩展和问题定位。

2.1 membercluster 控制器 与 internalmembercluster 控制器

  1. 职责定位不同

MemberCluster 控制器:

  • 运行在 Hub 集群(中心集群)上
  • 负责处理用户创建的 MemberCluster 资源
  • 主要职责:
    • 管理成员集群的加入/离开流程
    • 创建和管理必要的 RBAC 资源
    • 创建和管理命名空间
    • 创建和管理 InternalMemberCluster 资源
    • 处理成员集群的生命周期事件

InternalMemberCluster 控制器:

  • 运行在成员集群上
  • 负责处理成员集群内部的协调工作
  • 主要职责:
    • 管理成员集群的健康状态
    • 收集和报告集群属性
    • 管理成员集群上的代理(agents)
    • 维护心跳信息
    • 处理资源统计信息
  1. 功能特点不同

MemberCluster 控制器:

  • 提供集群加入/离开的完整流程
  • 管理集群级别的权限和访问控制
  • 处理集群级别的资源清理
  • 维护集群加入状态
  • 提供集群级别的条件(conditions)管理

InternalMemberCluster 控制器:

  • 提供集群属性收集机制
  • 管理集群健康检查
  • 处理集群资源统计
  • 维护代理状态
  • 提供集群心跳机制
  1. 交互对象不同

MemberCluster 控制器:

  • 与 Kubernetes API 服务器交互
  • 创建和管理 RBAC 资源
  • 创建和管理命名空间
  • 管理 InternalMemberCluster 资源

InternalMemberCluster 控制器:

  • 与成员集群的 API 服务器交互
  • 与属性提供者(PropertyProvider)交互
  • 与成员集群上的代理交互
  • 管理集群资源统计
  1. 状态管理不同

MemberCluster 控制器:

  • 管理集群加入状态(ReadyToJoin, Joined, Left 等)
  • 处理集群级别的条件
  • 管理集群级别的资源状态

InternalMemberCluster 控制器:

  • 管理集群健康状态
  • 管理集群属性状态
  • 管理代理状态
  • 维护心跳状态
  1. 资源管理不同

MemberCluster 控制器:

  • 管理集群级别的资源(命名空间、RBAC 等)
  • 处理集群资源的创建和清理
  • 管理集群级别的权限

InternalMemberCluster 控制器:

  • 收集和报告集群资源统计
  • 管理集群内部代理资源
  • 处理集群属性资源
  1. 工作流程不同

MemberCluster 控制器:

用户创建 MemberCluster -> 创建命名空间和 RBAC -> 创建 InternalMemberCluster
-> 管理集群加入状态 -> 处理集群生命周期事件

InternalMemberCluster 控制器:

启动代理 -> 收集集群属性 -> 更新健康状态 -> 维护心跳
-> 报告资源统计 -> 管理代理状态

总结 这两个控制器是 KubeFleet 中集群管理的两个关键组件,它们协同工作但职责不同:

  • MemberCluster 控制器负责集群级别的管理和协调
  • InternalMemberCluster 控制器负责成员集群内部的运行状态管理

它们通过 Kubernetes 的 API 和自定义资源进行交互,共同确保集群管理的完整性和可靠性。这种设计使得集群管理更加模块化和可维护,同时也提供了更好的扩展性。

2.2 ClusterInventory 控制器

ClusterInventory 控制器主要负责:

  • 为每个 MemberCluster 创建和管理对应的 ClusterProfile
  • 同步集群状态和健康信息
  • 处理集群配置文件的清理工作

工作流程:

  1. 获取 MemberCluster
    • 检索 MemberCluster 对象
    • 处理对象不存在的情况
  2. 处理删除操作
    • 检查是否标记为删除
    • 清理相关的 ClusterProfile
    • 移除清理 finalizer
  3. 管理 Finalizer
    • 检查并添加清理 finalizer
    • 确保资源正确清理
  4. 创建/更新 ClusterProfile
    • 创建或更新对应的 ClusterProfile
    • 设置必要的标签和显示名称
    • 同步集群状态

状态同步:

func (r *Reconciler) syncClusterProfileCondition(mc *clusterv1beta1.MemberCluster, cp *clusterinventory.ClusterProfile)

状态同步逻辑:

  1. 健康状态检查
    • 检查成员代理状态
    • 验证心跳信息
    • 评估 API 服务器健康状态
  2. 状态条件设置
    • 设置控制平面健康状态
    • 更新观察到的生成版本
    • 提供详细的状态消息

状态同步条件

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:
    // 处理健康状态的情况
}

使用场景

  1. 集群健康监控
    • 监控集群 API 服务器状态
    • 跟踪心跳信息
    • 评估集群健康状态
  2. 集群配置管理
    • 维护集群配置文件
    • 同步集群状态
    • 管理集群元数据
  3. 资源生命周期管理
    • 处理集群加入/离开
    • 管理资源清理
    • 维护资源状态

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: 资源缓存管理器,优化资源访问性能

工作流程

调和循环
  1. 获取绑定对象
    • 获取 ClusterResourceBinding 对象
    • 检查对象是否存在
    • 处理删除状态
  2. 状态检查
    • 检查绑定状态是否为 Bound 或 Unscheduled
    • 验证目标集群是否存在
    • 确保 Finalizer 存在
  3. 资源同步
    • 获取所有相关的 Work 对象
    • 同步 Work 对象
    • 应用覆盖规则
  4. 状态更新
    • 更新绑定对象状态
    • 设置相关条件
    • 处理错误情况
资源覆盖机制
  1. 覆盖类型
    • ClusterResourceOverride: 集群级别的资源覆盖
    • ResourceOverride: 命名空间级别的资源覆盖
  2. 覆盖规则
    type OverrideRule struct {
        OverrideType      OverrideType
        JSONPatchOverrides []JSONPatchOverride
    }
    
  3. 覆盖应用
    • 支持 JSON Patch 操作
    • 支持变量替换
    • 支持删除操作

关键功能实现

Work 对象生成
func (r *Reconciler) syncAllWork(ctx context.Context, resourceBinding *fleetv1beta1.ClusterResourceBinding, existingWorks map[string]*fleetv1beta1.Work, cluster *clusterv1beta1.MemberCluster) (bool, bool, error)

主要步骤:

  1. 获取资源快照
  2. 应用覆盖规则
  3. 生成新的 Work 对象
  4. 更新现有 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 操作

状态管理

条件状态
  1. ResourceBindingOverridden
    • 表示资源覆盖是否成功应用
  2. ResourceBindingWorkSynchronized
    • 表示 Work 对象是否同步完成
  3. ResourceBindingApplied
    • 表示资源是否成功应用
  4. ResourceBindingDiffReported
    • 表示资源差异是否已报告
状态更新
  • 跟踪 Work 对象状态
  • 更新绑定对象状态
  • 处理错误情况

错误处理

错误类型
  1. 用户错误 (UserError)
    • 由用户配置或操作导致的错误
    • 通常不需要重试
  2. API 服务器错误 (APIServerError)
    • 与 Kubernetes API 交互时的错误
    • 可能需要重试
  3. 意外行为错误 (UnexpectedBehaviorError)
    • 系统内部异常
    • 需要记录和调查
错误恢复
  • 实现重试机制
  • 提供详细的错误报告
  • 支持状态回滚

性能优化

并发控制
  1. 限制并发调和数量
    • 防止系统过载
    • 优化资源使用
  2. 使用工作队列
    • 管理任务调度
    • 控制处理速率
  3. 资源缓存管理
    • 使用 Informer 缓存
    • 减少 API 调用
资源管理
  1. 批量处理更新
    • 减少 API 调用次数
    • 提高处理效率
  2. 优化状态更新
    • 减少不必要的更新
    • 提高系统性能

最佳实践

使用建议
  1. 合理设置并发限制
    • 根据系统资源调整
    • 避免过度并发
  2. 谨慎使用覆盖规则
    • 避免复杂的覆盖规则
    • 保持规则简单明确
  3. 监控状态变化
    • 及时发现问题
    • 快速响应异常
注意事项
  1. 避免过度使用覆盖规则
    • 规则越多,维护成本越高
    • 可能影响系统性能
  2. 注意资源冲突处理
    • 合理设置优先级
    • 避免冲突升级
  3. 关注性能影响
    • 监控系统负载
    • 及时优化配置

总结

WorkGenerator 控制器通过 Work 对象实现了资源的精确控制和灵活管理,是 Fleet 系统中不可或缺的组件。它提供了丰富的功能,包括资源覆盖、状态管理、错误处理等,同时通过性能优化确保了系统的稳定性和效率。合理使用和配置该控制器,可以构建出高效、可靠的集群部署方案。

Search

    Table of Contents