k8s雙棧協(xié)議無法訪問集群外ipv6服務(wù)(解決) 天天快訊

        2023-04-22 11:24:29       來源:騰訊云

        問題背景

        k8s集群升級了雙協(xié)議棧后,從集群內(nèi)無法訪問外部ipv6服務(wù),已經(jīng)確認部署了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

        發(fā)現(xiàn)可以收到發(fā)來的請求,但是并沒有回包。


        (資料圖)

        同樣用tcpdump抓ipv4的包,是有回包的。分析ipv4和ipv6的差異:ipv4的SrcIP是Pod所在宿主機的ip,而ipv6的SrcIP是2000:100:100:100:9a7e:bead:f22c:9640,而2000:100:100:100::/64是集群內(nèi)部的ipv6網(wǎng)段,可以確定ipv6的請求從Pod所在宿主機出來時沒有進行SNAT轉(zhuǎn)換。

        2 增加SNAT的iptables策略

        這里采用了一種比較簡單的解決方案,最終方案應(yīng)該通過集群的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

        參數(shù)

        說明

        -s

        要處理的源IP段

        -o

        規(guī)則綁定的接口

        --to-source

        替換的IP(本機IP)

        增加iptables策略后服務(wù)就可以訪問了。

        一些彎路

        最初在服務(wù)所在主機上通過增加靜態(tài)路由的方式也可以臨時性達到目的:

        ip -6 route add 2000:100:100:100::/64 via FC00:0:130F::9C0:876A:130B

        相當于把Pod所在宿主機作為Pod內(nèi)部網(wǎng)段的網(wǎng)關(guān),這樣可以臨時解決問題,當時由于Pod會在集群的Node上漂移,所以這不是一個好的方法。

        關(guān)鍵詞:
        x 廣告
        x 廣告

        Copyright @  2015-2022 海外生活網(wǎng)版權(quán)所有  備案號: 滬ICP備2020036824號-21   聯(lián)系郵箱:562 66 29@qq.com