你是一家餐饮集团的创始人。第一家店开在市中心,店长、后厨、收银共处一室,指挥起来特别顺。后来生意红火,你在三座城市各开了一家分店。问题来了:每家分店都配一个店长?三家店长凑一起开调度会,规则五花八门,你累得焦头烂额。更糟的是,每家店的菜谱、服务标准、会员系统各搞一套,顾客换了城市就像进了另一家店。于是你决定换个思路——总店只设一个管理班子,分店只配服务员,所有决策从总部统一发令。这个“一个董事会、无数个一线员工”的架构,正是 Istio 多集群网格中 Primary-Remote 模式的灵魂:一个主集群(Primary)承载全部控制面,其他集群(Remote)只跑数据面。控制面集中、数据面分散、信任链统一、流量智能调度,让身处不同地域、不同云上的微服务,表现得像在同一个机房里一样默契。

岗位关联

掌握了 Primary-Remote 模式,你就掌握了 Istio 多集群网格的主流落地姿势。它能帮你为云原生团队设计“一套控制面管遍所有集群”的架构,是解决混合云统一治理与多区域容灾问题的核心技能,也是从单体集群迈向规模化集群治理的必经之路。

目录
  1. 可视化演示
  2. 模式概述
  3. 拓扑结构
  4. 证书信任链
  5. 流量分发
  6. 配置实践
  7. 适用场景
  8. 落地验证
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示Primary-Remote多集群网格:网络拓扑、证书信任链与流量分发策略,通过交互理解跨集群服务治理与多区域容灾。

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

多集群拓扑:双平面分离 Primary控制面 Remote数据面 Tp 跨集群统一治理

模式概述

你是一家餐饮集团的创始人。第一家店开在市中心,店长、后厨、收银共处一室,指挥起来特别顺。后来生意红火,你在三座城市各开了一家分店。问题来了:每家分店都配一个店长?三家店长凑一起开调度会,规则五花八门,你累得焦头烂额。更糟的是,每家店的菜谱、服务标准、会员系统各搞一套,顾客换了城市就像进了另一家店。于是你决定换个思路——总店只设一个管理班子,分店只配服务员,所有决策从总部统一发令。这就是 Primary-Remote 模式在现实生活中最早的雏形:集中决策,分散执行。

Istio 单集群网格就像“一家店”的运作:控制面组件 istiod 像店长一样负责所有规则决策,数据面 Envoy sidecar 则像服务员一样跟着每个业务容器处理请求。多集群网格要解决的是“跨店协作”问题——让三座城市的服务像在一家店里那样步调一致。Primary-Remote 模式的做法是:Primary 集群部署完整的 istiod 控制面,Remote 集群只运行数据面(Envoy sidecar),不装控制面。Remote 集群里的业务 Pod 通过网络,把配置请求和证书申请发回 Primary,由它统一决策、统一签发证书。

这种单控制面、多数据面的架构决定了网格的服务范围是所有集群的并集。用集合语言写出来:

与多 Primary 模式相比,Primary-Remote 只有一套控制面,运维成本低、配置一致性好;代价是高度依赖 Primary 的可用性与跨集群网络质量。就像你只保留总部的管理班子,三家分店共用一套规章、一本菜谱,顾客在任何一家都能点到同样水平的菜——这就是 Primary-Remote 用一套控制面“统治”所有集群的本质。

Smesh=Sprimary∪⋃i=1nSremote(i)S_{\text{mesh}} = S_{\text{primary}} \cup \bigcup_{i=1}^{n} S_{\text{remote}}^{(i)}
整个网格的服务名录 = Primary 集群自有服务 ∪ 所有 Remote 集群上报服务。任何集群注册过的服务,都能被其他集群发现与调用。
  1. 服务集合$S_{\text{mesh}}$ 代表整个网格中可被发现的全部服务,所有集群的服务都汇聚到这一份名录中。
    SmeshS_{\text{mesh}}
  2. 主集群服务$S_{\text{primary}}$ 是 Primary 集群内注册的服务,本地服务直接进入名录。
    SprimaryS_{\text{primary}}
  3. 远端服务并集$\bigcup_{i=1}^{n} S_{\text{remote}}^{(i)}$ 把所有 Remote 集群上报的服务逐一并入统一名录,这便是“联合服务发现”的数学本质。
    ⋃i=1nSremote(i)\bigcup_{i=1}^{n} S_{\text{remote}}^{(i)}

