假设你是一家连锁咖啡集团“星河咖啡”的运营总监。一开始只有一家店,咖啡师和顾客都在同一个屋檐下,管理轻松。随着业务扩张,你在上海、北京、深圳、新加坡都开了分店——每间分店都有自己的厨房、咖啡机、原料仓库,自成一套管理体系。麻烦随之而来:怎么统一上架新品?怎么知道每家店还剩多少咖啡豆?某家店突然断电停业,怎么把排队顾客引导到邻店?这就是“多集群管理”要解决的问题。在 Kubernetes(K8s)世界里,每个数据中心或云区域就像一家分店(成员集群),总部有一个运营中心(联邦控制面),负责统一菜单(应用模板)、调度物料(资源分发),并在分店出故障时切换客流(故障转移)。这套被称为“集群联邦”的架构,让企业能同时管理几十个 K8s 集群,像经营连锁集团一样从容。

岗位关联

掌握多集群管理与联邦,意味着你具备跨地域、跨云平台部署 AI 基础设施的能力,这是云原生架构师与平台工程团队的核心竞争力。

目录
  1. 可视化演示
  2. 多集群架构
  3. 注册与接入
  4. 统一管理
  5. 应用分发
  6. 联邦调度
  7. 故障切换
  8. 运维实践
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态展示Kubernetes多集群Hub-Spoke联邦架构、跨区域AI推理调度、故障切换机制与Volcano GPU原生调度四种核心场景。

本节配有交互动效(进入视口后自动加载,约 3KB)。

多集群架构

星河咖啡最初只有一家店,所有设备、人员、原料都在同一个屋檐下,店长一个人就能管好。可当分店遍布五城后,单店模式显然行不通了:每家店要独立采购、独立排班,总部却无法实时掌握全局。于是公司决定设一个总部运营中心,各分店保持独立经营,但重要决策由总部统一协调。这个“总部 + 分店”的组织方式,就是多集群管理最核心的架构直觉。

在 Kubernetes 世界里,这种架构被称为 Hub-Spoke 模型:Hub 是联邦控制面(Federation Control Plane),负责统一协调;Spoke 是各成员集群,依然运行自己的 kube-apiserver、调度器和节点管理。最常见的开源实现是 KubeFed,它让用户在 Hub 上声明“希望某个应用部署到什么范围”,然后由联邦控制面把意图同步到各成员集群。注意,联邦并没有把多个集群合并成一个超大的集群,Pod 依然运行在某个具体集群内,跨集群的“合并”只发生在控制面和策略层。

为什么企业需要这种架构?第一,降低爆炸半径:一个集群出问题不至于拖垮全部业务,就像一家分店停电不影响其他城市;第二,合规与数据本地化:AI 训练数据可能要求不出境,所以必须把任务调度到指定区域的集群;第三,贴近用户降低延迟:推理服务部署到离用户最近的云区域。第四,混合云与多云容灾:同时使用多家云厂商,避免单一供应商依赖。

从资源视角看,联邦把分散的集群容量统一纳管。假设有 N 个成员集群,第 i 个集群的可用容量为 $C_i$,那么联邦整体的资源池容量可以表示为:

回到咖啡店的比喻:总部的价值不在于取代任何一家分店,而在于能告诉大家“我们现在总共有多少座位、哪家店最空”。多集群架构正是这样一层“统一视野”的抽象,让企业在多个 K8s 集群之上,依然保有全局运营的能力。

Ctotal=∑i=1NCi\displaystyle C_{\text{total}} = \sum_{i=1}^{N} C_i
这个公式说明“总部的资源眼界”是所有分店资源之和,而不是某一个分店的容量。
  1. 总容量符号$C_{\text{total}}$ 表示联邦统一视角下的资源总容量,对应所有分店座位数加总。
    CtotalC_{\text{total}}
  2. 求和符号$\sum_{i=1}^{N}$ 表示从第 1 个成员集群一直加到第 N 个成员集群,逐个累加。
    ∑i=1N\sum_{i=1}^{N}
  3. 单集群容量$C_i$ 是第 i 个成员集群的容量,对应一家分店的厨房和座位资源。
    CiC_i

