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上,因此可能会出现访问失败。

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

相关内容

热门资讯

findx耍原生安卓系统,深度... 亲爱的读者们,你是否厌倦了那些花里胡哨的定制系统,渴望回到那个纯净的安卓世界?今天,我要带你一起探索...
一加系统属于安卓系统吗,引领智... 你有没有想过,手机里的那个神奇的“一加系统”到底是不是安卓系统的一员呢?这可是个让人好奇不已的问题哦...
小米2刷安卓系统吗,探索安卓系... 亲爱的读者,你是否曾经对小米2这款手机刷安卓系统的事情感到好奇呢?今天,就让我带你一探究竟,揭开小米...
安卓7.0系统线刷包,深度解析... 你有没有发现,你的安卓手机最近有点儿“蔫儿”了?别急,别急,今天就来给你揭秘如何让你的安卓手机重焕生...
白菜系统和安卓拍照,开启智能生... 你知道吗?最近我在用手机拍照的时候,发现了一个超级酷的功能,简直让我爱不释手!那就是——白菜系统和安...
安卓系统查杀病毒,全方位守护您... 手机里的安卓系统是不是有时候会突然弹出一个查杀病毒的提示?别慌,这可不是什么大问题,今天就来给你详细...
iso系统与安卓各系统哪个好,... 你有没有想过,手机操作系统就像是我们生活中的不同交通工具,各有各的特色和优势。今天,咱们就来聊聊这个...
中柏怎么换安卓系统,解锁更多可... 你有没有发现,中柏的安卓系统有时候用起来还挺不顺手的?别急,今天就来手把手教你如何给中柏手机升级安卓...
安卓热点绕过系统验证,揭秘操作... 你是不是也遇到过这种情况?手机里的安卓热点突然不灵光了,系统验证总是跳出来,让人头疼不已。别急,今天...
安卓系统怎么关闭小艺,安卓系统... 亲爱的安卓用户们,你是否也和我一样,对手机里的小艺助手有些爱恨交加呢?有时候,它贴心得让人感动,有时...
安卓系统计划软件推荐,精选计划... 你有没有发现,手机里的安卓系统越来越智能了?这不,最近我可是挖到了一些超棒的安卓计划软件,它们不仅能...
收钱吧安卓系统插件,便捷支付新... 你有没有发现,现在的生活越来越离不开手机了?手机里装满了各种应用,而今天我要跟你聊聊一个特别实用的工...
鸿蒙系统是否还属于安卓,独立于... 你有没有想过,那个在我们手机上默默无闻的鸿蒙系统,它到底是不是安卓的“亲戚”呢?这个问题,估计不少手...
安卓系统手机用什么钱包,轻松管... 你有没有想过,你的安卓系统手机里装了那么多应用,但最离不开的,可能就是那个小小的钱包了。没错,就是那...
安卓系统能玩部落冲突吗,部落冲... 你有没有想过,安卓系统上的手机,是不是也能玩那款风靡全球的《部落冲突》呢?这款游戏自从推出以来,就吸...
智能机器人安卓系统,引领未来智... 你知道吗?在科技飞速发展的今天,智能机器人已经不再是科幻电影里的专属了。它们正悄悄地走进我们的生活,...
华为win10系统改装安卓系统... 你有没有想过,你的华为笔记本电脑里的Windows 10系统,能不能来个华丽变身,变成安卓系统呢?这...
旧电脑上安什么安卓系统,适配不... 你那台旧电脑是不是已经闲置好久了?别让它默默无闻地躺在角落里,给它来个华丽变身吧!今天,就让我来告诉...
安卓app语言跟随系统,随系统... 你知道吗?在手机世界里,有一个神奇的小功能,它就像你的贴身翻译官,无论你走到哪里,都能帮你轻松应对各...
惠城安卓系统降级在哪,揭秘降级... 你有没有遇到过手机系统升级后,发现新系统让你头疼不已,想回到那个熟悉的安卓系统呢?别急,今天就来告诉...