拓扑结构

把集团的组织结构图画出来:总部大楼里坐着董事会和人力资源部(控制面),各分店的员工散落在全城不同写字楼(数据面)。画面上有一条粗粗的专线从每座分店连回总部——这就是控制面与数据面之间的远程通道。地理上分离,逻辑上一个整体,这正是 Primary-Remote 网络拓扑最直观的样子。

Istio 在 Primary 集群内运行 istiod,由它承担服务发现、配置管理和证书签发三大职责。Remote 集群中不运行 istiod,但每个业务 Pod 都带一个 Envoy sidecar。sidecar 通过 Remote agent 机制,用 Kubernetes API 的 watch 能力连接 Primary 的 API Server,保持配置实时同步。二者在网络拓扑上形成“一个控制中心 + 多个数据平面”的星型结构——控制面只有一份,数据面却可以横向铺开,局部扩容无需触碰总部架构。

控制面与数据面的数量关系可以用非常简洁的式子表达:

通信通道上需要打通 Remote 到 Primary 的 15012(gRPC 配置下发)与 15017(webhook 校验)等端口。若两个集群之间需要互相访问业务流量,还要部署东西向网关(east-west gateway),负责接收来自其他集群的服务流量;南北向网关则对外暴露服务,像门店的大门迎接顾客。一张组织架构图画下去:总部一个房,底下无数工位,工位越加越多,总部不用换房——这就是 Primary-Remote 拓扑结构最大的红利。

CP=1,DP=∑i=1kNworkload(i)\text{CP} = 1, \quad \text{DP} = \sum_{i=1}^{k} N_{\text{workload}}^{(i)}
控制面(CP)的数量恒为 1,只存在于 Primary;数据面(DP)的数量等于所有集群的工作负载副本总和,想扩就扩。
  1. 控制面恒一$\text{CP} = 1$ 表示只有 Primary 集群部署 istiod,Remote 不设控制面,这是模式命名的由来。
    CP=1\text{CP} = 1
  2. 数据面求和$N_{\text{workload}}^{(i)}$ 是第 $i$ 个集群里的业务副本数量,对全部 $k$ 个集群求和就是整个网格的数据面规模。
    ∑i=1kNworkload(i)\sum_{i=1}^{k} N_{\text{workload}}^{(i)}

证书信任链

集团给每位员工发工牌:写着姓名、部门、岗位。但分店保安怎么知道这张工牌是真的?工牌上盖了两个章——集团总印鉴和区域钢印。保安验证时,先看区域钢印能否用“区域验章仪”通过,再看总印鉴是否由集团总章验过。印鉴链通到底,人才放行。这套“总印→钢印→工牌”的验证逻辑,就是 Istio 证书信任链的日常原型。

Istio 中,身份认证正是靠一条三级证书链。根证书(Root CA)由外部 CA 或自签机构创建,是整个网格的信任锚点;Primary 生成中间证书(Intermediate CA),由根证书签发;每个 sidecar 的工作负载证书则由中间证书签发。Primary-Remote 模式下,Primary 作为 CA 给所有集群签发证书,Remote 不需要单独 CA。跨集群通信时,双方 sidecar 在 TLS 握手阶段互相出示证书,并沿证书链向上验证,验证过程是一个链式验签:

信任域(trustDomain)就是网格的“集团品牌名”,通常配置为形如 mycompany.com 的字符串。证书的 SAN(主体备用名)中写入服务身份,格式为 spiffe://<trustDomain>/ns/<namespace>/sa/<serviceAccount>。只要 trustDomain 一致,Primary 和 Remote 就能互认。分店员工出差到总部,保安只看工牌印鉴链,一串到底就放行;Primary-Remote 的 sidecar 也一样——证书链同根,跨集群也能像同集群一样互信,甚至无需额外配置白名单。