注册与接入

新开一家分店时,总部不会直接默认它可以营业,而是要经过签约、装修、接入总部系统的流程:分店提交资质,总部派区域经理验收,验收通过后分店才能出现在总部看板上。这个“加盟流程”对应 Kubernetes 多集群中的注册与接入环节。

在 KubeFed 中,加入联邦的成员集群需要完成集群注册(Cluster Registration)。管理员把成员集群的 kubeconfig 或 API endpoint 提供给联邦控制面,联邦控制面通过 TLS 证书进行双向认证:一方面验证成员集群的身份,另一方面也让成员集群信任 Hub 的下发指令。注册成功后,成员集群会持续上报心跳(Heartbeat),联邦控制面据此维护集群状态:Ready、NotReady、Offline。

注册与心跳的核心在于“可信”二字。就像总部不会让一家没有食品经营许可证的店挂上品牌招牌一样,联邦控制面也不会向一个未经认证的集群下发任何工作负载。证书管理由此成为安全基石:证书过期、签发者不被信任、API endpoint 被伪造,都会导致集群被标记为异常。

形式上,一个成员集群 c 的状态是否可用,可以用如下判定函数描述:

每一家分店只有完成签约和验厂,才能成为官方门店。同样,每个 K8s 集群只有通过注册、证书校验、心跳确认三关,才能进入联邦的资源池,这为后续的统一管理打下了信任基础。

S(c)=1[auth(c)∧heartbeat(c)]\displaystyle S(c) = \mathbf{1}\bigl[\text{auth}(c) \land \text{heartbeat}(c)\bigr]
这个公式表示:只有身份认证通过且心跳正常,成员集群状态才为 1(可用);任一条件不满足则为 0(不可用)。
  1. 状态标记$S(c)$ 是集群 c 的可用状态,1 表示 Ready,0 表示异常。
    S(c)S(c)
  2. 指示函数$\mathbf{1}[\,\cdot\,]$ 是条件指示符,括号内条件为真时取 1,为假时取 0。
    1[⋅]\mathbf{1}[\cdot]
  3. 认证条件$\text{auth}(c)$ 表示证书与身份校验是否通过,对应加盟资质审核。
    auth(c)\text{auth}(c)
  4. 心跳条件$\text{heartbeat}(c)$ 表示心跳上报是否正常,对应分店每晚向总部报备营业状态。
    heartbeat(c)\text{heartbeat}(c)

统一管理

分店接入总部系统后,店长依然管理日常运营,但门店的菜单、价格、营业时间可以由总部统一制定。星河咖啡每周四通过运营系统把新品菜单推送到所有分店的收银机上,同时限定每家店当周的原料采购上限。这就是统一管理的两大动作:统一下发策略、统一分配配额。

在 Kubernetes 联邦中,统一管理的载体是联邦 API 资源。KubeFed 提供 FederatedDeployment、FederatedConfigMap、FederatedSecret 等类型,让用户可以用一份“联邦清单”描述跨集群的应用。管理员通过 Propagation Policy(分发策略)声明:这份清单要下发到哪些成员集群、采用什么同步方式。资源配额(ResourceQuota)也可以在联邦层统一设置,避免某个集群被过量任务挤爆。

统一管理的重要收益是消除配置漂移。如果没有联邦,运维人员需要 SSH 登录每个集群逐个执行 kubectl apply,很容易出现“上海改了 3 副本、北京忘了改”的混乱。而策略下发是一条单向管道:总部声明期望状态,联邦控制器不断“调和”各集群,让它们向期望状态收敛。这就像总部在系统里设置好菜单,任何分店都不能擅自改价,即使有人误操作,下次同步也会自动纠正。

