- Q 可能特定于 AWS EKS CNI/AWS EC2/AWS VPC 网络
- Q 可能特定于 Docker 网络
我们有一个运行着 WorkerNode 的 AWS Elastic Kubernetes 集群。在这个 WorkerNode 上,我们运行着一个 Pod,10.22.55.231
该 Pod 分配有一个 IP,它是这个 WorkerNode 所在的 AWS VPC 的一部分。
我想知道数据包如何通过 Linux 网络命名空间和接口到达这个 Pod。
所以:
- 当我向 AWS LoadBlancer 发出请求时,它会向 EC2 的 TCP 端口(假设接口上的端口号为 30100)发送一个数据
eth0
包 ipfilter
EC2 上的主机将捕获此数据包,并将其发送到iptables
主机的表和链上- 它会到达
nat
桌子和PREPOUTING
链条,然后被链条KUBE-SERVICES
捕获 - 将到达
KUBE-NODEPORTS
链条并被发送到KUBE-SEP-xxx
链条 KUBE-SEP-xxx
将客户端的数据包发送到该10.22.55.231
IP,即 AWS EC2 的辅助私有 IPv4 地址
在WorkerNode/EC2上,其路由10.22.55.231
将被发送到enif8b7efe9956
接口:
[root@ip-10-22-50-163 ec2-user]# route -n | grep 10.22.55.231
10.22.55.231 0.0.0.0 255.255.255.255 UH 0 0 0 enif8b7efe9956
这是veth
来自 ID 为 6 的命名空间的接口:
12: enif8b7efe9956@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc noqueue state UP mode DEFAULT group default
link/ether 5a:ba:fe:22:92:aa brd ff:ff:ff:ff:ff:ff link-netnsid 6
从我记得和谷歌搜索到的所有内容来看,它enia742601a852@if3
名字的第二部分,如果3,指定其第二个对等体,当流量到达时,会发送到该对等体enia742601a852
。
但是如果我检查@if3
界面的话 - 它是eth1
:
[root@ip-10-22-50-163 ec2-user]# ip a s eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 0a:39:42:17:73:4c brd ff:ff:ff:ff:ff:ff
inet 10.22.62.78/20 brd 10.22.63.255 scope global eth1
为什么会这样?这将如何工作?数据包将再次通过iptables
'nat
和PREROUTING
?它必须通过一些 Docker 接口发送,不是吗?
link-netnsid 6
由我们的 Kubernetes Pod/Docker 容器使用,并且 IP映射10.22.55.231
到此命名空间:
[root@ip-10-22-50-163 ec2-user]# nsenter -t 7114 -n ip a s
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
3: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc noqueue state UP group default
link/ether 32:62:fe:9e:7a:b5 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.22.55.231/32 scope global eth0
valid_lft forever preferred_lft forever
彻底迷失在这里了。