k8s雙棧協(xié)議無法訪問集群外ipv6服務(wù)(解決)
2023-04-23 08:42:12|
來源:騰訊云
k8s集群升級(jí)了雙協(xié)議棧后,從集群內(nèi)無法訪問外部ipv6服務(wù),已經(jīng)確認(rèn)部署了Endpoint和Service。而同樣采用ip
問題背景
k8s集群升級(jí)了雙協(xié)議棧后,從集群內(nèi)無法訪問外部ipv6服務(wù),已經(jīng)確認(rèn)部署了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這臺(tái)機(jī)器山上抓包:tcpdump -i eth0 host 1002:003B:456C:678D:890E:0012:234F:56G7 tcp -vv
發(fā)現(xiàn)可以收到發(fā)來的請(qǐng)求,但是并沒有回包。
同樣用tcpdump抓ipv4的包,是有回包的。分析ipv4和ipv6的差異:ipv4的SrcIP是Pod所在宿主機(jī)的ip,而ipv6的SrcIP是2000:100:100:100:9a7e:bead:f22c:9640,而2000:100:100:100::/64是集群內(nèi)部的ipv6網(wǎng)段,可以確定ipv6的請(qǐng)求從Pod所在宿主機(jī)出來時(shí)沒有進(jìn)行SNAT轉(zhuǎn)換。2 增加SNAT的iptables策略
這里采用了一種比較簡單的解決方案,最終方案應(yīng)該通過集群的cni配置解決。
為所有的宿主機(jī)添加iptables策略:
ip6tables -t nat -A POSTROUTING -s 2000:100:100:100::/64 -o eth0 -j SNAT --to-source FC00:0:130F::9C0:876A:130B
參數(shù) | 說明 |
---|---|
-s | 要處理的源IP段 |
-o | 規(guī)則綁定的接口 |
--to-source | 替換的IP(本機(jī)IP) |
增加iptables策略后服務(wù)就可以訪問了。
一些彎路
最初在服務(wù)所在主機(jī)上通過增加靜態(tài)路由的方式也可以臨時(shí)性達(dá)到目的:
ip -6 route add 2000:100:100:100::/64 via FC00:0:130F::9C0:876A:130B
相當(dāng)于把Pod所在宿主機(jī)作為Pod內(nèi)部網(wǎng)段的網(wǎng)關(guān),這樣可以臨時(shí)解決問題,當(dāng)時(shí)由于Pod會(huì)在集群的Node上漂移,所以這不是一個(gè)好的方法。
關(guān)鍵詞: