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;