网站首页 文章专栏 10多网卡环境安装.md
10多网卡环境安装.md
创建于:2021-07-04 07:50:24 更新于:2024-05-03 22:41:17 羽瀚尘 341

多张网卡的困境

如果node上有多张网卡,不管是真是网卡还是虚拟网卡,都会造成k8s通信异常。而虚拟网卡常常用来连接多个异地计算设备,所以实现多网卡的k8s通信有助于实现异地k8s集群。

会造成两个已知的问题:

  1. master节点运行kubectl exec访问slave节点的container失败,因为master无法访问node ip
  2. 一个节点只能ping通本节点的pods,无法ping通其他节点的pods

下图是一个通信失败的案例,onlyoffice pod被调度到了wenfeng-z470机器上,但是该机器是通过n2n虚拟局域网加入集群的。k8s master节点显示其ip地址为192.168.20.235

8e3bdfec80a92605fadf841cce8dbf4a

可以在node上手动sudo route add default gw 192.168.195.2的方法指定默认路由,同时在master节点上也会自动修改为对应的网卡ip地址。但问题在于,如果该网卡没有连接外网(指定为gw之后不能联网),会无法访问该节点。

在每个节点上修改kubelete的启动参数:

sudo vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

修改如下:

[Service] 
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.="yaml""
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --cloud-provider=vsphere --cloud-config=/etc/vsphereconf/vsphere.conf --node-ip 172.16.253.201

即添加一个--node-ip

然后重启kubelete

sudo systemctl daemon-reload && sudo systemctl restart kubelet

在master节点上可看到所有node的ip已经更改。

但这样依旧无法ping通不同node上的pod,从而造成通信问题。即使使用了openvpn,设置所有流量经过openVPNserver,依旧无法解决

使用openvpn的解决方案

查看flannel绑定的网卡

这篇文章启发,问题可能出现在flannel绑定的网卡上。

ip -d link show

41: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default 
    link/ether 3a:87:3f:d5:35:c5 brd ff:ff:ff:ff:ff:ff promiscuity 0 
    vxlan id 1 local 192.168.255.6 dev tun0 srcport 0 0 dstport 8472 nolearning ageing 300 udpcsum addrgenmode none

vxlan id 1 local 192.168.255.6 dev tun0表明flannel和tun0绑定在一起。如果不是你希望的结果,那么需要修改flannel的启动参数

修改flannel的配置文件

在第二章安装网络插件一节中介绍了获取和修改flannel配置文件的方法,现在继续修改该文件。

找到如下yaml片段,将args增加--iface参数,设置为你需要的网卡名即可

containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.10.0-amd64
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        - --iface=tun0

如果是新建的集群,直接启动;否则kubectl delete -f kube-flannel.yamlkubectl apply -f kube-flannel.yaml,该操作会重启所有节点的flannel插件。请确保所有的节点都有tun0网卡(未尝试过不同名的openvpn网卡,但应该不行)

此后就可以ping通不同节点的pods。

参考