valid(Cw)=verifySig(Cw,Ci)∧verifySig(Ci,Cr)\text{valid}(C_w) = \text{verifySig}(C_w, C_i) \land \text{verifySig}(C_i, C_r)
工作负载证书可信 = 中间证书能验证工作负载证书的签名 ∧ 根证书能验证中间证书的签名。两层验签全部通过,身份才算可信。
  1. 工作负载证书$C_w$ 是装在每个 sidecar 里的短期证书,相当于员工工牌,标明服务身份与有效期。
    CwC_w
  2. 链式验签$\text{verifySig}(C_w, C_i)$ 使用中间证书的公钥验证工作负载证书的签名,确认工牌确实由区域钢印签发。
    verifySig(Cw,Ci)\text{verifySig}(C_w, C_i)
  3. 逻辑与$\land$ 表示两个验签都必须为真,任何一环断裂,整个证书链即宣告无效。
    verifySig(Cw,Ci)∧verifySig(Ci,Cr)\text{verifySig}(C_w, C_i) \land \text{verifySig}(C_i, C_r)

流量分发

集团设了一个总机台,所有客户来电先进总机。总机有一本“业务名录”,记录每家分店能接什么单、还能接多少;然后按繁忙程度把电话转给合适的分店。如果某家分店占线,总机自动转给别的分店——客户根本感觉不到换了一家。这个“总机 + 名录 + 转接”的组合拳,正是 Primary-Remote 流量分发策略的完整映射。

服务发现就是那本名录的维护。Remote 集群的 sidecar 会通过 API Server 与 Primary 同步一份“网格级服务名录”,每个集群里注册的服务都会出现在统一列表中。负载均衡则是收到请求后按权重从名录中挑选目标端点。当目标服务不在本集群时,sidecar 会把请求送到本集群的东西向网关,由网关转发到目标集群——这就是跨集群路由。故障转移,相当于分店占线后的大规模转单:当某地域所有端点都被标记为不健康时,流量自动转移到其他地域健康端点。权重分配规则通常按副本数配置,写成公式:

在容灾场景下,可以让主区域权重设为 80、备区域设为 20,平时备区域承接少量流量保持热备;主区域故障后把权重整体切到备区域。总机名册一更新,所有接线员立刻知道哪家分店还能接单;哪家停电,总机一键转接。客户嘴上说着“请稍等”,其实电话早被总机悄悄换到了另一座城市的分店——这就是流量分发策略的“无感接力”。

Pk=wk∑i=1nwiP_k = \frac{w_k}{\sum_{i=1}^{n} w_i}
请求被分到第 k 个集群的概率 = 该集群权重 ÷ 全部候选集群权重之和。权重大的集群吃肉,权重小的集群喝汤。
  1. 权重比例$P_k$ 是请求分配给第 $k$ 个集群的概率,所有 $P_k$ 相加恒等于 1。
    PkP_k
  2. 集群权重$w_k$ 表示第 $k$ 个集群的权重,实践中通常取该集群中的服务副本数量。
    wkw_k
  3. 归一化分母$\sum_{i=1}^{n} w_i$ 是所有候选集群的权重总和,把各自权重除以总和,得到“按比例分配”的效果。
    ∑i=1nwi\sum_{i=1}^{n} w_i

配置实践

开分公司前,总部行政会发来一个“开荒包”:一份办公大楼的房卡配置、一张集团工牌、一个集团的 VPN 账号。分公司的人照着手册插上电源、连上 VPN,就能看到总部下发的所有规章制度。把一个 Remote 集群接入 Primary,本质上也是发一个类似的“开荒包”。

这个开荒包里装的是三样凭证:kubeconfig(API Server 地址与访问凭据)、根证书(建链时的信任基座)、ServiceAccount 令牌(身份认证)。Primary 侧用 istioctl 生成一个 remote secret 写入 Remote 集群,之后 Remote 就能访问 Primary 的 API Server 和服务发现接口。操作步骤分四步走,核心流程如下:

Remote 集群的接入凭证集合可以形式化表示为:

