metalLB: node.kubernetes.io/exclude-from-external-load-balancers 是什么时候添加的

3 阅读1分钟

结论:不是 kubespray 添加的,是 Kubernetes 自身行为。

整个 kubespray 代码库中除了我们刚写的 e2e-metallb,没有任何地方设置过这个标签。

这是 kubeadm 默认行为:kubeadm 在初始化集群时会自动给 control plane 节点打上 node.kubernetes.io/exclude-from-external-load-balancers 标签。这是 Kubernetes 上游的设计意图——防止外部 LB 流量到达 master 节点。

具体来源:

  • Kubernetes ≥ 1.24:kubeadm 自动为所有 kube_control_plane 节点添加该标签
  • 目的:将 control plane 节点排除在 Service type=LoadBalancer 的后端之外

所以你测试环境如果所有节点都是 control plane(比如 all-in-one 或没有独立 worker 节点),就会出现你遇到的"no available nodes"问题——因为全部节点都被排除了。

如果集群有独立的 worker 节点,这个标签通常不会造成问题,只有 master 节点才会被跳过。