Kubernetes中Pod間的通信
本系列文章共3篇:
- 【Kubernetes Pod間通信-第1篇】在單個子網中使用underlay網絡實現Pod到Pod的通信
- 【Kubernetes Pod間通信-第2篇】使用BGP實現Pod到Pod的通信(本文介紹)
- 【Kubernetes Pod間通信-第3篇】Kubernetes中Pod與ClusterIP服務之間的通信
簡介
在本系列文章的第1、2篇,我們將了解在使用Calico作為容器網絡接口(CNI)時,Kubernetes中Pod間的通信在不同場景下是如何路由的。
在本系列文章的第3篇,我們將探討在集群中Pod與服務之間的通信是如何管理的。
為此,我們將使用TCPDUMP、Wireshark以及如traceroute這樣的Linux命令來觀察數據包。在第一部分,我們將查看位于同一子網內不同節點上的兩個容器/Pod之間的流量。在第二部分,我們將使用由路由器分隔且使用BGP的不同子網中的節點,包括使用和不使用虛擬可擴展局域網(VXLAN)的情況。
本部分研究兩種通信場景:
- 場景4:不使用VXLAN的BGP
- 場景5:使用BGP和VXLAN進行隧道傳輸
場景4:不使用VXLAN的BGP
我們在之前的場景中了解到,Pod之間的流量無需網絡地址轉換(NAT)即可直接路由。因此,即使這個新場景更為復雜,但并沒有太大差異,依舊是路由,而源地址和目的地址保持不變。
- 重新配置kubeadm2
由于在這個新場景中,kubeadm2將與kubeadm1不在同一子網,首先要將其從集群中移除,然后更改其IP地址和網關。此時,kubeadm2無法訪問kubeadm1,因為這兩個節點之間的路由無效。
kubectl delete node kubeadm2
# 在kubeadm2上執行
sudo kubeadm reset
- 創建骨干網絡
我們在集群節點之間添加了兩個路由器。BGP(邊界網關協議)將用于Pod之間的流量路由。Calico中包含了Bird,我們在路由器上也安裝了相同的Bird軟件。請注意,我們也可以使用不同的軟件,甚至是一些物理路由器。
- router1配置
以下是基于Ubuntu 24.04 LTS的網絡和Bird的配置文件:
# /etc/netplan/50-cloud-init.yaml
network:ethernets:lo: addresses:- 10.0.0.1/32 # 我們將用它作為路由器IDens33: # 此接口用于連接互聯網,你的可能不同addresses:- 192.168.8.10/24routes:- to: defaultvia: 192.168.8.2nameservers:addresses:- 8.8.8.8- 0.0.0.0ens37: # 此接口用于連接本地節點addresses:- 192.168.16.1/24ens38: # 此接口用于連接另一側的節點addresses:- 192.168.18.1/24version: 2
# /etc/bird/bird.conf
log syslog all;
router id 10.0.0.1; # 環回地址
protocol device {
}
protocol direct {interface "lo", "ens37", "ens38";
}
protocol kernel {export all;
}
protocol static {
}
protocol bgp router2 {local 192.168.18.1 as 64513;neighbor 192.168.18.2 as 64513;next hop self;import all;export all;
}
protocol bgp kubeadm1 {local 192.168.16.1 as 64513;neighbor 192.168.16.101 as 64512;import all;