配置实践的本质就是把这套“行政包”流程规范化、自动化。最佳实践建议用 cert-manager 管理证书轮换,定期检查 remote secret 是否过期;如果两个集群的 Pod 网段重叠,还需要配置 VPN 或云互联进行网络打通。开业包发放 → 照手册配置 → 专线一插 → 分店自动接入集团网络,新分店像 U 盘即插即用一样加入网格。

Kremote={kubeconfig, rootCert, token}K_{\text{remote}} = \{ \text{kubeconfig},\ \text{rootCert},\ \text{token} \}
Remote 接入所需凭证 = { API Server 访问配置,根证书,服务账号令牌 }。三件套齐了,专线一插就能加入网格。
  1. 访问配置$\text{kubeconfig}$ 是 Kubernetes 的客户端配置文件,包含 API Server 地址、集群上下文等信息。
    kubeconfig\text{kubeconfig}
  2. 信任基座$\text{rootCert}$ 是根证书,Remote 用它校验 Primary 的 TLS 身份,确保没有连到冒牌总部。
    rootCert\text{rootCert}
  3. 身份令牌$\text{token}$ 是 ServiceAccount 令牌,Remote 用它在 API Server 上完成身份认证。
    token\text{token}
bash12 行
# 第一步:Primary 集群安装 istiod,profile=remote-pilot 表示暴露 API 便于 Remote 接入istioctl install --set profile=remote-pilot # 第二步:生成 Remote 集群的接入 Secret(包含 kubeconfig)istioctl x create-remote-secret --name=remote-cluster | kubectl apply -f - # 第三步:Remote 集群导入 Secret 并安装 remote profile(不装控制面)kubectl apply -f remote-secret.yamlistioctl install --set profile=remote # 第四步:给业务命名空间打标签,新 Pod 自动注入 sidecarkubectl label namespace app istio-injection=enabled

适用场景

有些生意只适合开一家店,有些生意必须广撒网。连锁餐饮的选址逻辑是:考察人流(流量分布)、评估抗风险(容灾)、核算管理成本(控制面开销)。Primary-Remote 的开店逻辑完全一致——不是所有场景都适合它,但在对的地方,它能发挥极大的杠杆效应。

适用场景从三方面考量。多区域容灾:核心服务至少部署在两个地域,任一地域故障可快速切换,这家店倒了还有别家顶着;混合云统一管理:公有云与自建机房各自是集群,用一套控制面统一治理,不必在两边各养一支运维团队;规模权衡:如果某个 Remote 集群与 Primary 之间的网络延迟超过几百毫秒,或业务团队强烈要求自治,此时更应考虑多 Primary 模式。从演进路径看,建议从单集群起步,先在同城增加 Remote 集群验证流程,再跨地域扩展;当集群数量与自治需求都上升时,再演进为多 Primary 网格。

多区域布局带来的可用性提升可以用一个简洁的概率模型刻画:

当然,这只是理论模型,实际还要考虑跨区域同步延迟与数据一致性问题。选址对了,分店才不至于亏损。Primary-Remote 不是银弹,它是在“管理成本最低 + 容灾收益最大”之间找平衡——多区域布局如同多处下注,一家倒了,还有别家顶着。

Amesh=1−∏i=1n(1−Ai)A_{\text{mesh}} = 1 - \prod_{i=1}^{n} (1 - A_i)
整个网格的可用性 = 1 − 所有区域同时挂掉的概率。只要不止一个区域,整体可用性就会被“多条腿走路”显著抬升。
  1. 区域可用性$A_i$ 指第 $i$ 个集群或区域的可用性,例如 99%。
    AiA_i
  2. 同时故障概率$\prod_{i=1}^{n} (1 - A_i)$ 是所有区域同时不可用的概率乘积——只有全部区域一起挂,网格才完全不可用。
    ∏i=1n(1−Ai)\prod_{i=1}^{n} (1 - A_i)
  3. 补集转换$1 - \prod$ 取补集,得到“至少有一个区域存活”的概率。
    1−∏i=1n(1−Ai)1 - \prod_{i=1}^{n} (1 - A_i)

落地验证