配额分配可以按照集群容量比例来设计。假设联邦总配额为 $Q_{\text{total}}$,集群 i 的容量为 $C_i$,则该集群获得的配额为:

统一管理不是夺走分店的自主权,而是给全集团划定一条清晰的经营基线。联邦 API 负责表达“想要什么”,配额负责限制“能用多少”,两者结合让跨集群运维从手工救火变成体系化运营。

Qi=CiCtotal×Qtotal\displaystyle Q_i = \frac{C_i}{C_{\text{total}}} \times Q_{\text{total}}
这个公式表明:大店分到的原料配额天然比小店多,但总量始终不超出联邦整体预算。
  1. 集群配额$Q_i$ 表示分配给第 i 个成员集群的资源配额上限。
    QiQ_i
  2. 容量占比$\dfrac{C_i}{C_{\text{total}}}$ 是第 i 个集群容量占总容量的比例,对应分店座位占全集团的比例。
    CiCtotal\frac{C_i}{C_{\text{total}}}
  3. 总额调节$\times Q_{\text{total}}$ 用联邦总配额做缩放,确保所有集群配额之和不超过总额。
    ×Qtotal\times Q_{\text{total}}

应用分发

每当星河咖啡推出季节限定新品,总部先定义一份标准菜单:拿铁、美式、冷萃的配方和杯量完全一致。然后通过运营系统推送到所有分店。不过,新加坡分店会做本地化微调,比如增加椰糖选项;北京分店则减少糖浆库存。这份“标准菜单 + 本地微调”的组合,正是联邦应用分发的精髓。

在 KubeFed 中,用户先编写一份 FederatedDeployment 作为基础模板,这相当于总部标准菜单。随后用 Propagation Policy 控制分发范围:告诉联邦控制面这份模板应派发给哪些集群。最后用 Override Policy 定义每个集群的差异化覆盖:比如在北京集群覆盖镜像地址为 registry-be.example.com,在新加坡集群把副本数从 3 改成 5。联邦控制面会先把基础模板下发到目标集群,再应用对应的覆盖规则,最终生成各集群实际的 Deployment。

这套机制最有价值的地方在于“一处定义、多处生效、差异可控”。AI 基础设施团队经常需要把同一个模型推理服务部署到不同云厂商,但各家云的镜像仓库地址、节点亲和性标签、GPU 驱动版本可能都不一样。如果没有 Override,就得维护多份 YAML;有了 Override,只需维护一份基础模板 + 若干差异补丁。

从数据角度看,某个集群 c 最终生效的应用配置,可以理解为基础模板与覆盖规则的合并:

分发是“求同”,覆盖是“存异”。在 AI 全球化部署中,应用分发让团队既能保持标准化的服务形态,又能适配不同云环境与合规要求,这正是联邦管理比“手工逐集群部署”高效的原因。

Deff(c)=Dbase⊕override(c)\displaystyle D_{\text{eff}}(c) = D_{\text{base}} \oplus \text{override}(c)
这里的 $\oplus$ 表示“先按基础模板部署,再用集群专属覆盖规则修正”,就像标准菜单端上桌前要按本地口味加料。
  1. 生效配置$D_{\text{eff}}(c)$ 表示集群 c 中实际生效的应用部署配置。
    Deff(c)D_{\text{eff}}(c)
  2. 基础模板$D_{\text{base}}$ 是联邦层定义的标准 Deployment 模板,对应总部标准菜单。
    DbaseD_{\text{base}}
  3. 合并运算符$\oplus$ 表示“基础优先、覆盖修正”的合并规则。
    ⊕\oplus
  4. 覆盖规则$\text{override}(c)$ 是集群 c 的专属差异补丁,对应本地口味微调。
    override(c)\text{override}(c)

联邦调度

新品上市后,总部运营中心还要决定第一批限量原料先发给哪家分店试点。选择标准很直观:哪家店当前最空闲、离目标客群最近、历史事故率最低,就优先给它。这个“选店”的过程,在 Kubernetes 多集群里由联邦调度器完成。

