跳到主要内容

为什么 Native Routing 模式要加 local-router-ipv4 配置?

背景

在 TKE 集群安装 cilium 时,如果选择 Native Routing (VPC-CNI),必须显式给 cilium 配置一个 local-router-ipv4 参数:

--set extraConfig.local-router-ipv4=169.254.32.16

Overlay 模式则不需要这个配置。本文解释这个差异背后的原因,以及为什么我们选择 169.254.32.16 这个具体地址。

cilium_host 网卡的作用

cilium 在每台节点上都会创建一对虚拟网卡:

  • cilium_host:节点上的"网关"接口,作为本节点上所有 Pod 的下一跳。
  • cilium_net:与 cilium_host 配对的 veth peer。

cilium_host 必须有一个 IP 地址,否则节点内的路由会缺一个"出口"。

┌──────────────────────────────────────┐
│ Node │
│ │
│ ┌──────────┐ ┌────────────┐ │
│ │ Pod │─────▶│ cilium_host│──▶│ 外发
│ │ (lxcXX) │ │ (gateway) │ │
│ └──────────┘ └────────────┘ │
└──────────────────────────────────────┘

Native Routing (VPC-CNI) 的特殊情况

Native Routing (VPC-CNI) 模式下,cilium 不负责 Pod IP 分配:Pod 直接挂在弹性网卡上,IP 由 VPC-CNI 从 VPC 子网中分配,cilium 完全没有 Pod IP 来源信息。

由于 cilium 不掌握 IP 分配权,它无法自动决定 cilium_host 用什么 IP,因此必须由用户通过 local-router-ipv4 显式指定一个"绝对不会与 Pod IP 冲突"的地址。

为什么是 169.254.32.16?

169.254.0.0/16 是 IPv4 link-local 地址段(RFC 3927),有以下特点:

  1. 不可路由:永远不会和 VPC IP 或 Service CIDR 冲突。
  2. 跨节点统一:所有节点都可以用同一个值,配置和排障更简单。
  3. TKE 特定预留169.254.32.16 这个具体地址在 TKE 上不会被其它组件占用,是经过验证的安全值。
TKE 上 169.254 段的其它用途

TKE 在 169.254.0.0/16 段还承载了以下能力,配置时要注意不要冲突:

  • 元数据服务(IMDS)
  • apiserver 的内部 VIP(kubectl get ep kubernetes 看到的地址)
  • COS / 镜像仓库 / 部分内部服务的 VIP

169.254.32.16 是已确认与上述服务不冲突的地址。

Overlay 模式为什么不需要

Overlay 模式下,cilium 自己管理 Pod IP 分配(cluster-pool IPAM),它知道节点 PodCIDR 的所有信息,会自动为 cilium_host 从 PodCIDR 中分配一个不冲突的 IP,无需用户介入。

总结

模式local-router-ipv4原因
Native Routing (VPC-CNI)✅ 必须显式配置cilium 不掌握 Pod IP 分配权
Overlay (VPC-CNI / GR)❌ 自动分配cilium 自己管理 IPAM

GR 集群仅支持 Overlay 模式,详见 为什么不提供 GR Native Routing 部署方案?

相关链接