新分店开张,总部督导拿着检查单来验收:工牌能不能刷门禁(证书验证)、跨城电话通不通(跨集群调用)、数据报表能不能回传总部(监控可观测)。任何一项不过,开业延迟。多集群网格落地同样要靠检查单逐项验收,七分部署,三分验证。

部署流程按部就班:准备证书(自签根证书或 cert-manager 托管)→ 安装 Primary(profile=remote-pilot)→ 创建并导入 remote secret → 安装 Remote(profile=remote)→ 命名空间打标验证注入。功能验证最常用的是 bookinfo 示例:在 Primary 部署 productpage,在 Remote 部署 reviews,从 Primary 发起请求,观察 productpage 能否调用到远端 reviews——能通,说明服务发现、证书信任、东西向网关全链路 OK。验收标准在逻辑上是一个“全部通过才算通过”的合取式:

日常运维中,用 Prometheus 聚合两个集群的指标,重点监控 istiod 证书的到期时间、远程连接成功率、东西向网关的流量量级。排错时按顺序排查:先看 remote secret 是否过期,再看 trustDomain 是否一致,三看东西向网关 Pod 是否健康,四查 VirtualService 路由是否写对。督导在检查单上逐项打勾,全部 ✓ 之后才签字放行;多集群落地没有玄学,靠的是一张张清晰的检查清单和逐步验证的耐心。

Pass=⋀i=1mchecki\text{Pass} = \bigwedge_{i=1}^{m} \text{check}_i
验收通过 = 检查项 1 ∧ 检查项 2 ∧ … ∧ 检查项 m。有一项失败,整体即为红灯。
  1. 检查项$\text{check}_i$ 表示第 $i$ 项验收检查,如“证书未过期”“kubeconfig 有效”“istiod 可达”。
    checki\text{check}_i
  2. 逻辑合取$\bigwedge_{i=1}^{m}$ 表示把 $m$ 项检查的结果做逻辑与运算,只要有一项为假,整体就为假。
    ⋀i=1mchecki\bigwedge_{i=1}^{m} \text{check}_i
  3. 通过条件$\text{Pass}$ 是最终验收结果,只有全部打勾才为真,对应督导的“开业许可证”签字权。
    Pass\text{Pass}

AI 应用场景

混合云统一服务治理

阶段:架构设计阶段

解决的问题:企业同时使用公有云与自建机房,两朵云各有一套 Kubernetes 集群、各配一套 Istio,规则割裂、证书分家、监控两套,运维成本翻倍。用 Primary-Remote 可以把控制面集中在公有云 Primary,机房作为 Remote 接入,一套策略管遍两朵云。

具体案例:某金融科技公司将核心支付服务部署在自建机房,AI 推理与前端服务部署在公有云。通过 Primary-Remote 模式,机房以 Remote 集群身份接入云上 Primary,统一证书签发与限流策略,跨云调用走东西向网关加密转发,满足等保合规的同时省去一套控制面运维。

多区域容灾与就近接入

阶段:流量治理阶段

解决的问题:传统单集群备份只能靠 DNS 切换或外部负载均衡,切换时间以分钟计。Primary-Remote 模式下,服务发现与健康检查由控制面统一维护,故障转移自动完成,客户无感知。

具体案例:某在线教育平台在华北、华东两地域各部署一个 Remote 集群,Primary 设在华北。正常情况下华北权重 80%、华东 20%;华东机房光缆被挖断后,健康检查自动剔除该集群端点,所有流量瞬时切换到华北,课程直播零中断。

中台多团队集中可观测

阶段:可观测性建设阶段

解决的问题:各业务线独立集群后,指标分散在各个 Prometheus,难以统一对比分析。借助 Primary-Remote 的集中控制面,可以汇聚所有集群的遥测数据,在一个看板里观察全局。

具体案例:某电商中台团队用 Primary 集群承载订单、库存等核心服务,交易、营销等业务线各建 Remote 集群。所有集群的 sidecar 指标统一上报到 Primary 的 Thanos + Prometheus,证书到期与跨集群延迟一目了然,业务线无需自建监控。

Python 演示

