《零入门kubernetes网络实战》视频专栏地址
https://www.ixigua.com/7193641905282875942
本篇文章视频地址(稍后上传)
本文主要使用的技术是
nat技术+Linux虚拟网桥+虚拟网络设备veth pair来实现跨主机网桥的通信
1、测试环境介绍 |
两台centos虚拟机
# 查看操作系统版本
cat /etc/centos-release
# 内核版本
uname -a
uname -r
# 查看网卡信息
ip a s eth0
2、特殊说明 |
本篇方案是行不通的。
主要是想给大家复盘一下,学习的过程。
以及说明为什么不行。
也就是说,
如果跨主机通信的两端 都是内网的话,是不能使用nat技术的。(仅个人观点,仅供参考)
3、网络拓扑 |
4、操作实战 |
4.1、第1步:在master上执行下面的命令 |
brctl addbr br0
ip link set br0 up
ip addr add 10.244.1.3/24 dev br0
ip netns add ns1
ip link add veth1a type veth peer name veth1b
ip link set veth1a netns ns1
ip netns exec ns1 ip addr add 10.244.1.2/24 dev veth1a
ip netns exec ns1 ip link set veth1a up
ip link set veth1b up
brctl addif br0 veth1b
ip netns exec ns1 route add default gw 10.244.1.3
iptables -t nat -A POSTROUTING -s 10.244.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -d 10.211.55.0/24 -i eth0 -p icmp -j DNAT --to 10.244.1.3
echo 1 > /proc/sys/net/ipv4/ip_forward
其中:
iptables -t nat -A POSTROUTING -s 10.244.1.0/24 -o eth0 -j MASQUERADE
是说,对于离开宿主机的数据包,如果源地址是10.244.1.0/24网段,并且通过eth0出去的话,需要做源地址转换;
iptables -t nat -A PREROUTING -d 10.211.55.0/24 -i eth0 -p icmp -j DNAT --to 10.244.1.3
是说,对于进入本宿主机的数据包,如果数据包的目的地址是10.211.55.0/24网段,通过eth0进入,imcp协议的话,
需要做DNAT转换,
重定向到10.244.1.3 IP
4.2、第2步:在slave上执行下面的命令 |
brctl addbr br0
ip link set br0 up
ip addr add 10.244.2.3/24 dev br0
ip netns add ns2
ip link add veth2a type veth peer name veth2b
ip link set veth2a netns ns2
ip netns exec ns2 ip addr add 10.244.2.2/24 dev veth2a
ip netns exec ns2 ip link set veth2a up
ip link set veth2b up
brctl addif br0 veth2b
ip netns exec ns2 route add default gw 10.244.2.3
iptables -t nat -A POSTROUTING -s 10.244.2.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -d 10.211.55.0/24 -i eth0 -p icmp -j DNAT --to 10.244.2.3
echo 1 > /proc/sys/net/ipv4/ip_forward
4.3、第3步:为了验证测试,提前在slave上添加日志埋点 |
4.3.1、安装rsyslog服务 |
yum -y install rsyslog
4.3.2、更新配置文件 |
echo "kern.* /var/log/iptables.log" >> /etc/rsyslog.conf
.*,表示所有等级的消息都添加到iptables.log文件里
信息等级的指定方式
- .XXX,表示 大于XXX级别的信息
- .=XXX,表示等于XXX级别的信息
- 如,kern.=notice /var/log/iptables.log, 将notice以上的信息添加到iptables.log里
- .!XXX, 表示在XXX之外的等级信息
4.3.3、重启rsyslog服务 |
systemctl restart rsyslog
systemctl status rsyslog
4.3.4、添加日志埋点 |
iptables -t nat -I PREROUTING -p imcp -j LOG
4.4、第3步:测试 |
4.4.1、在master节点上发起ping请求 |
ip netns exec ns1 ping 10.244.2.2
4.4.2、对slave节点上的eth0抓包 |
tcpdump -nn -i eth0 icmp
4.4.3、查看一下日子埋点 |
5、总结 |
跨主机通信时,如果两侧都是内部网络通信的话,使用
nat技术是不行的。
因为,当目的服务器的对外网卡接收到数据包后,发现数据包的目的地址并非是本网卡的,而是内部地址的。
但是,网卡直接就给丢弃了。
同网段的其他服务器也可以接收到数据包的。
因此,如果希望跨主机两侧的内部网络能够互相通信的话,
需要对目的IP进行修改,即二次封装。
比方说vxlan技术。
当然,也有其他方案。
如,直接路由方案。
<<零入门kubernetes网络实战>>技术专栏之文章目录