需要特别注意,联邦调度器与集群内的 kube-scheduler 职责不同:kube-scheduler 负责在单个集群内为 Pod 选择节点,而联邦调度器负责在多个成员集群之间选择“把工作负载放到哪个集群”。在 KubeFed 场景中,常用 ReplicaSchedulingPreference 来声明副本分布策略,例如“总副本数 10,集群 A 占 60%、集群 B 占 40%”;在 Karmada、Open Cluster Management 等项目中,则有更灵活的调度器组件。

联邦调度通常采用多指标加权评分:CPU 空闲率、内存空闲率、GPU 可用卡数、集群可用性、数据所在地等。每个指标先做归一化,再乘以权重求和,得分最高的集群获得新任务。权重体现业务偏好:训练任务更看重 GPU,推理任务更看重延迟,容灾备份则更看重集群间距离。

假设有 m 个评价指标,集群 c 在第 j 个指标上的归一化得分为 $m_j(c)$,对应权重为 $w_j$,则综合评分可以写成:

联邦调度的本质,是把“把任务发给哪家分店”从拍脑袋变成可计算的打分题。权重调得好,AI 训练任务就能自动流向资源最充足、成本最低、最合规的集群,让整个多集群资源池真正活起来。

score(c)=∑j=1mwj×mj(c)\displaystyle \text{score}(c) = \sum_{j=1}^{m} w_j \times m_j(c)
这个公式像极了总部选试点门店的评分表:空闲度、客流、事故率各占不同权重,加权得分最高者胜出。
  1. 综合评分$\text{score}(c)$ 是成员集群 c 的联邦调度综合得分。
    score(c)\text{score}(c)
  2. 遍历指标$\sum_{j=1}^{m}$ 表示对所有 m 个评价指标逐个求和。
    ∑j=1m\sum_{j=1}^{m}
  3. 指标权重$w_j$ 是第 j 个指标的权重,代表这项指标在决策中的重要性。
    wjw_j
  4. 归一化得分$m_j(c)$ 是集群 c 在第 j 个指标上的归一化分数,取值通常在 0 到 1 之间。
    mj(c)m_j(c)

故障切换

设想一个周五晚高峰,新加坡分店突然停电,排队顾客面临无处消费。总部运营中心迅速启动应急方案:先在系统里标记该店“暂停营业”,然后把新加坡顾客的订单自动引导到最近的马来西亚分店,同时调拨原料和咖啡师支援。顾客几乎无感知——他们只是在 App 上看到了新的取餐门店。

Kubernetes 多集群的故障切换(Failover)与此惊人相似:联邦控制面通过心跳超时检测到某个成员集群 NotReady 后,并不会立即把流量切走,而是先做二次确认,避免一次网络抖动就误判。确认故障后,控制器会在健康集群中重建工作负载(实例迁移),再通过负载均衡或 DNS 更新把流量切换过去(流量切换)。

这里存在一个关键认知:故障切换不是瞬时的。心跳超时需要时间(默认可能数十秒),二次确认需要时间,在健康集群拉起 Pod 也需要时间。对 AI 推理服务而言,切换期间可能伴随少量请求失败,因此生产环境通常还会部署多个副本,由客户端做重试。对 AI 训练任务而言,断点续训和模型 checkpoint 同步是切换的前提——没有保存的状态,切到任何集群都要从头再来。

多集群容灾的收益可以用可用性公式表达。假设各集群故障相互独立,单集群可用性为 $a_i$,联邦层只要保证至少一个集群存活,整体可用性为:

故障切换不是魔法,而是一套“检测—迁移—切换”的标准化流程。它不会消除故障本身,但能让故障的感知半径从“全公司停摆”缩小到“一个门店临时打烊”,这正是多集群架构给 AI 基础设施带来的韧性。

