手动模拟 CNI 网络中 host-gw 模式互通
在Kubernetes
中,CNI
的作用就是让两台Node
节点之间的Pod
能够互相通信,其中有封包的方式,也有路由转发的方式,host-gw
就是路由转发的方式。
host-gw 模式介绍
host-gw
模式是Kubernetes
中一种常见的CNI
模式,用于容器网络的实现。host-gw
是host gateway
的缩写,意味着通过主机的网络表routing table
来实现容器间的通信。
在host-gw
模式中,每个节点上的容器都被分配一个唯一的IP
地址,并且这些IP
地址是主机网络的一部分。当容器之间进行通信时,数据包直接通过主机的网络层进行转发,而不需要经过额外的网络封装或overlay
网络。这使得host-gw
模式相对简单且性能较好。
以下是host-gw
模式的主要特点和工作原理:
IP 地址分配: 每个容器被分配一个主机网络中的唯一
IP
地址。这些IP
地址在主机网络中是直接可达的。主机路由表: 容器的
IP
地址被添加到主机的路由表中,以确保主机能够正确地路由到容器。容器间通信: 容器之间的通信直接通过主机的网络层进行,无需经过
overlay
网络或其他封装。这降低了网络的复杂性,并提高了性能。局限性: 由于容器共享主机网络,因此在网络隔离方面存在一些局限性。这意味着容器可以直接访问主机上运行的服务,但同时也需要谨慎处理网络安全性。
在Kubernetes
中,可以通过选择合适的CNI
插件以及配置host-gw
模式来实现主机网络的容器通信。host-gw
模式通常适用于要求较为简单、性能较高,且容器之间不需要强制隔离的场景。
手动实现案例
环境准备:
Node1: 192.168.209.203 Node2: 192.168.209.145
需求:
需要在两个节点都创建命名空间并设置IP,使两个不同节点命名空间互通
Node1 节点操作
配置linux
内核转发
sysctl -w net.ipv4.ip_forward=1
创建网桥,在网桥中设置网关,并启动
ip link add br1 type bridge ip addr add 192.168.1.1/24 dev br1 ip link set br1 up
创建命名空间,并创建veth pair
后绑定命名空间
ip netns add ns1 ip link add veth-ns1 type veth peer name veth-br1 ip link set veth-ns1 netns ns1
设置ns1
中veth
设备IP
,并启动
ip netns exec ns1 ip addr add 192.168.1.2/24 dev veth-ns1 ip netns exec ns1 ip link set veth-ns1 up
把veth pair
的另一端绑定到网桥中,并启动
ip link set dev veth-br1 master br1 ip link set veth-br2 up
配置ns1
命名空间下访问Node2
中命名空间的路由
ip netns exec ns1 ip route add 192.168.2.0/24 via 192.168.1.1 dev veth-ns1
配置root
下访问Node2
中命名空间的路由
ip route add 192.168.2.0/24 via 192.168.209.145 dev ens33
Node2 节点操作
配置linux
内核转发
sysctl -w net.ipv4.ip_forward=1
创建网桥,在网桥中设置网关,并启动
ip link add br2 type bridge ip addr add 192.168.2.1/24 dev br2 ip link set br2 up
创建命名空间,并创建veth pair
后绑定命名空间
ip netns add ns2 ip link add veth-ns2 type veth peer name veth-br2 ip link set veth-ns2 netns ns2
设置ns2
中veth
设备IP
,并启动
ip netns exec ns2 ip addr add 192.168.2.2/24 dev veth-ns2 ip netns exec ns2 ip link set veth-ns2 up
把veth pair
的另一端绑定到网桥中,并启动
ip link set dev veth-br2 master br2 ip link set veth-br2 up
配置ns2
命名空间下访问Node1
中命名空间的路由
ip netns exec ns2 ip route add 192.168.1.0/24 via 192.168.2.1 dev veth-ns2
配置root
下访问Node1
中命名空间的路由
ip route add 192.168.1.0/24 via 192.168.209.203 dev ens33
测试
[root@ns1 ~]# ip netns exec ns1 ping 192.168.2.2 PING 192.168.2.2 (192.168.2.2) 56(84) bytes of data. 64 bytes from 192.168.2.2: icmp_seq=1 ttl=62 time=0.415 ms 64 bytes from 192.168.2.2: icmp_seq=2 ttl=62 time=0.380 ms