结论:不是 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 节点才会被跳过。