K8s混合集群Windows节点多网卡场景下强制Flannel使用指定网卡的问题求助
我来帮你分析下这个问题,你遇到的是多网卡场景下Windows节点上Flannel自动选了错误网卡的典型问题,咱们一步步来排查解决:
问题核心原因
Windows节点上的Flannel默认会绑定系统默认路由对应的网卡(也就是你那根带互联网的10.65.11.0/24网卡),而不是你用于集群通信的192.168.100.0/24网卡,这就导致跨节点Pod无法互通。修改网卡名称后出现的JSON解析错误,大概率是因为你指定的网卡名称不准确,导致WINS CLI无法获取到有效网络信息,返回空内容引发解析失败。
具体解决步骤
1. 确认Windows节点上的目标网卡信息
先登录Windows节点(SRV2),打开PowerShell执行以下命令,找到192.168.100.x对应的网卡准确名称:
Get-NetAdapter
你会看到类似这样的输出,重点关注Name列和IPAddress列的对应关系,比如目标网卡名称可能是Ethernet 2或者ClusterNIC这类:
Name InterfaceDescription ifIndex Status MacAddress LinkSpeed ---- -------------------- ------- ------ ---------- --------- Ethernet Intel(R) Ethernet Connection I219-LM 12 Up AA-BB-CC-DD-EE-FF 1 Gbps ClusterNIC Intel(R) Ethernet Adapter X710 for 10G... 15 Up GG-HH-II-JJ-KK-LL 10 Gbps
一定要记下这个准确的网卡名称,如果名称带空格,后面配置时要加引号。
2. 修改Flannel配置,强制指定网卡
你之前只修改了YAML里的一处网卡名称,但这不够,需要在Flannel的启动参数或者ConfigMap里明确指定网卡:
方法一:修改Windows节点的Flannel DaemonSet
编辑DaemonSet配置:kubectl edit daemonset kube-flannel-ds-windows-amd64 -n kube-system找到
containers下的args字段,添加--iface=你的目标网卡名称(比如--iface=ClusterNIC),如果网卡名称带空格,就写成--iface="Ethernet 2"。方法二:修改Flannel全局ConfigMap
编辑kube-flannel的ConfigMap:kubectl edit configmap kube-flannel-cfg -n kube-system在
net-conf.json里添加"Interface": "你的目标网卡名称",修改后的内容大概是:{ "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan", "Interface": "ClusterNIC" } }这种方式更推荐,因为配置是全局生效的。
3. 重启Flannel Pod并验证
删除原来的故障Flannel Pod,让DaemonSet重新创建一个新Pod:
kubectl delete pod -n kube-system kube-flannel-ds-windows-amd64-qt895
然后查看新Pod的日志,确认没有JSON解析错误:
kubectl logs -n kube-system <新创建的Pod名称>
最后测试跨节点Pod通信:比如在Linux控制平面启动一个busybox Pod,ping Windows节点上的Pod IP,或者反过来,验证网络是否正常。
额外注意事项
- 如果用网卡名称还是有问题,可以尝试直接指定网卡的IP地址,比如
--iface=192.168.100.1,这样能避免名称识别错误的问题。 - 确保Windows节点上的192.168.100.0/24网卡没有被防火墙或者其他网络策略限制,能和Linux控制平面的192.168.100.11正常通信。
- 确认你使用的Flannel版本和K8s v1.23.2兼容,sig-windows-tools里的配置文件通常适配对应K8s版本,但如果有兼容性问题,也可能引发异常。
备注:内容来源于stack exchange,提问作者misha

