信息收集
服务A:
[root@r130 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:56:de:30 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.181.130/24 brd 192.168.181.255 scope global dynamic noprefixroute ens160
valid_lft 1057sec preferred_lft 1057sec
inet6 fe80::20c:29ff:fe56:de30/64 scope link noprefixroute
valid_lft forever preferred_lft forever
服务器B:
[root@r131 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:7b:48:72 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.181.131/24 brd 192.168.181.255 scope global dynamic noprefixroute ens160
valid_lft 927sec preferred_lft 927sec
inet6 fe80::20c:29ff:fe7b:4872/64 scope link noprefixroute
valid_lft forever preferred_lft forever
基础配置
# ipv4转发是必须的
sysctl -w net.ipv4.ip_forward=1
# 不是必须的,执行下避免引起不必要的问题
sysctl -w net.ipv4.conf.all.rp_filter=0
setenforce 0
在服务器A上模拟同服务器pod通信
服务器A,创建网桥:
# 创建一个Linux Bridge,命名为cni0
sudo ip link add cni0 type bridge
sudo ip link set cni0 up
# 为桥分配一个IP地址(模拟CNI的网段)
sudo ip addr add 10.244.1.1/24 dev cni0
服务器A,创建pod1:
# 创建veth pair,一端连接Pod,一端连接桥
sudo ip link add veth-pod1 type veth peer name veth-br1
# 将veth-br1连接到cni0
sudo ip link set veth-br1 master cni0
sudo ip link set veth-br1 up
# 创建一个网络命名空间,模拟Pod
sudo ip netns add pod1
# 将veth-pod1放入Pod的网络命名空间
sudo ip link set veth-pod1 netns pod1
# 在Pod命名空间中配置veth-pod1
sudo ip netns exec pod1 ip link set veth-pod1 up
sudo ip netns exec pod1 ip addr add 10.244.1.2/24 dev veth-pod1
# 设置默认路由
sudo ip netns exec pod1 ip route add default via 10.244.1.1
服务器A, 创建pod2:
sudo ip link add veth-pod2 type veth peer name veth-br2
sudo ip link set veth-br2 master cni0
sudo ip link set veth-br2 up
sudo ip netns add pod2
sudo ip link set veth-pod2 netns pod2
sudo ip netns exec pod2 ip link set veth-pod2 up
sudo ip netns exec pod2 ip addr add 10.244.1.3/24 dev veth-pod2
sudo ip netns exec pod2 ip route add default via 10.244.1.1
通信测试:
# pod1 ping pod2
sudo ip netns exec pod1 ping 10.244.1.3 -c 6
# pod2 ping pod1
sudo ip netns exec pod2 ping 10.244.1.2 -c 6
模拟pod跨服务器通信
服务器B,创建网桥:
sudo ip link add cni0 type bridge
sudo ip link set cni0 up
sudo ip addr add 10.244.2.1/24 dev cni0
服务器B, 创建pod1:
sudo ip link add veth-pod1 type veth peer name veth-br1
sudo ip link set veth-br1 master cni0
sudo ip link set veth-br1 up
sudo ip netns add pod1
sudo ip link set veth-pod1 netns pod1
sudo ip netns exec pod1 ip link set veth-pod1 up
sudo ip netns exec pod1 ip addr add 10.244.2.2/24 dev veth-pod1
sudo ip netns exec pod1 ip route add default via 10.244.2.1
sudo ip netns exec pod1 ip link set lo up
服务器A,配置vxlan:
sudo ip link add flannel.1 type vxlan id 1 local 192.168.181.130 dstport 4789 dev ens160
# flannel.1 绑定到网桥 cni0
sudo ip link set flannel.1 master cni0
# 配置vxlan ip
sudo ip addr add 10.244.1.0/24 dev flannel.1
sudo ip link set flannel.1 up
服务器B,配置vxlan:
sudo ip link add flannel.1 type vxlan id 1 local 192.168.181.131 dstport 4789 dev ens160
sudo ip link set flannel.1 master cni0
sudo ip addr add 10.244.2.0/24 dev flannel.1
sudo ip link set flannel.1 up
服务器A,配置路由与ARP:
# pod1 路由
sudo ip netns exec pod1 ip route add 10.244.2.0/24 via 10.244.1.1 dev veth-pod1
# pod2 路由
sudo ip netns exec pod2 ip route add 10.244.2.0/24 via 10.244.1.1 dev veth-pod2
# 主机路由
sudo ip route add 10.244.2.0/24 via 10.244.2.0 dev flannel.1 onlink
# 添加为服务器B上vxlan设备flannel.1的ip和mac地址到 arp (10.244.2.0 36:72:3b:07:a8:21 为服务器B上vxlan设备flannel.1的ip和mac地址)。告诉 flannel.1, 10.244.2.0 的 mac 地址是 36:72:3b:07:a8:21
# 有多个节点的话,都要添加。
sudo ip neigh add 10.244.2.0 lladdr 36:72:3b:07:a8:21 dev flannel.1 nud permanent
# 配置 bridge fdb,告诉 flannel.1 到 36:72:3b:07:a8:21 的走 192.168.181.131
# 有多个节点的话,要加多条。
sudo bridge fdb append to 36:72:3b:07:a8:21 dst 192.168.181.131 dev flannel.1
服务器B,配置路由与ARP:
sudo ip netns exec pod1 ip route add 10.244.1.0/24 via 10.244.2.1 dev veth-pod1
sudo ip route add 10.244.1.0/24 via 10.244.1.0 dev flannel.1 onlink
sudo ip neigh add 10.244.1.0 lladdr 4a:ec:4b:9a:6c:07 dev flannel.1 nud permanent
sudo bridge fdb append to 4a:ec:4b:9a:6c:07 dst 192.168.181.130 dev flannel.1
服务器A,通信测试,服务器A-pod1 -> 服务器B-pod1
sudo ip netns exec pod1 ping 10.244.2.2
服务器B,通信测试,服务器B-pod1 -> 服务器A-pod1
sudo ip netns exec pod1 ping 10.244.1.2
清理
ip link del flannel.1
ip netns del pod1
ip netns del pod2