python76 行
import randomfrom collections import defaultdict  class PrimaryRegistry:    """Primary 集群的全局注册中心,维护本地与远端两份服务表"""     def __init__(self):        self._local_services = defaultdict(dict)        self._remote_services = defaultdict(dict)     def register_remote(self, cluster, service, replicas):        """Remote 调用此方法上报服务,相当于服务发现同步"""        self._remote_services[service][cluster] = replicas        print("[Primary] 已登记远端集群 {} 的服务 {},副本 {} 个".format(cluster, service, replicas))     def register_local(self, service, replicas):        """Primary 本地服务直接登记"""        self._local_services[service]["primary"] = replicas     def candidates(self, service):        """返回该服务在所有集群的副本数表,作为路由依据"""        table = {}        table.update(self._local_services.get(service, {}))        table.update(self._remote_services.get(service, {}))        return table  class RemoteCluster:    """Remote 集群:本地只有数据面,服务信息上报到 Primary"""     def __init__(self, name, registry):        self.name = name        self.registry = registry        self._service_replicas = {}     def add_service(self, service, replicas):        """本地新增服务并上报 Primary"""        self._service_replicas[service] = replicas        self.registry.register_remote(self.name, service, replicas)  def pick_cluster(registry, service, rd=random.random):    """按副本数加权随机选择目标集群,模拟流量分发"""    table = registry.candidates(service)    total = sum(table.values())    if total <= 0:        return None    x = rd() * total    upto = 0.0    for cluster_name in sorted(table):        upto += table[cluster_name]        if x < upto:            return cluster_name    return None  def main():    registry = PrimaryRegistry()    registry.register_local("order-svc", 3)     beijing = RemoteCluster("beijing", registry)    beijing.add_service("order-svc", 4)     shanghai = RemoteCluster("shanghai", registry)    shanghai.add_service("order-svc", 2)     counts = defaultdict(int)    for _ in range(1000):        c = pick_cluster(registry, "order-svc")        counts[c] += 1    print("1000 次请求的分发结果:", dict(counts))  if __name__ == "__main__":    main()
目的:用 Python 模拟 Primary-Remote 多集群网格中的服务发现与加权流量分发,演示请求如何按副本数量在总部与各远端集群之间分配。
  1. class PrimaryRegistry:定义 Primary 集群的全局注册中心,同时维护本地与远端服务两张表。
  2. def register_remote(self, cluster, service, replicas):Remote 集群上报服务的入口,相当于 mesh 级服务发现同步。
  3. def candidates(self, service):把本地与远端服务表合并成一份路由候选表,对应跨集群统一服务名录。
  4. def add_service(self, service, replicas):Remote 集群本地登记服务后立即调 register_remote 上报 Primary。
  5. table = registry.candidates(service)取该服务的全部候选集群及其副本数,模拟从总机名录拉取可用分店。
  6. x = rd() * total生成 0 到总权重之间的随机数,决定这次“电话”转给谁。
  7. upto += table[cluster_name]累积权重,类似转盘抽奖按扇区面积落点,实现负载均衡。
  8. counts[c] += 1统计 1000 次分发结果,直观验证权重比例是否符合预期。

常见误区

误区我以为 Primary-Remote 既然是“多集群”,那每个集群都应该有自己的控制面,Remote 集群只是少装了一些组件而已,所以照着单集群的教程在 Remote 里也装了 istiod。

正解Remote 集群的核心特征就是“不装控制面”。它只运行数据面 Envoy sidecar 和必要的网关组件,所有配置下发、证书签发、服务发现都通过远程连接 Primary 的 istiod 完成。就像分店只配服务员,不配店长。若在 Remote 装了 istiod,就退化为多 Primary 自治模式,失去了集中管理的意义。

为何常见:多集群直觉上容易理解为“每集群一套”,忽略了 Primary-Remote 的精髓恰恰是“控制面单点集中、数据面多点分散”。

误区既然所有决策都靠 Primary,那 Primary 一挂,所有 Remote 集群应该全线宕机了吧?我一度以为这个模式是单点故障设计。