Amulti=1−∏i=1k(1−ai)\displaystyle A_{\text{multi}} = 1 - \prod_{i=1}^{k}(1 - a_i)
这个公式揭示容灾的威力:即使每个集群只有 95% 可用性,两个独立集群组合后可用性也能提升到 99.75%,就像两家分店互为备份,一家停电另一家也能接住客流。
  1. 整体可用性$A_{\text{multi}}$ 表示联邦整体的服务可用概率。
    AmultiA_{\text{multi}}
  2. 故障概率乘积$\prod_{i=1}^{k}(1 - a_i)$ 表示所有集群同时故障的概率,因为独立事件同时发生的概率是各自概率相乘。
    ∏i=1k(1−ai)\prod_{i=1}^{k}(1 - a_i)
  3. 反向取补$1 - \prod(\cdots)$ 表示至少一个集群正常工作的概率。
    1−∏i=1k(1−ai)1 - \prod_{i=1}^{k}(1 - a_i)

运维实践

经营连锁咖啡集团,总部不可能每天飞到每家分店检查卫生,而是靠一套数字化巡检系统:实时看板、成本报表、升级排期。Kubernetes 多集群运维同样如此,管理几十个集群靠的不是 SSH 登录,而是三层运维实践:监控聚合、成本管理、升级策略。

监控聚合是多集群运维的起点。每个成员集群内部可以部署 Prometheus,但联邦层需要一套统一监控体系:用 Thanos 或 Prometheus Federation 把各集群指标汇总到中心,再通过 Grafana 展示全局视图。日志也类似,可以用集中式日志平台统一采集各集群的日志。这样,AI 基础设施团队在一个屏幕上就能看到所有区域的 GPU 使用率、Pod 状态和告警。

成本管理是多集群落地时最容易忽略的一环。不同云厂商的 GPU 实例价格差异巨大,联邦调度虽然能分发任务,但如果缺乏成本数据,就可能把任务发给最贵的集群。常见做法是接入成本监控工具,给每个集群打上成本标签,在联邦调度评分中引入“成本”指标,让调度器在性能与价格之间取平衡。升级策略则讲究“滚动而不冒进”:先升级一个非核心集群,验证新版本稳定后再逐步推进到其他集群,避免一次性升级所有集群导致全网故障。

运维投入与收益之间也可以量化。设多集群方案带来的成本节省为 $S$,新增运维成本为 $O$,则净收益比可以表示为:

运维实践是连锁集团的“基本功”:看板让问题无处遁形,成本让调度有据可依,升级让变更平滑可控。把这三件事做好,多集群不是负担,而是 AI 基础设施真正走向全球化运营的底座。

ROI=S−OO\displaystyle \text{ROI} = \frac{S - O}{O}
这个公式提醒我们:多集群不是越贵越好,只有当节省的成本明显大于额外运维开销时,联邦架构才算物有所值。
  1. 投资回报率$\text{ROI}$ 表示多集群运维的投入产出比。
    ROI\text{ROI}
  2. 收益与成本$S$ 是节省的资源和故障损失,$O$ 是新增的监控、网络、人力成本。
    S−OS - O
  3. 归一化处理除以 $O$ 表示每投入一单位运维成本能换回多少净收益。
    S−OO\frac{S - O}{O}

AI 应用场景

跨地域 AI 训练任务调度

阶段:模型训练与资源调度

解决的问题:自动驾驶公司在美国、欧洲、中国都有数据,受数据出境合规限制,训练数据不能集中到单一地区。传统做法是每个地区各建一套训练平台,导致算力无法互相调剂、GPU 利用率低。联邦调度可以统一管理三个区域的 K8s 集群,让每个区域的数据在自己的集群内训练,同时由总部统一分配算力资源,闲时把可共享的模型聚合任务派给最空闲的区域集群。

