aws eks 在vpc-cni插件上开启snat功能的测试
创始人
2025-05-28 08:57:43
0

默认情况下每个pod都会分配一个私有ip,vpc中的pod使用这个私有ip直接通信。当pod于不同vpc的cidr块通信时,vpccni插件会将源ip转换为节点主网卡的ip。

由于以上特性

  • 使用vpc peering连接到eks集群vpc的资源无法直接与pod通信
  • 节点没有公有ip,则pod也无法访问公网(需要使用节点ip)

pod的ip为主网卡的辅助ip

(1)pod -> ec2

在ec2(172.31.18.4)上启动nginx,pod在节点上(192.168.22.226),从pod(192.168.20.98)中访问ec2

192.168.22.226 - - [14/Mar/2023:11:36:35 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.74.0" "-"

可见从pod中访问ec2实际上是通过节点的ip访问的

(2)pod -> pod

从pod(192.168.26.75)上访问pod(192.168.20.98)

192.168.26.75 - - [14/Mar/2023:11:42:56 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.74.0" "-" 

可见从pod中访问pod实际上是直接通过私有ip访问的

(3)ec2 -> pod

从ec2(172.31.18.4)上访问pod(192.168.20.98)

172.31.18.4 - - [14/Mar/2023:11:39:07 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.79.1" "-"

ec2上成功收到响应,可见从pod中访问ec2实际上是通过节点的ip访问的

pod的ip为非主网卡的ip

(1)pod -> ec2

在ec2(172.31.18.4)上启动nginx,pod在节点上(192.168.22.226),从pod(192.168.26.75)中访问ec2

192.168.22.226 - - [14/Mar/2023:12:00:21 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.74.0" "-"

可见从pod中访问ec2实际上是通过节点的ip访问的

(2)pod -> pod

从pod(192.168.26.75)上访问非主网卡的pod(192.168.26.159)

192.168.26.75 - - [14/Mar/2023:11:56:22 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.74.0" "-"

可见从pod中访问pod实际上是直接通过私有ip访问的

(3)ec2 -> pod

从ec2(172.31.18.4)上访问pod(192.168.26.159)

172.31.18.4 - - [14/Mar/2023:12:00:59 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.79.1" "-"

ec2上成功收到响应,可见从pod中访问ec2实际上是通过节点的ip访问的

结果没有什么区别,很奇怪的一点,理论上ec2访问非主网卡pod出现发包和回包ip不一致的情况

抓包信息

pod访问ec2,在节点上抓包,实际上是通过主网卡ip通信的

$ sudo tcpdump -n \(host 172.31.18.4 or host 192.168.26.75  \)
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
12:39:43.748042 IP 192.168.22.226.63690 > 172.31.18.4.8090: Flags [S], seq 2531568171, win 62727, options [mss 8961,sackOK,TS val 500176034 ecr 0,nop,wscale 7], length 0
12:39:43.748344 IP 172.31.18.4.8090 > 192.168.22.226.63690: Flags [S.], seq 1461875833, ack 2531568172, win 65160, options [mss 1460,sackOK,TS val 2880838298 ecr 500176034,nop,wscale 7], length 0
12:39:43.748421 IP 192.168.22.226.63690 > 172.31.18.4.8090: Flags [.], ack 1, win 491, options [nop,nop,TS val 500176035 ecr 2880838298], length 0
12:39:43.748463 IP 192.168.22.226.63690 > 172.31.18.4.8090: Flags [P.], seq 1:81, ack 1, win 491, options [nop,nop,TS val 500176035 ecr 2880838298], length 80
12:39:43.748678 IP 172.31.18.4.8090 > 192.168.22.226.63690: Flags [.], ack 81, win 509, options [nop,nop,TS val 2880838298 ecr 500176035], length 0
12:39:43.748869 IP 172.31.18.4.8090 > 192.168.22.226.63690: Flags [P.], seq 1:239, ack 81, win 509, options [nop,nop,TS val 2880838298 ecr 500176035], length 238
12:39:43.748887 IP 192.168.22.226.63690 > 172.31.18.4.8090: Flags [.], ack 239, win 490, options [nop,nop,TS val 500176035 ecr 2880838298], length 0
12:39:43.748909 IP 172.31.18.4.8090 > 192.168.22.226.63690: Flags [P.], seq 239:854, ack 81, win 509, options [nop,nop,TS val 2880838298 ecr 500176035], length 615
12:39:43.748930 IP 192.168.22.226.63690 > 172.31.18.4.8090: Flags [.], ack 854, win 486, options [nop,nop,TS val 500176035 ecr 2880838298], length 0
12:39:43.749081 IP 192.168.22.226.63690 > 172.31.18.4.8090: Flags [F.], seq 81, ack 854, win 486, options [nop,nop,TS val 500176036 ecr 2880838298], length 0
12:39:43.749318 IP 172.31.18.4.8090 > 192.168.22.226.63690: Flags [F.], seq 854, ack 82, win 509, options [nop,nop,TS val 2880838299 ecr 500176036], length 0
12:39:43.749347 IP 192.168.22.226.63690 > 172.31.18.4.8090: Flags [.], ack 855, win 486, options [nop,nop,TS val 500176036 ecr 2880838299], length 0

ec2访问pod,pod直接和ec2通信

sudo tcpdump -n \( host 192.168.26.75 or host 192.168.22.226 \)
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
12:37:53.990117 IP 172.31.18.4.50666 > 192.168.26.75.http: Flags [S], seq 111765395, win 62727, options [mss 8961,sackOK,TS val 1045667994 ecr 0,nop,wscale 7], length 0
12:37:53.990429 IP 192.168.26.75.http > 172.31.18.4.50666: Flags [S.], seq 616787041, ack 111765396, win 62643, options [mss 8961,sackOK,TS val 500066277 ecr 1045667994,nop,wscale 7], length 0
12:37:53.990450 IP 172.31.18.4.50666 > 192.168.26.75.http: Flags [.], ack 1, win 491, options [nop,nop,TS val 1045667994 ecr 500066277], length 0
12:37:53.990486 IP 172.31.18.4.50666 > 192.168.26.75.http: Flags [P.], seq 1:78, ack 1, win 491, options [nop,nop,TS val 1045667994 ecr 500066277], length 77: HTTP: GET / HTTP/1.1
12:37:53.990649 IP 192.168.26.75.http > 172.31.18.4.50666: Flags [.], ack 78, win 489, options [nop,nop,TS val 500066277 ecr 1045667994], length 0
12:37:53.990745 IP 192.168.26.75.http > 172.31.18.4.50666: Flags [P.], seq 1:239, ack 78, win 489, options [nop,nop,TS val 500066277 ecr 1045667994], length 238: HTTP: HTTP/1.1 200 OK
12:37:53.990760 IP 172.31.18.4.50666 > 192.168.26.75.http: Flags [.], ack 239, win 490, options [nop,nop,TS val 1045667994 ecr 500066277], length 0
12:37:53.990784 IP 192.168.26.75.http > 172.31.18.4.50666: Flags [P.], seq 239:854, ack 78, win 489, options [nop,nop,TS val 500066277 ecr 1045667994], length 615: HTTP
12:37:53.990789 IP 172.31.18.4.50666 > 192.168.26.75.http: Flags [.], ack 854, win 486, options [nop,nop,TS val 1045667994 ecr 500066277], length 0
12:37:53.991040 IP 172.31.18.4.50666 > 192.168.26.75.http: Flags [F.], seq 78, ack 854, win 486, options [nop,nop,TS val 1045667995 ecr 500066277], length 0
12:37:53.991210 IP 192.168.26.75.http > 172.31.18.4.50666: Flags [F.], seq 854, ack 79, win 489, options [nop,nop,TS val 500066278 ecr 1045667995], length 0
12:37:53.991221 IP 172.31.18.4.50666 > 192.168.26.75.http: Flags [.], ack 855, win 486, options [nop,nop,TS val 1045667995 ecr 500066278], length 0

关于AWS_VPC_K8S_CNI_EXTERNALSNAT参数

Specifies whether an external NAT gateway should be used to provide SNAT of secondary ENI IP addresses. If set to true, the SNAT iptables rule and off-VPC IP rule are not applied, and these rules are removed if they have already been applied. Disable SNAT if you need to allow inbound communication to your pods from external VPNs, direct connections, and external VPCs, and your pods do not need to access the Internet directly via an Internet Gateway. However, your nodes must be running in a private subnet and connected to the internet through an AWS NAT Gateway or another external NAT device.

开启这个参数

此时pod(192.168.26.75)访问ec2(172.31.18.4),在节点上抓不到包了

sudo tcpdump -n \( host 192.168.26.75 or host 172.31.18.4 \)

在ec2上抓包,此时ip变成了pod的ip

$ sudo tcpdump -n \( host 192.168.26.75 or host 192.168.22.226 \)
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
12:56:00.049250 IP 192.168.26.75.57494 > 172.31.18.4.8090: Flags [S], seq 3156073624, win 62727, options [mss 8961,sackOK,TS val 501152336 ecr 0,nop,wscale 7], length 0
12:56:00.049345 IP 172.31.18.4.8090 > 192.168.26.75.57494: Flags [S.], seq 807675840, ack 3156073625, win 65160, options [mss 1460,sackOK,TS val 2511006629 ecr 501152336,nop,wscale 7], length 0
12:56:00.049558 IP 192.168.26.75.57494 > 172.31.18.4.8090: Flags [.], ack 1, win 491, options [nop,nop,TS val 501152336 ecr 2511006629], length 0
12:56:00.049602 IP 192.168.26.75.57494 > 172.31.18.4.8090: Flags [P.], seq 1:81, ack 1, win 491, options [nop,nop,TS val 501152336 ecr 2511006629], length 80
12:56:00.049617 IP 172.31.18.4.8090 > 192.168.26.75.57494: Flags [.], ack 81, win 509, options [nop,nop,TS val 2511006629 ecr 501152336], length 0
12:56:00.049716 IP 172.31.18.4.8090 > 192.168.26.75.57494: Flags [P.], seq 1:239, ack 81, win 509, options [nop,nop,TS val 2511006629 ecr 501152336], length 238
12:56:00.049758 IP 172.31.18.4.8090 > 192.168.26.75.57494: Flags [P.], seq 239:854, ack 81, win 509, options [nop,nop,TS val 2511006629 ecr 501152336], length 615
12:56:00.049869 IP 192.168.26.75.57494 > 172.31.18.4.8090: Flags [.], ack 239, win 490, options [nop,nop,TS val 501152336 ecr 2511006629], length 0
12:56:00.049904 IP 192.168.26.75.57494 > 172.31.18.4.8090: Flags [.], ack 854, win 486, options [nop,nop,TS val 501152336 ecr 2511006629], length 0
12:56:00.050044 IP 192.168.26.75.57494 > 172.31.18.4.8090: Flags [F.], seq 81, ack 854, win 486, options [nop,nop,TS val 501152336 ecr 2511006629], length 0
12:56:00.050085 IP 172.31.18.4.8090 > 192.168.26.75.57494: Flags [F.], seq 854, ack 82, win 509, options [nop,nop,TS val 2511006630 ecr 501152336], length 0
12:56:00.050243 IP 192.168.26.75.57494 > 172.31.18.4.8090: Flags [.], ack 855, win 486, options [nop,nop,TS val 501152337 ecr 2511006630], length 0

此时由于pod不再使用ec2的ip,因此无法访问公网了,以下命令会卡住

curl cip.cc

查看路由表在AWS_VPC_K8S_CNI_EXTERNALSNAT参数为false时有以下路由,在设置为true后以下iptables规则消失

-A AWS-CONNMARK-CHAIN-0 ! -d 192.168.0.0/16 -m comment --comment "AWS CONNMARK CHAIN, VPC CIDR" -j AWS-CONNMARK-CHAIN-1
-A AWS-CONNMARK-CHAIN-1 -m comment --comment "AWS, CONNMARK" -j CONNMARK --set-xmark 0x80/0x80
-A AWS-SNAT-CHAIN-0 ! -d 192.168.0.0/16 -m comment --comment "AWS SNAT CHAIN" -j AWS-SNAT-CHAIN-1
-A AWS-SNAT-CHAIN-1 ! -o vlan+ -m comment --comment "AWS, SNAT" -m addrtype ! --dst-type LOCAL -j SNAT --to-source 192.168.22.226 --random-fully

修改为1.22集群尝试

创建节点组

eksctl create nodegroup --cluster testsnat --node-type t3.xlarge --nodes 1 --nodes-max 2 --nodes-min 0 --node-volume-size 30 --node-volume-type gp3  --ssh-access  --ssh-public-key cluster-key

逻辑上ec2访问pod没有问题,但是pod返回响应的时候被snat到节点ip上,因此可能会出现访问失败。

重复以上测试,仍旧没有问题,目前不清楚为什么没有出现文档上出现的访问失败的问题

相关内容

热门资讯

安卓如何操控苹果系统,揭秘跨平... 你知道吗?在这个科技飞速发展的时代,安卓和苹果两大操作系统之间的较量可是从未停歇。虽然它们各自有着忠...
安卓系统账户同步数据,畅享无缝... 你有没有遇到过这种情况:手机里存了那么多宝贝照片、重要文件,结果换了个新手机,却发现那些宝贝全都不翼...
安卓系统不停推送广告,安卓系统... 你有没有发现,最近你的安卓手机是不是越来越“热情”了?没错,就是那个不停在你屏幕上跳来跳去的广告!今...
airpods可以和安卓系统,... 你有没有想过,那些炫酷的AirPods竟然也能和安卓手机完美搭配?没错,就是那个我们平时只听说和iP...
安卓系统实体键盘不对,创新与挑... 你是不是也遇到了这个问题?安卓手机的实体键盘突然不对劲了,按下去没反应,或者反应迟钝,简直让人抓狂!...
汽车导航改装安卓系统,安卓系统... 你有没有想过,你的汽车导航系统是不是已经out了?现在,让我来给你揭秘如何给你的爱车来一次科技大变身...
安卓系统如何限制下载,安卓系统... 你有没有发现,手机里的安卓系统越来越智能了?不过,这也意味着有时候我们不小心就会下载一些不想要的软件...
安卓系统调成日语,概要の副標題... 你有没有想过,你的安卓手机竟然可以变成一个日式小天地呢?没错,就是那种动漫里常见的日语界面,是不是听...
男生耳机推荐安卓系统,男生耳机... 耳机可是现代生活中不可或缺的小玩意儿,尤其是对于喜欢听音乐的男生来说,一副好耳机简直就是灵魂的伴侣。...
安卓同版本升级系统,功能优化与... 你知道吗?最近手机界可是热闹非凡呢!各大品牌纷纷推出了安卓同版本升级系统,让我们的手机焕然一新。今天...
安卓更换别的手机系统,轻松切换... 你有没有想过,你的安卓手机用久了,是不是有点审美疲劳了呢?或者,你最近是不是对其他手机系统产生了浓厚...
安卓系统单机神雕侠侣,指尖重温 你有没有想过,在手机上也能体验一把江湖恩怨、侠骨柔肠?没错,就是那个让人心驰神往的《神雕侠侣》!今天...
安卓系统键盘语言切换,安卓系统... 你有没有发现,手机上的安卓系统键盘语言切换功能,简直就像是个神奇的魔法棒,轻轻一点,就能让文字飞舞在...
oppok1安卓系统,性能与体... 你有没有发现,最近手机圈里又掀起了一股热潮?没错,就是OPPO K1这款新机!这款手机不仅外观时尚,...
安卓系统环境的搭建,从零开始构... 想要在电脑上体验安卓系统的魅力,是不是已经跃跃欲试了呢?别急,今天就来手把手教你如何搭建一个属于自己...
【MySQL】锁 锁 文章目录锁全局锁表级锁表锁元数据锁(MDL)意向锁AUTO-INC锁...
【内网安全】 隧道搭建穿透上线... 文章目录内网穿透-Ngrok-入门-上线1、服务端配置:2、客户端连接服务端ÿ...
GCN的几种模型复现笔记 引言 本篇笔记紧接上文,主要是上一篇看写了快2w字,再去接入代码感觉有点...
数据分页展示逻辑 import java.util.Arrays;import java.util.List;impo...
Redis为什么选择单线程?R... 目录专栏导读一、Redis版本迭代二、Redis4.0之前为什么一直采用单线程?三、R...