问题背景
k8s集群升级了双协议栈后,从集群内无法访问外部ipv6服务,已经确认部署了Endpoint和Service。而同样采用ipv4是没问题的。
(资料图片)
1 部署Endpoint和Service
apiVersion: v1kind: Servicemetadata: name: myep namespace: default labels: app: myepspec: ports: - name: http-8080 port: 8080 protocol: TCP targetPort: 8080 ipFamilies: - IPv6---apiVersion: v1kind: EndpointsapiVersion: v1metadata: name: myep #此名字需与 Service 中的 metadata.name 的值一致 namespace: default labels: app: myepsubsets: - addresses: - ip: 1002:003B:456C:678D:890E:0012:234F:56G7 ## 集群外Ip ports: - port: 8080 name: http-8080
然后在集群的Pod中访问myep:8080不通。
分析
通过tcpdump在1002:003B:456C:678D:890E:0012:234F:56G7这台机器山上抓包:tcpdump -i eth0 host 1002:003B:456C:678D:890E:0012:234F:56G7 tcp -vv
发现可以收到发来的请求,但是并没有回包。
同样用tcpdump抓ipv4的包,是有回包的。分析ipv4和ipv6的差异:ipv4的SrcIP是Pod所在宿主机的ip,而ipv6的SrcIP是2000:100:100:100:9a7e:bead:f22c:9640,而2000:100:100:100::/64是集群内部的ipv6网段,可以确定ipv6的请求从Pod所在宿主机出来时没有进行SNAT转换。2 增加SNAT的iptables策略
这里采用了一种比较简单的解决方案,最终方案应该通过集群的cni配置解决。
为所有的宿主机添加iptables策略:
ip6tables -t nat -A POSTROUTING -s 2000:100:100:100::/64 -o eth0 -j SNAT --to-source FC00:0:130F::9C0:876A:130B
参数 | 说明 |
---|---|
-s | 要处理的源IP段 |
-o | 规则绑定的接口 |
--to-source | 替换的IP(本机IP) |
增加iptables策略后服务就可以访问了。
一些弯路
最初在服务所在主机上通过增加静态路由的方式也可以临时性达到目的:
ip -6 route add 2000:100:100:100::/64 via FC00:0:130F::9C0:876A:130B
相当于把Pod所在宿主机作为Pod内部网段的网关,这样可以临时解决问题,当时由于Pod会在集群的Node上漂移,所以这不是一个好的方法。
关键词:
-
逆差和顺差是什么意思?贸易顺差好还是逆差好?这是经济用语,一般指贸易顺差和逆差,就是出口大于进口就叫...
-
开曼群岛属于哪个洲?开曼群岛是一个国家吗?开曼群岛属于北美洲。开曼群岛是英国在美洲西加勒比群岛的一...
-
狼的精神是什么?《狼道》金句有哪些?狼的精神经典十六字是如下:一、发愤图强:狼不会为了庄严,...
-
世界上最大的内陆国?世界上最小的内陆国?所谓的内陆国,又称陆锁国,指的是没有海岸线的国家,亦即被...
-
大贝尔桥是哪个国家的?布鲁塞尔是哪个国家的城市?1、大贝尔特桥位于丹麦;2、大贝尔特桥是一座连接丹麦西兰岛和...
- 申购新股的技巧?打新股中签技巧时间?
2023-04-21 15:59:51
- 放量跌停预示着什么?放量跌停洗盘特征?
2023-04-20 16:07:16
- 崩盘是什么意思?崩盘是钱没了的意思吗?
2023-04-20 15:08:33
- atr是什么意思?ATR指标在股票里怎么用?
2023-04-17 17:00:07
- 信托产品收益率是多少?信托为什么收益那么高?
2023-04-13 14:35:27
财经频道