具体案例:某自动驾驶公司在法兰克福、弗吉尼亚、上海各有一个 GPU 集群,用 KubeFed 注册三个集群后,联邦调度器根据 GPU 空闲率和数据本地性把数据预处理任务分发到对应区域,训练完成后把模型 checkpoint 同步回中心,训练效率提升约 35%。

AI 推理服务多集群容灾

阶段:模型部署与在线推理

解决的问题:在线推荐系统对延迟和可用性要求极高,单集群故障会导致大规模服务不可用。采用联邦管理后,同一推理服务部署在两个云厂商的集群,通过 Override Policy 适配各自镜像仓库,通过联邦故障切换机制保障单集群故障时流量自动切走。

具体案例:某电商推荐系统在阿里云和 AWS 各部署一套推理服务,日常流量按比例分发。当阿里云某可用区发生故障时,联邦控制器在 90 秒内将故障集群标记为 NotReady,并把流量切换到 AWS 集群,同时自动补齐副本,整个切换过程用户无感知。

混合云 AI 基础设施统一管理

阶段:基础设施编排

解决的问题:企业自建机房有固定 GPU 集群,但大模型训练突发时算力不足。传统方案需要人工在公有云创建集群、手动部署环境,效率低且容易出错。联邦管理将自建集群和公有云集群统一注册纳管,调度器在私有云资源不足时自动把任务分发到公有云弹性集群。

具体案例:某大模型创业公司在自建机房部署了 64 卡 A100 集群,同时开通了公有云按需 GPU 集群。通过联邦调度策略,日常训练优先使用自建集群,峰值任务自动溢出到公有云,任务结束时释放云资源,整体训练成本降低约 40%。

Python 演示

python53 行
import random  class Cluster:    def __init__(self, name, cpu_capacity, cpu_used, mem_capacity, mem_used, availability):        self.name = name        self.cpu_capacity = cpu_capacity        self.cpu_used = cpu_used        self.mem_capacity = mem_capacity        self.mem_used = mem_used        self.availability = availability     def cpu_util(self):        return self.cpu_used / self.cpu_capacity     def mem_util(self):        return self.mem_used / self.mem_capacity     def score(self, w_cpu, w_mem, w_avail):        return (w_cpu * (1 - self.cpu_util()) +                w_mem * (1 - self.mem_util()) +                w_avail * self.availability)  class FederatedScheduler:    def __init__(self, clusters):        self.clusters = clusters     def choose_cluster(self, weights):        ranked = [(c, c.score(*weights)) for c in self.clusters]        ranked.sort(key=lambda item: item[1], reverse=True)        return ranked[0]     def failover_name(self, avoid_name):        alive = [c for c in self.clusters if c.name != avoid_name]        return alive[0].name if alive else None  def main():    clusters = [        Cluster("shanghai", 64, 50, 128, 90, 0.99),        Cluster("beijing", 64, 32, 128, 60, 0.98),        Cluster("singapore", 32, 24, 64, 50, 0.95),    ]    scheduler = FederatedScheduler(clusters)    best_cluster, best_score = scheduler.choose_cluster((0.5, 0.3, 0.2))    print("联邦调度结果:", best_cluster.name, "评分", round(best_score, 3))    backup = scheduler.failover_name(best_cluster.name)    print("故障切换目标:", backup)  if __name__ == "__main__":    main()
目的:用 Python 模拟一个简化版联邦调度器,对多个 K8s 集群进行资源评分选优,并演示故障切换时的备选集群选择。
  1. class Cluster每个成员集群的抽象,记录 CPU、内存容量/用量与可用性。
  2. def cpu_util(self)计算 CPU 利用率,作为调度评分的基础指标。
  3. def score(self, w_cpu, w_mem, w_avail)按权重加权计算集群综合得分。
  4. def choose_cluster(self, weights)遍历所有集群并排序,返回得分最高的集群。
  5. ranked.sort(key=lambda item: item[1], reverse=True)按得分从高到低排序。
  6. def failover_name(self, avoid_name)排除故障集群后返回存活集群作为故障切换目标。
  7. scheduler.choose_cluster((0.5, 0.3, 0.2))使用 CPU 权重 0.5、内存 0.3、可用性 0.2 做调度决策。

