Istio 与 Cilium 服务网格
Envoy sidecar 数据面 · eBPF sidecarless 数据面 · xDS / mTLS · Hubble 可观测
一句话结论
Istio 靠 Envoy sidecar 治理最全,Cilium 靠 eBPF 内核态省掉横跳,成熟 vs 性能之争。
场景问题
微服务多了以后,一堆横切需求要统一解决:服务间 mTLS 加密、灰度/金丝雀路由、重试/超时/熔断、流量镜像、全链路可观测。如果每个服务自己在代码里塞这些逻辑,语言各异、版本不一、改一次全量发版,维护地狱。
服务网格(Service Mesh) 的思路是:把这些能力从业务代码下沉到基础设施,业务无感知。但"下沉到哪里"有两条路线之争:
- Istio:给每个 Pod 塞一个 Envoy sidecar 代理,所有进出流量被劫持到 sidecar,由它执行策略。
- Cilium:用 eBPF 把能力做进内核数据面,不需要 sidecar(sidecarless)。
打个比方:Istio 给每个服务(Pod)配一个贴身保镖(Envoy sidecar)——所有进出的话都先过保镖的手(流量被劫持,做 mTLS 加密、灰度路由、重试熔断),功能最全最灵活。代价是每个员工都多养一个保镖,工资(额外内存/CPU)和"进出都多绕一道手"的延迟全是成本。Cilium 的 sidecarless 则像把安保能力直接做进大楼的门禁系统(eBPF 塞进内核)——不给每人配保镖,进出楼时门禁在底层自动处理,省了一大笔保镖开销、还少绕一道。类比失效边界:门禁(eBPF)胜在省钱、快,但受内核能力和 eBPF 程序的表达力所限——那些精细的七层花活(复杂流量镜像、丰富协议解析、逐请求策略)它玩不转,仍不如贴身保镖 Envoy 全面成熟。所以这是一场"成熟灵活(Istio)vs 性能省耗(Cilium)"之争,没有绝对赢家,按治理复杂度和规模选。
这两条路线在延迟、资源、可运维性上的取舍,正是本专题要讲清的。
实现方案
Istio:Envoy sidecar + istiod 控制面
- 数据面:每 Pod 注入一个 Envoy 容器(sidecar)。通过 iptables 规则(由 init 容器
istio-init写入)把 Pod 的所有入/出流量重定向到 Envoy 端口,业务代码零改动。 - 控制面 istiod:把用户写的路由/策略 CRD 翻译成 Envoy 配置,通过 xDS 协议(LDS/RDS/CDS/EDS)动态下发给所有 sidecar。
- mTLS:istiod 签发工作负载证书,sidecar 之间自动 mTLS,业务明文、网络密文。
# Istio 灰度:90% 打 v1,10% 打 v2(金丝雀)
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews
spec:
hosts: [reviews]
http:
- route:
- destination: { host: reviews, subset: v1 }
weight: 90
- destination: { host: reviews, subset: v2 }
weight: 10
retries: # 治理能力下沉到网格
attempts: 3
perTryTimeout: 2s
---
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
trafficPolicy:
tls: { mode: ISTIO_MUTUAL } # 自动 mTLS
subsets:
- name: v1
labels: { version: v1 }
- name: v2
labels: { version: v2 }
Cilium:eBPF 数据面(无 sidecar)
- 每节点一个 Cilium agent,把 L3-L7 策略、负载均衡、加密编译成 eBPF 程序挂到内核挂载点(tc/XDP/socket)。
- 流量在内核态被直接处理与转发,不经过每 Pod 的用户态代理。可替代 kube-proxy 的 iptables(O(1) map 查找)。
- Hubble 基于 eBPF 事件提供 L3-L7 流量的实时可观测(谁访问谁、被哪条策略拒了),无需 sidecar 埋点。
# Cilium L7 策略:只允许 GET /public,其余拒绝(策略在内核 eBPF 执行)
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: allow-public-get
spec:
endpointSelector:
matchLabels: { app: web }
ingress:
- fromEndpoints:
- matchLabels: { app: frontend }
toPorts:
- ports:
- { port: "80", protocol: TCP }
rules:
http:
- method: "GET"
path: "/public"
sidecar 流量劫持的开销
sidecar 模式里,一次 A→B 调用要经过 App A → Envoy A → Envoy B → App B,每次进出 sidecar 都是一次 iptables 重定向 + socket 收发 + 用户态代理处理——"反复横跳",多两跳代理与多份内存/CPU。
控制面 / 数据面职责矩阵
面试深水区最常追问的落点是"某组件到底做什么、挂了会怎样、能不能没有"。下表把两家的关键组件平铺展开,"能不能没有" 列取值 必须 / 可弱依赖 / 可选 三态。
Istio 侧
| 组件 | 部署形态 | 职责 | 挂掉后果 | 能不能没有 |
|---|---|---|---|---|
istiod | Deployment(集群 1~N 副本) | 看 API Server 上的 VS/DR/Gateway/PeerAuth CRD;翻译成 Envoy 配置经 xDS 下发;签发 SPIFFE 工作负载证书(SDS) | 已建连接不断;新配置冻结;证书过期后 mTLS 握手失败 | 必须(集群级 SPOF) |
Envoy sidecar | Pod 内 sidecar 容器 | L4/L7 数据面代理;执行 xDS 下发的路由/超时/熔断;本地 mTLS 端点 | 该 Pod 东西向直接断 | 必须(sidecar 模式) |
istio-init | Pod 内 init 容器(生命周期一次性) | 写 iptables REDIRECT 规则,把业务出/入流量劫持到 15001/15006 | Pod 起来即完成,运行期无影响 | 必须(sidecar 模式;CNI 模式可替代) |
sidecar-injector webhook | MutatingAdmissionWebhook(istiod 内置) | Pod 创建时准入拦截,注入 sidecar + init 容器 spec | 新 Pod 无法注入 sidecar;admission 失败或 sidecar 缺失 | 必须(webhook 缺则 sidecar 自动注入停摆) |
Ztunnel | DaemonSet 每节点一个(Ambient 模式) | per-node L4 密文 + mTLS,取代 sidecar 的 L4 职责 | 该节点东西向 L4 中断 | Ambient 专属;Sidecar 模式下不部署 |
waypoint proxy | Deployment 按服务/命名空间(Ambient 模式) | L7 治理按需注入;取代 sidecar 的 L7 职责 | 该服务 L7 治理失效(仍有 Ztunnel L4) | Ambient 模式可选(无 L7 需求时不部署) |
Cilium 侧
| 组件 | 部署形态 | 职责 | 挂掉后果 | 能不能没有 |
|---|---|---|---|---|
Cilium Agent | DaemonSet 每节点一个 | 看 API Server / kvstore;编译 eBPF 程序、下发 eBPF map;处理 CNI 请求;BGP/LB | 该节点新 Pod 网络配置停滞、NetworkPolicy 变更不生效;已建连接不断(eBPF 驻留内核) | 必须(节点级 SPOF) |
eBPF 数据面 | 无进程(内核态挂载点) | L3-L4 转发 / NetworkPolicy / LB / mTLS / 可观测事件 | Agent 已下发的 eBPF 程序独立于用户态存活 | 必须(无替代) |
Cilium Operator | Deployment(集群 1~N 副本) | 集群级 GC、IPAM 池分配、identity 分配、CRD 状态维护 | 短时挂 OK;长时间 IPAM 池耗尽 / identity 分配失败 | 可弱依赖(集群级但非 hot path) |
Envoy DaemonSet | DaemonSet per-node(Service Mesh 场景) | L7 策略、Ingress/Gateway、L7 mTLS 断代理 | 该节点 L7 治理失效;L3-L4 eBPF 通道仍在 | 可选(默认关闭;启用 Service Mesh 才拉起) |
Hubble | hubble-relay Deployment + hubble-ui Deployment | 聚合各节点 Agent 的 eBPF flow 事件;提供可观测 UI/CLI/API | 可观测中断,数据面不受影响 | 可选(可观测组件) |
边界总结:
- Istio istiod 是集群级 SPOF——单点故障会让新 Pod 起不来(webhook 内置在 istiod 里)、配置冻结、证书轮换倒计时;但已建连接不受影响。
- Cilium 的 SPOF 分层——
Cilium Agent是节点级 SPOF(挂了本节点新 Pod 配不了网),Operator是集群级弱依赖(挂了短时 OK);已建连接不受影响。 - 两家的共通规律:控制面挂 ≠ 数据面断;数据面(Envoy 内存里的 xDS 快照 / 内核里的 eBPF 程序)在稳态下自成一体,控制面只在"变更"和"证书轮换"两个窗口成为必要条件。
istiod 可用性推理:挂了集群就断吗?
回答方式是分三层递进,把"断没断"从二值升级到"什么时候开始断、断在哪一层"。
① 已建 mTLS 连接:全程绿灯
Envoy 启动时通过 xDS 从 istiod 拉到 LDS/RDS/CDS/EDS,配置存在 Envoy 内存里;istiod 稳态下不在数据面 hot path 上——业务流量走 Envoy 出/入、Envoy ↔ Envoy 走 mTLS,全程绕过 istiod。所以 istiod 挂掉的瞬间,已建连接继续转发。
② 新连接 / 新 Pod 注入:分层黄灯
- 已存在 Pod 的新连接:走 Envoy 缓存路由(旧配置),照常建立。
- 新增/修改 VS/DR/PeerAuth:无人下发给 Envoy → 变更冻结(旧配置继续生效)。
- 新 Pod 创建:
sidecar-injector webhook内置在 istiod 里,webhook 不可达 →admission阶段失败 → Pod 直接起不来(若sidecar.istio.io/inject=true且 webhook 配置为FailurePolicy: Fail)。这是 istiod 挂掉最早显现的症状。
③ 证书轮换:绿转红倒计时
Istio 默认 workload 证书 TTL 与提前轮换窗口取决于 WORKLOAD_CERT_TTL 配置(1.18+ 可通过 mesh-config 调整;不写死数字,以配置为准)。Envoy 通过 SDS 从 istiod 拉证书;istiod 挂掉 → SDS 拉不到 → 证书到期后mTLS 握手失败 → 东西向断。这是 istiod 挂掉的最终红灯。
istiod 故障场景的数据面行为泳道图(点击展开)
结论行:istiod 短时挂 ≠ 集群断网,但会进入配置冻结 + 证书轮换倒计时。绿→黄→红的分界点分别是"变更请求到来时"和"证书 TTL 到期时"。
最小控制面依赖清单
跑通一个 Istio mesh 至少需要以下三项同时在线才算控制面健康:
- API Server:CRD 与 Pod 事件源;istiod 与 webhook 都从这里拉。
- istiod:xDS 下发 + SDS 证书签发 + sidecar-injector webhook(三合一)。
- sidecar-injector webhook(istiod 的一部分):新 Pod 注入 sidecar 的唯一入口。
其中任意一项失效,都会在分钟~小时级别把"新变更"和"新 Pod"卡住;已建连接与已存在 Pod 的通信仍能维持。
Cilium 控制面故障对照
对照 istiod 的三层推理,Cilium 侧最容易被追问的是"Agent / Operator 分别挂了会怎样"。
① Cilium Agent 挂了:per-node 关键组件
Cilium Agent 是每节点一个 DaemonSet 实例。挂了之后:
- 该节点 eBPF 程序仍驻留内核——已建连接继续转发、已加载的 NetworkPolicy 继续生效;这是 eBPF 相对 sidecar 的架构级韧性(sidecar 挂了本 Pod 直接断)。
- 该节点新 Pod 无法完成 CNI ADD——网络配置停滞,Pod 起不来。
- NetworkPolicy 变更不生效——变更需要 Agent 重编译 eBPF 并
bpf()更新 map。 - identity 分配失败——新工作负载拿不到 identity,被判为不可信。
② Cilium Operator 挂了:集群级弱依赖
- 短时挂 OK——Operator 不在数据面路径上,也不在单节点 CNI 路径上。
- 长时间挂——IPAM 池耗尽(新 Pod 无 IP 可分);identity 分配失败(依赖模式);CRD 状态未更新(IPPool、CiliumIdentity 等)。
对比结论表:
| 组件 | 挂掉级别 | 已建连接 | 新 Pod | 变更生效 |
|---|---|---|---|---|
| Istio istiod | 集群级 SPOF | 不影响 | 起不来(webhook 不可达) | 冻结 |
| Cilium Agent | 节点级 SPOF | 不影响 | 该节点起不来 | 该节点冻结 |
| Cilium Operator | 集群级弱依赖 | 不影响 | 短时 OK;长期 IPAM 池耗尽 | 短时 OK |
记忆锚点:istiod = 集群级 SPOF;Cilium Agent = 节点级 SPOF;Cilium Operator = 集群级弱依赖。数据面(Envoy 内存 / 内核 eBPF)在稳态下都不依赖控制面存活,这是两家共通的"控制面挂 ≠ 数据面断"原则。
架构演进主线
两家的演进不是版本号的堆砌,而是每一步"数据面 / 控制面"各自变了什么——理解演进方向,才能理解今天的形态。
Istio 演进 3 阶段
| 版本 | 关键动作 | 数据面 / 控制面变化 |
|---|---|---|
| 1.0/1.4 多进程 | Pilot / Citadel / Galley / Mixer 各自 Deployment | 数据面:Envoy sidecar + istio-init;每次调用同步过 Mixer 做 telemetry/policy check(性能瓶颈)。控制面:4 个进程 4 个 SPOF。 |
| 1.5 istiod 合体 | 4 合 1 为单进程 istiod | 数据面:Mixer 下沉到 Envoy WASM / telemetry v2,请求不再同步过 Mixer。控制面:单进程管 xDS + SDS + injector + Gateway。 |
| 1.18+ Ambient GA | Ztunnel + waypoint 取代 sidecar | 数据面:"每节点一份 Ztunnel(L4+mTLS)+ 按需 waypoint(L7)" 取代 "每 Pod 一份 Envoy"。控制面:仍是 istiod,多管理 Ztunnel/waypoint 生命周期。 |
Istio 演进图(点击展开)
Cilium 演进 3 阶段
| 版本 | 关键动作 | 数据面 / 控制面变化 |
|---|---|---|
| 纯 CNI | 替代 kube-proxy 的 iptables/ipvs | 数据面:内核 eBPF 处理 L3-L4 + NetworkPolicy;控制面:Agent + Operator。 |
| 1.10 Service Mesh 预览 | 引入 per-node Envoy DaemonSet | 数据面:eBPF fast path + 按需 Envoy 走 L7(Ingress/Gateway);控制面:不变。 |
| 1.14+ mTLS + Gateway API + Cluster Mesh | SPIFFE 兼容 mTLS、Gateway API 一等公民、多集群 mesh | 数据面:eBPF 处理更多 L7 hairpin + mTLS;控制面:多集群 identity 与 policy 同步。 |
Cilium 演进图(点击展开)
殊途同归:两条路线的收敛
Istio 从 sidecar 走向 Ztunnel + waypoint、Cilium 从 CNI 走向 eBPF + per-node Envoy——两条路线都朝"节点级 L4 + 按需 L7 waypoint"收敛。共同的驱动力:
- 资源放大痛:per-Pod sidecar 意味着每个 Pod 多几十 MB Envoy,10K Pod 集群多几百 GB 内存。
- 运维耦合痛:sidecar 生命周期与 Pod 绑定,Envoy 升级要滚动重启全部 Pod,启动/退出顺序坑一堆。
- 零信任的最小面:只有 L4 + mTLS 是所有工作负载必需的;L7 治理是部分服务的诉求,按需注入更合理。
演进方向锚点(截至 2025)
- Istio Ambient:Ztunnel(L4/mTLS 强制) + waypoint(L7 按需) + 传统 sidecar(可选,向后兼容)。
- Cilium Mesh:eBPF fast path(L3-L4) + Envoy DaemonSet(L7 按需) + Cluster Mesh(多集群)。
- 谁做得更彻底:Cilium 的 eBPF fast path 在L3-L4 转发/LB上没人替代;Ambient 的 Ztunnel 在L4 mTLS 强制上语义更清晰。
关键流转细节图
以下 5 张时序/流转图分散补充上文提到的关键路径,每张聚焦一条流。
xDS 推送时序:从 kubectl apply 到 Envoy 生效
xDS 推送时序图(点击展开)
要点:xDS 是推送式(istiod 主动 push),不是 Envoy 轮询;LDS/RDS/CDS/EDS 四类资源按依赖顺序推送;Envoy 用ACK/NACK 反馈是否接受。
Sidecar 注入 + iptables 劫持:Pod 是怎么被劫持的
Sidecar 注入全景图(点击展开)
要点:istio-init 写的是 iptables REDIRECT(不是 DNAT)——保留原始目的地址供 Envoy 从 SO_ORIGINAL_DST 读取,用于路由决策;出流量走 15001,入流量走 15006。
Sidecar 流量劫持 · netfilter 五链视图 · 深水区
上一张时序图讲的是"Pod 生命周期里 iptables 什么时候被写入";这一张聚焦在流量真正进入 Pod 网络命名空间后,netfilter 五链上的走向——面试深水区问"3 倍 socket 开销、3 次内核/用户切换"具体走到哪几个 hook 点时,这张图是标准答案。
iptables 五链 · Istio 劫持全景(点击展开)
读图口径:
- 入向 (Inbound):外部包 →
PREROUTING→ 跳到ISTIO_INBOUND→ 命中业务端口 →REDIRECT --to-port 15006→ Envoy 收;然后 Envoy 通过SO_ORIGINAL_DST读原目的地址、做完策略后再从OUTPUT出(进本地环回)投递给业务容器。 - 出向 (Outbound):业务包
OUTPUT→ 跳到ISTIO_OUTPUT→ 按 owner uid 过滤(业务进程 uid → 走ISTIO_REDIRECT;Envoy 自己的 uid →RETURN避免死循环)→REDIRECT --to-port 15001→ Envoy 处理后再走 TCP 出网卡。 - owner uid 是防死循环的关键:如果不按 uid 过滤,Envoy 转出的包会再次被
OUTPUT拦回 Envoy 自己,形成无限循环——所以istio-init会用-m owner --uid-owner 1337(默认 Envoy uid=1337)显式 RETURN。
"3 倍 socket 开销"落到这张图:一次 A→B 调用,A 侧走 业务→OUTPUT(→ISTIO_OUTPUT→REDIRECT)→Envoy→OUTPUT→网卡 一次 socket 拆装;B 侧走 网卡→PREROUTING(→ISTIO_INBOUND→REDIRECT)→Envoy→OUTPUT→业务 又一次 socket 拆装。每次 REDIRECT 都是一次完整的 TCP/IP 协议栈遍历 + 用户/内核切换——这是 sidecar 相对 sidecarless(Cilium eBPF 内核态直转)的核心成本项。
为什么 REDIRECT 而不是 DNAT:REDIRECT 是 DNAT 的特化,专用于"改到本机某端口",且保留原始目的地址在 socket 元数据里(SO_ORIGINAL_DST)供上层 Envoy 读取。用 DNAT 则原目的地址会被覆盖,Envoy 拿不到"业务原本想访问的服务",路由决策无从做起。
mTLS 握手时序:证书从哪来、SAN 怎么验
mTLS 握手时序图(点击展开)
要点:证书不落盘(走 SDS 从 istiod 内存取),SAN 用 SPIFFE 格式 spiffe://<trust-domain>/ns/<ns>/sa/<service-account>,验证的是工作负载身份而非 Pod IP。
Cilium eBPF hook 点:内核在哪几处被挂了钩
Cilium eBPF hook 点分层图(点击展开)
要点:XDP 是最早的挂载点(丢包/负载均衡开销最小,但 metadata 有限);tc ingress/egress 是主战场(NetworkPolicy、L4 LB、Encryption 都在这层);socket/cgroup 处理同节点 hairpin(同节点两个 Pod 直接在 socket 层被 Cilium 短路,绕开 TCP/IP 栈往返)。
Cilium 控制面下发路径:从 CNP 到 eBPF map
Cilium 控制面下发图(点击展开)
要点:Cilium Agent 是节点本地组件,直接调用 bpf() syscall 更新内核 eBPF map;Operator 只做集群级协调(IPAM、identity),不在单节点策略下发路径上——这是 Cilium 控制面低耦合的关键。
为什么这么做
- 为什么把能力下沉到网格:mTLS/灰度/重试/可观测是跨服务共性,下沉后业务零改动、统一策略、集中运维,改治理不改业务代码。
- 为什么 eBPF 能省掉 sidecar 反复横跳:eBPF 程序运行在内核态,流量到达内核时就地做策略与转发,不必上送到每个 Pod 的用户态代理再下来。省掉 sidecar 的 iptables 劫持、额外 socket、用户态拷贝与代理进程本身的内存/CPU。
延迟/资源/可运维直觉
- 延迟:sidecar 每跳 +(劫持 + 代理)微秒级开销累积;eBPF 内核态直转更低。
- 资源:sidecar 每 Pod 一份 Envoy(几十 MB 内存 × Pod 数);eBPF 每节点一份 agent。
- 可运维:sidecar 生命周期与 Pod 耦合(启动顺序、优雅退出、版本升级要重启全部 Pod);eBPF 升级 agent 即可,但强依赖内核版本。
为什么别的选择不行
sidecar vs sidecarless 的各自代价
| 维度 | Istio sidecar | Cilium eBPF sidecarless |
|---|---|---|
| L7 能力成熟度 | Envoy 极其成熟,功能全 | L7 能力在补齐中,复杂协议不如 Envoy |
| 延迟/资源 | 每 Pod 一代理,横跳 + 内存放大 | 内核态直转,省 sidecar |
| 内核依赖 | 弱(用户态) | 强(需较新内核支持 eBPF 特性) |
| 排障 | 代理日志/指标直观,但链路多一环 | Hubble 强,但 eBPF 内核态调试门槛高 |
| 多语言/异构 | 完全无侵入 | 无侵入 |
游戏帧内通信别硬套 Mesh
无论 sidecar 还是 eBPF,通用 Mesh 面向微服务治理,不是为游戏帧内多跳低延迟同机调用设计。同机高频通信仍应走 消息总线共享内存;自研游戏网格更倾向 去中心化 + 降连接数。Mesh 的价值在东西向治理/可观测,不在替代 IPC。
沉淀结论
结论
- Istio = Envoy sidecar 数据面 + istiod 控制面,xDS 动态下发,VirtualService/DestinationRule 做路由与 mTLS。功能最全、语言无侵入,代价是每 Pod 一代理 + 流量横跳 + 内存放大。
- Cilium = eBPF 无 sidecar 数据面,L3-L7 策略在内核态执行,可替代 kube-proxy,Hubble 强可观测。低延迟省资源,代价是内核版本依赖与 L7 成熟度。
- 二者本质取舍:成熟通用治理(sidecar) vs 内核态高性能(eBPF)。
- eBPF 之所以省,是流量到内核就地处理,不必反复上送用户态代理——见 eBPF。
记忆口诀
Istio:Envoy sidecar / istiod 控制面 / xDS 下发 / 功能全但横跳
Cilium:eBPF 无 sidecar / 内核态直转 / Hubble 可观测 / 省资源但依赖内核
取舍:成熟通用治理 vs 内核态高性能
相关专题:eBPF 原理与落地 · CNI 与 K8s 网络插件 · 中心化 vs 去中心化网格 · 自研 Mesh × K8s · 自研 Mesh 数据面深水区
内容来源
综合整理。参考方向:Istio 官方文档(架构、istiod 合体演进、Envoy sidecar、xDS 协议 LDS/RDS/CDS/EDS、VirtualService/DestinationRule、mTLS + SDS + SPIFFE、iptables REDIRECT 注入、ISTIO_INBOUND / ISTIO_OUTPUT / ISTIO_REDIRECT 自定义链与 owner uid 防死循环、Ambient Mesh / Ztunnel / waypoint)、Cilium 官方文档(eBPF 数据面挂载点 XDP/tc/socket、sidecarless、CiliumNetworkPolicy、Agent + Operator 分工、替代 kube-proxy、Hubble、Service Mesh + Gateway API + Cluster Mesh)、Envoy xDS 协议说明、eBPF 内核挂载点原理、Linux netfilter 五链模型。
自测:合上资料能说清楚吗?
Istio 是怎么在业务代码零改动的前提下,把所有进出流量劫持到 Envoy sidecar 的?
参考答案
由 init 容器 istio-init 写入 iptables 规则,把 Pod 的入/出流量重定向到 Envoy 端口。业务进程收发的是明文,网络上跑的是 sidecar 间的 mTLS,全程无感知。
istiod 是怎么把用户写的路由/策略配置生效到成百上千个 sidecar 上的?
参考答案
istiod 把 VirtualService/DestinationRule 等 CRD 翻译成 Envoy 配置,通过 xDS 协议(LDS/RDS/CDS/EDS)动态下发给所有 sidecar,无需重启,实现路由/灰度/重试的集中控制。
同样做服务网格,Istio sidecar 和 Cilium eBPF 在延迟与资源上的核心差异是什么?
参考答案
sidecar 一次 A→B 调用要经 App A→Envoy A→Envoy B→App B,多两跳用户态代理 + 每 Pod 一份 Envoy 内存。eBPF 在内核态就地转发,不上送用户态,每节点一份 agent,延迟更低、更省资源。
既然 eBPF sidecarless 又快又省,为什么 Istio 仍被大量采用?
参考答案
Envoy L7 能力极其成熟、复杂协议支持全,且是用户态、弱内核依赖。eBPF 强依赖较新内核版本、L7 能力仍在补齐,内核态调试门槛高。选型是"成熟通用治理 vs 内核态高性能"的权衡。
游戏里的帧内多跳低延迟通信,能直接套用 Istio/Cilium 这类 Mesh 吗?
参考答案
不合适。通用 Mesh 面向微服务东西向治理/可观测,非为游戏帧内同机高频通信设计。同机高频应走消息总线共享内存,自研游戏网格更倾向去中心化 + 降连接数,Mesh 不替代 IPC。
istiod 挂了以后集群会不会立刻断网?分层说清"什么继续能用、什么先坏、什么最后坏"。
参考答案
不会立刻断,但会进入配置冻结 + 证书轮换倒计时。三层递进:① 已建 mTLS 连接继续转发——Envoy 内存里有 xDS 配置,istiod 稳态下不在数据面 hot path;② 新 Pod 起不来——sidecar-injector webhook 内置在 istiod 里,webhook 不可达则 admission 失败;已存在 Pod 的新连接仍走 Envoy 缓存路由;③ 证书到期后 mTLS 握手失败——Envoy 通过 SDS 从 istiod 拉证书,istiod 挂 → 证书 TTL 到期 → 东西向断。结论:istiod 是集群级 SPOF,但数据面在稳态下自成一体。
Istio 从 1.0 多进程走到 1.5 istiod 再到 1.18+ Ambient,每一步"数据面/控制面"各自变了什么?
参考答案
1.0/1.4:Pilot/Citadel/Galley/Mixer 4 个进程分别 Deployment;数据面 Envoy sidecar,每次调用同步过 Mixer 做 telemetry/policy check(性能瓶颈)。1.5 istiod:4 合 1 为单进程;Mixer 下沉到 Envoy WASM / telemetry v2,请求不再同步过 Mixer;数据面仍是 sidecar。1.18+ Ambient:Ztunnel per-node(L4+mTLS) + waypoint 按需(L7) 取代 sidecar,从 "每 Pod 一份 Envoy" 变为 "每节点一份 Ztunnel + 按需 waypoint";驱动力是资源放大 + 运维耦合两大痛点。Cilium 也在朝同样的"节点级 L4 + 按需 L7"方向收敛。
Cilium Agent 和 Cilium Operator 各自挂了会怎样?和 istiod 挂了的影响面对比一下。
参考答案
Cilium Agent(DaemonSet 每节点一个):挂了是节点级 SPOF——已建连接不断(eBPF 程序驻留内核)、该节点新 Pod 起不来(CNI ADD 停摆)、NetworkPolicy 变更不生效、identity 分配失败。Cilium Operator(集群级 Deployment):弱依赖——短时挂 OK,长时间会 IPAM 池耗尽、identity 分配失败、CRD 状态未更新。对比 istiod:istiod 是集群级 SPOF(新 Pod 起不来 + 配置冻结 + 证书轮换倒计时);Cilium 把 SPOF 分成节点级(Agent) + 集群级弱依赖(Operator),粒度更细。三家共通:控制面挂 ≠ 数据面断(Envoy 内存 / 内核 eBPF 在稳态下都不依赖控制面存活)。