正解Remote 集群内的 sidecar 在配置下发后是“本地执行”的——已经生效的 Envoy 配置、已签发且未过期的证书,都可以继续支撑本集群内的业务流量。Primary 短暂不可用只会导致配置无法更新、新证书无法签发,但不至于让已运行的请求全部中断。就像一个分公司被切掉视频会议,员工依然能按既定手册干活,只是没法开新订货会。

为何常见:把“控制面集中”误读为“运行时强依赖”,忽略了数据面的本地缓存与自治能力。

误区多集群嘛,各集群独立签发证书更安全,所以我给每个集群分别生成了不同的根 CA,心想这样互不干扰。

正解Primary-Remote 要求整个网格共享同一个信任域,所有集群的证书都应由同一根证书(或由它派生的中间证书)签发。如果各集群根证书不同,跨集群 TLS 握手时无法沿证书链验证到共同锚点,服务间调用会直接失败。统一根证书不是安全隐患,而是“集团统一印鉴”,反而让信任关系更简单、可审计。

为何常见:把“隔离安全”的直觉套用到证书体系上,忽略了 Istio 身份验证的核心是“共享根 + 链式验签”。

误区既然有东西向网关,那我是不是要把所有服务的请求都配置成跨集群转发,才能真正用上多集群能力?

正解东西向网关只处理“跨集群”的流量。如果客户端和目标服务在同一个集群内,请求会在本地直接完成,完全不经过网关。多集群的价值不是让所有流量绕一圈,而是让“本集群优先、跨集群兜底”。就像同城快递直接骑手送达,只有跨城才走物流中转站。滥用网关反而增加延迟与故障点。

为何常见:过度关注新增组件,忽略了多集群的流量模型核心是“就近路由 + 跨集群兜底”。

误区我以为 Remote 集群接入后,Primary 上的服务数据会自动同步复制到 Remote,这样每个集群都有完整副本,容灾效果拉满。

正解Primary-Remote 同步的是“服务发现的元数据”(服务名、端点、认证信息),不是业务数据的复制。服务本身是否需要多地域部署、数据是否需要跨集群同步,属于应用层和存储层设计,网格不负责拷数据。就像总部名录上写着“北京分店能做烤鸭”,不代表上海分店会自动拥有烤鸭师傅。容灾的前提是业务真的在两地都部署了。

为何常见:把“服务发现聚合”误当成“数据复制”,混淆了控制面元数据与业务数据的边界。

面试题

Q1. 在 Primary-Remote 模式中,控制面组件部署在哪个集群?

单选题 · easy

  • A.每个集群都部署一套
  • B.仅 Primary 集群部署← 正确答案
  • C.仅 Remote 集群部署
  • D.随机部署任意一套

答案:B。Primary-Remote 的核心就是一个控制面集中部署在 Primary,Remote 只跑数据面。选 A 是把它当成了多 Primary 模式;C 会把主从关系完全颠倒;D 则毫无依据。就像集团总部只能有一个董事会,分店不可能自设决策班子。

Q2. Remote 集群中承担业务流量转发任务的组件是?

单选题 · easy

  • A.Istiod 控制平面组件
  • B.Envoy Sidecar 数据面代理← 正确答案
  • C.Kiali 可视化服务组件
  • D.Prometheus 监控指标组件

答案:B。Remote 集群里与业务 Pod 同生命周期的是 Envoy sidecar,负责拦截和转发进出 Pod 的流量。Istiod 在 Remote 中不存在;Kiali 是可视化 UI;Prometheus 做监控采集。类比分店的一线员工是服务员,不是远程会议室的电话机。

Q3. Primary-Remote 模式中证书签发顺序正确的是?

单选题 · mid

  • A.根证书签发工作负载证书
  • B.工作负载证书签发根证书
  • C.根证书签发中间证书再签发工作负载证书← 正确答案
  • D.中间证书签发根证书再签发工作负载证书

答案:C。标准信任链是“根证书 → 中间证书 → 工作负载证书”的三级结构。A 缺少中间层,不利于隔离;B、D 方向颠倒。就像工牌的验章顺序只能是“总印压钢印,钢印压工牌”,不能倒过来。

