一般来讲,生产环境必须提供7×24小时的网络传输服务。借助于网卡绑定技术,不仅可以提高网络传输速度,更重要的是,还可以确保在其中一块网卡出现故障时,依然可以正常提供网络服务。假设我们对两块网卡实施了绑定技术,这样在正常工作中它们会共同传输数据,使得网络传输的速度变得更快;而且即使有一块网卡突然出现了故障,另外一块网卡便会立即自动顶替上去,保证数据传输不会中断。
下面我们来看一下如何绑定网卡。
第1步:在虚拟机系统中再添加一块网卡设备,请确保两块网卡都处在同一个网络连接中(即网卡模式相同),如图9-10和图9-11所示。处于相同模式的网卡设备才可以进行网卡绑定,否则这两块网卡无法互相传送数据。
图9-10 在虚拟机中再添加一块网卡设备
图9-11 确保两块网卡处在同一个网络连接中(即网卡模式相同)
第2步:使用Vim文本编辑器来配置网卡设备的绑定参数。网卡绑定的理论知识类似于前面学习的RAID硬盘组,我们需要对参与绑定的网卡设备逐个进行“初始设置”。需要注意的是,这些原本独立的网卡设备此时需要被配置成为一块“从属”网卡,服务于“主”网卡,不应该再有自己的IP地址等信息。在进行了初始设置之后,它们就可以支持网卡绑定。
[root@linuxprobe ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno16777736
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=eno16777736
MASTER=bond0
SLAVE=yes
[root@linuxprobe ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno33554968
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=eno33554968
MASTER=bond0
SLAVE=yes
还需要将绑定后的设备命名为bond0并把IP地址等信息填写进去,这样当用户访问相应服务的时候,实际上就是由这两块网卡设备在共同提供服务。
[root@linuxprobe ~]# vim /etc/sysconfig/network-scripts/ifcfg-bond0
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=bond0
IPADDR=192.168.10.10
PREFIX=24
DNS=192.168.10.1
NM_CONTROLLED=no
第3步:让Linux内核支持网卡绑定驱动。常见的网卡绑定驱动有三种模式—mode0、mode1和mode6。下面以绑定两块网卡为例,讲解使用的情景。
mode0(平衡负载模式):平时两块网卡均工作,且自动备援,但需要在与服务器本地网卡相连的交换机设备上进行端口聚合来支持绑定技术。
mode1(自动备援模式):平时只有一块网卡工作,在它故障后自动替换为另外的网卡。
mode6(平衡负载模式):平时两块网卡均工作,且自动备援,无须交换机设备提供辅助支持。
比如有一台用于提供NFS或者samba服务的文件服务器,它所能提供的最大网络传输速度为100Mbit/s,但是访问该服务器的用户数量特别多,那么它的访问压力一定很大。在生产环境中,网络的可靠性是极为重要的,而且网络的传输速度也必须得以保证。针对这样的情况,比较好的选择就是mode6网卡绑定驱动模式了。因为mode6能够让两块网卡同时一起工作,当其中一块网卡出现故障后能自动备援,且无需交换机设备支援,从而提供了可靠的网络传输保障。
下面使用Vim文本编辑器创建一个用于网卡绑定的驱动文件,使得绑定后的bond0网卡设备能够支持绑定技术(bonding);同时定义网卡以mode6模式进行绑定,且出现故障时自动切换的时间为100毫秒。
[root@linuxprobe ~]# vim /etc/modprobe.d/bond.conf
alias bond0 bonding
options bond0 miimon=100 mode=6
第4步:重启网络服务后网卡绑定操作即可成功。正常情况下只有bond0网卡设备才会有IP地址等信息:
[root@linuxprobe ~]# systemctl restart network
[root@linuxprobe ~]# ifconfig
bond0: flags=5187<UP,BROADCAST,RUNNING,MASTER,MULTICAST> mtu 1500
inet 192.168.10.10 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::20c:29ff:fe9c:637d prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:9c:63:7d txqueuelen 0 (Ethernet)
RX packets 700 bytes 82899 (80.9 KiB)
RX errors 0 dropped 6 overruns 0 frame 0
TX packets 588 bytes 40260 (39.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eno16777736: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST> mtu 1500
ether 00:0c:29:9c:63:73 txqueuelen 1000 (Ethernet)
RX packets 347 bytes 40112 (39.1 KiB)
RX errors 0 dropped 6 overruns 0 frame 0
TX packets 263 bytes 20682 (20.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eno33554968: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST> mtu 1500
ether 00:0c:29:9c:63:7d txqueuelen 1000 (Ethernet)
RX packets 353 bytes 42787 (41.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 325 bytes 19578 (19.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
可以在本地主机执行ping 192.168.10.10命令检查网络的连通性。为了检验网卡绑定技术的自动备援功能,我们突然在虚拟机硬件配置中随机移除一块网卡设备,可以非常清晰地看到网卡切换的过程(一般只有1个数据丢包)。然后另外一块网卡会继续为用户提供服务。
[root@linuxprobe ~]# ping 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.109 ms
64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.102 ms
64 bytes from 192.168.10.10: icmp_seq=3 ttl=64 time=0.066 ms
ping: sendmsg: Network is unreachable
64 bytes from 192.168.10.10: icmp_seq=5 ttl=64 time=0.065 ms
64 bytes from 192.168.10.10: icmp_seq=6 ttl=64 time=0.048 ms
64 bytes from 192.168.10.10: icmp_seq=7 ttl=64 time=0.042 ms
64 bytes from 192.168.10.10: icmp_seq=8 ttl=64 time=0.079 ms
^C
--- 192.168.10.10 ping statistics ---
8 packets transmitted, 7 received, 12% packet loss, time 7006ms
rtt min/avg/max/mdev = 0.042/0.073/0.109/0.023 ms
出现问题?大胆提问!
因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~
Linux技术交流请加A群:560843(满),B群:340829(推荐),C群:463590(推荐),点此查看全国群。
*本群特色:通过口令验证确保每一个群员都是《Linux就该这么学》的读者,答疑更有针对性,不定期免费领取定制礼品。
Ubuntu 系列安装 Docker通过系统自带包安装Ubuntu 14.04 版本系统中已经自带了 Docker 包,可以直接安装。$ sudo apt-get update...
在之前的介绍中,我们知道镜像是 Docker 的三大组件之一。Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docke...
最初,Docker 采用了 LXC 中的容器格式。自 1.20 版本开始,Docker 也开始支持新的 libcontainer 格式,并作为默认选项。对更多...
CoreOS的设计是为你提供能够像谷歌一样的大型互联网公司一样的基础设施管理能力来动态扩展和管理的计算能力。CoreOS的安装文件和...
kubectl版本和集群之间的差异必须在一个小版本号之内。例如:v1.23版本的客户端能与v1.22、v1.23和v1.24版本的控制面通信。用最...
利用kubeadm创建高可用集群本文讲述了使用kubeadm设置一个高可用的Kubernetes集群的两种不同方式:使用具有堆叠的控制平面节点。...
改变默认StorageClass本文展示了如何改变默认的StorageClass,它用于为没有特殊需求的PersistentVolumeClaims配置volumes。在开...
创建WindowsHostProcessPodFEATURESTATE:Kubernetesv1.23[beta]WindowsHostProcess容器让你能够在Windows主机上运行容器化负载。...
使用指令式命令管理 Kubernetes 对象使用构建在kubectl命令行工具中的指令式命令可以直接快速创建、更新和删除 Kubernetes 对象...
为容器设置启动时要执行的命令和参数本页将展示如何为Pod中容器设置启动时要执行的命令及其参数。在开始之前你必须拥有一个Kuber...