常见误区

误区我以为用了集群联邦之后,所有 K8s 集群会变成一个超大集群,Pod 可以在集群之间自由漂移,就像一台巨型计算机。

正解联邦并没有在基础设施层合并集群。每个成员集群依然独立运行,Pod 始终运行在某一个具体的集群内。联邦合并的只是“控制面”和“管理视图”:通过统一的 API 把应用下发到多个集群,而不是把多个集群的节点混成一个资源池。用咖啡店比喻来说,总部并没有把五家分店的厨房打通成一个中央厨房,只是统一了菜单和调度。

为何常见:过度关注“联邦”一词中的“联”字,容易误以为是资源层面的合并,而忽略了它本质是控制面的协调。

误区我觉得既然多集群能容灾、能扩展,那所有业务都应该拆成多个集群,越多越安全。

正解多集群带来容灾和区域化优势的同时,也引入了网络复杂度、配置漂移、监控割裂和额外成本。对一个小规模初创团队,维护一个集群可能远优于维护三个集群。决策应该基于业务需求:是否需要数据本地化?是否要跨云容灾?是否有足够的运维人力?就像咖啡店开分店能扩大市场,但也要承担房租和店长工资。

为何常见:容灾和高可用的宣传让很多人只看到收益,忽略了多集群是“用复杂度换可靠性”的工程权衡。

误区我以为 Kubernetes 里已经有 kube-scheduler 了,多集群的联邦调度就是它多管几个集群而已。

正解kube-scheduler 只在单个集群内为 Pod 选择节点,它看不到其他集群的资源。联邦调度器(如 KubeFed 的 ReplicaSchedulingPreference 或 Karmada 调度器)负责在成员集群之间选择“把工作负载放到哪个集群”,选定集群后,Pod 的节点选择仍然由该集群内的 kube-scheduler 完成。二者是两级调度关系,就像总部选择把新品发给哪家分店,分店店长再决定由哪位咖啡师制作。

为何常见:只了解单集群 K8s 调度,容易把“集群选择”和“节点选择”混为一谈。

误区我以为只要集群一故障,流量立刻就能切到另一个集群,用户不会有任何感知。

正解故障切换需要经历心跳超时判定、二次确认、健康集群重建工作负载、DNS/负载均衡更新等多个步骤,整个过程通常是秒级甚至分钟级。AI 推理服务在切换窗口内可能出现少量请求失败,AI 训练任务更需要依赖 checkpoint 断点续训。多集群能做的是缩短不可用时间,而不是把故障时间降为零。

为何常见:演示动画和架构图把切换画成一条线,容易让人忽略检测与重建的时间成本。

面试题

Q1. 多集群联邦最核心的目标是什么?

单选题 · easy

  • A.把多个集群合并成一个超大集群
  • B.统一管理分布各地的独立集群← 正确答案
  • C.用单集群替代所有节点
  • D.让 Pod 跨集群自由迁移

答案:B。联邦的核心是在控制面统一协调多个独立集群,而不是在基础设施层合并集群。Pod 依然运行在某个具体集群内,所以 A、C、D 都不准确。正如总部统一管理分店,但每家分店依然自己运营。

Q2. 在联邦系统中,描述“应用要下发到哪些集群”的 API 是什么?

单选题 · easy

  • A.OverridePolicy
  • B.PropagationPolicy← 正确答案
  • C.ResourceQuota
  • D.ClusterRole

答案:B。PropagationPolicy 决定联邦资源的分发范围,即“把模板派发给哪些成员集群”。OverridePolicy 负责差异化覆盖,ResourceQuota 负责配额,ClusterRole 是 RBAC 权限,与分发范围无关。