Q4. 跨集群服务调用时,流量出口必须经过哪个组件?

单选题 · mid

  • A.本地负载均衡器
  • B.东西向流量网关← 正确答案
  • C.南北向流量网关
  • D.本地域名代理服务

答案:B。跨集群流量必须由本集群的东西向网关转发到目标集群的东西向网关,完成集群间路由。南北向网关负责外部流量进入,本地负载均衡和域名代理都不跨集群。这就像跨城快递必经城际中转站,而不是小区收发室。

Q5. Remote 集群接入 Primary 集群时,需要具备哪些凭证?

多选题 · mid

  • A.Kubeconfig 访问配置← 正确答案
  • B.根证书公钥材料← 正确答案
  • C.服务账号认证令牌← 正确答案
  • D.数据库管理员密码

答案:ABC。kubeconfig 提供 API Server 地址与访问上下文,根证书建立 TLS 信任,令牌完成身份认证,三者缺一不可。数据库密码与网格接入无关。类比总部发的“开荒包”:房卡(地址)、工牌(证书)、VPN 账号(令牌),三件套齐了才连得上总部。

Q6. 以下哪个信号最能说明该考虑从 Primary-Remote 演进到多 Primary?

单选题 · hard

  • A.集群间网络延迟过大且业务需要自治← 正确答案
  • B.Remote 集群节点数量快速增多
  • C.数据面 sidecar 资源占用持续升高
  • D.证书签发频率变得越来越频繁

答案:A。Primary-Remote 的前提是 Remote 能低延迟地访问 Primary。当跨集群延迟大到配置下发缓慢,或团队要求分区自治时,就应考虑多 Primary 模式。节点增多、sidecar 膨胀、证书轮换频繁都能通过扩容和自动化解决,不构成模式切换的理由。

Q7. 以下哪些方式可实现跨集群的流量故障转移?

多选题 · mid

  • A.健康检查自动剔除异常端点← 正确答案
  • B.把流量权重调整到备份区域← 正确答案
  • C.无限提高请求超时时间上限
  • D.关闭集群的自动注入功能

答案:AB。健康检查剔除是自动故障转移的基础,权重调整是手动或策略化切换的常见手段。超时调高只是延长等待,无法转移流量;关闭自动注入会让新 Pod 失去 sidecar,反而破坏网格功能。就像总机先判断分店有没有人接,再把单子转给别的分店。

Q8. Primary-Remote 模式最重要的结构特征是?

单选题 · easy

  • A.只保留一套集中式控制面← 正确答案
  • B.每个集群各部署一套控制面
  • C.控制面与数据面全部合一
  • D.数据面与网关全部集中部署

答案:A。该模式最核心的特征就是控制面集中为一份,数据面分布在各集群。B 是多 Primary 模式;C、D 与网格的设计理念完全相悖。就像连锁集团只有一个管理班子,但服务员分布在所有门店。

Q9. 在 Primary-Remote 网格中,信任域(trustDomain)一致的最关键含义是?

单选题 · hard

  • A.所有服务共享同一个信任锚点← 正确答案
  • B.所有集群共享同一套健康检查
  • C.所有服务获得相同的流量权重
  • D.所有流量强制经过统一网关

答案:A。trustDomain 是网格身份体系的总名称,只有一致才能保证证书链验到同一个根,进而互信。健康检查、权重、网关路径都与此无关。就像两家分店的工牌必须盖同一个集团总印,否则保安不敢放行。

Q10. 多集群网格排错时,下列哪些检查项属于常规必查点?

多选题 · extreme

  • A.Remote 接入令牌证书是否过期← 正确答案
  • B.各集群 trustDomain 配置是否一致← 正确答案
  • C.东西向网关 Pod 是否健康运行← 正确答案
  • D.业务数据库副本数量是否充足

答案:ABC。接入令牌过期、trustDomain 不一致、网关不健康是多集群故障的三大高频根因,分别对应认证、信任与路由环节。数据库副本数属于存储层,与网格排错无关。类比督导检查先看工牌有没有过期、总印对不对、跨城专线通不通。