Q3. 多集群联邦架构中,以下哪些属于核心组件或模型?

多选题 · mid

  • A.联邦控制面← 正确答案
  • B.成员集群← 正确答案
  • C.镜像仓库
  • D.Hub-Spoke 模型← 正确答案

答案:ABD。联邦控制面是总协调者,成员集群是被管理的分店,Hub-Spoke 是常见架构模型;镜像仓库只是应用部署的依赖组件,并非联邦架构特有的核心部分。

Q4. 集群注册时,联邦控制面如何验证成员集群的身份?

单选题 · easy

  • A.通过 kubeconfig 与 TLS 证书← 正确答案
  • B.通过 SSH 密码
  • C.通过 DNS 记录
  • D.通过镜像仓库凭证

答案:A。成员集群接入联邦时提供 kubeconfig 和 API endpoint,联邦控制面通过 TLS 证书双向认证确认身份。SSH、DNS、镜像仓库凭证都不能用于控制面身份验证。

Q5. 联邦调度器与 kube-scheduler 的关系是什么?

单选题 · mid

  • A.联邦调度器替代了 kube-scheduler
  • B.两者职责相同,只是名字不同
  • C.联邦调度器选集群,kube-scheduler 选节点← 正确答案
  • D.kube-scheduler 管理联邦控制面

答案:C。这是两级调度:联邦调度器在多个成员集群之间选择目标集群,选定后由该集群内部的 kube-scheduler 为 Pod 选择节点。就像总部选分店,分店店长再选咖啡师。

Q6. 跨集群应用分发时,OverridePolicy 可以覆盖哪些内容?

多选题 · mid

  • A.镜像地址← 正确答案
  • B.副本数量← 正确答案
  • C.环境变量← 正确答案
  • D.节点内核版本

答案:ABC。OverridePolicy 用于对基础模板做集群差异化修正,镜像地址、副本数量、环境变量都是常见覆盖项。节点内核属于基础设施层配置,应用分发无法直接覆盖。

Q7. 联邦调度评分公式中,权重 w_j 的作用是什么?

单选题 · mid

  • A.表示第 j 个指标的重要程度← 正确答案
  • B.表示集群的带宽大小
  • C.表示 Pod 的副本数量
  • D.表示节点的 IP 地址

答案:A。权重决定各指标在综合评分中的影响力。比如训练任务给 GPU 空闲率更高权重,推理任务给延迟更高权重,调度结果会随权重偏向而改变。

Q8. 多集群故障切换的检测时间主要取决于什么?

单选题 · hard

  • A.心跳超时与二次确认耗时← 正确答案
  • B.网络带宽大小
  • C.镜像拉取速度
  • D.磁盘 IOPS

答案:A。故障切换的第一步是“确认故障真的发生了”,这需要心跳超时加上二次验证。网络带宽、镜像拉取、磁盘 IOPS 影响的是切换后的恢复速度,而不是检测时间本身。

Q9. 多集群故障切换流程通常包含哪些步骤?

多选题 · hard

  • A.心跳超时判定← 正确答案
  • B.在健康集群重建工作负载← 正确答案
  • C.流量切换与 DNS 更新← 正确答案
  • D.关闭所有成员集群

答案:ABC。完整流程是检测(心跳超时)、迁移(健康集群中重建 Pod/工作负载)、切换(流量和 DNS 指向新集群)。关闭所有集群是灾难性操作,不在故障切换流程内。

Q10. 联邦可用性公式 A=1-∏(1-a_i) 成立的前提条件是什么?

单选题 · extreme

  • A.各集群故障事件相互独立← 正确答案
  • B.各集群共享同一电源
  • C.所有集群故障强相关
  • D.单集群可用性必须为 0

答案:A。该公式基于独立事件概率相乘:只有当各集群的故障互不影响时,才能用“所有集群同时故障的概率 = 各自故障概率的乘积”来推导整体可用性。如果共享电源,故障强相关,公式不成立。