Linux-Networking

Kubernetes kube-proxy NodePort 和 IPv6

  • March 10, 2020

我正在嘗試在本地裸機 kubernetes (1.17)集群上使用 NodePort 公開服務(用於 CNI 和CRI-O 1.17 的印花布)

  • 所有節點(Ubuntu 18.04)都有 IPv4 和 IPv6 地址,並且可以使用這兩種地址訪問(例如 ssh)
  • Kubernetes 已使用帶有 IPv4 的 kubeadm 啟動
  • nginx 測試部署正在執行,並且可以使用帶有 nodeport 的服務訪問

我可以成功地使用 IPv4 捲曲服務,但不能使用 IPv6(已建立連接但沒有傳輸任何內容)。

kubectl describe svc/example-service

Name:                     example-service
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 app=helloworld
Type:                     NodePort
IP:                       10.97.69.135
Port:                     <unset>  5000/TCP
TargetPort:               5000/TCP
NodePort:                 <unset>  32042/TCP
Endpoints:                10.10.166.132:5000
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

在執行此部署的主機上:

netstat -tulpen|grep ':32042'

tcp6       0      0 :::32042                :::*                    LISTEN      0          10276301   2314/kube-proxy  

kube-proxy 顯然綁定到 tcp6(具有 tcp4 兼容模式)——因此可以建立連接——但沒有使用 tcp6(curl -6)傳輸數據,tcp4(curl -4)按預期工作。

集群是否必須配置為雙棧或 IPv6 模式才能接收 IPv4 和 IPv6 請求(例如通過 NodePort)?

是的,這就是雙棧的用途。它可以分配IPv6IPv4地址。沒有它,將無法從一種或另一種 IP 協議訪問 pod 和服務。如果無法處理 IP 協議,DNS 解析不足以實現正確的網路連接。

根據Kubernetes文件:

IPv4/IPv6雙棧

特徵狀態: Kubernetes v1.16 阿爾法

IPv4/IPv6 雙棧支持將 IPv4 和 IPv6 地址分配給 Pod服務

如果為 Kubernetes 集群啟用 IPv4/IPv6 雙棧網路,集群將支持同時分配 IPv4 和 IPv6 地址。

請注意,這是一個 alpha 功能,不適合生產環境。


另一種方法是使用IPv6終止模型。流量IPv6通過代理髮送到集群網路內的 IPv4 後端。GCP 文件中的範例


更新:

可以僅IPv6在不IPv4使用印花布的情況下使用。但是有一些限制。

根據印花布文件:

  • 目前 Kubernetes 一次只支持一個 IP 堆棧版本。這意味著如果您為 IPv6 配置 Kubernetes,那麼 Calico 應該配置為僅分配 IPv6 地址。
  • 此處的步驟和設置尚未針對現有 IPv4 集群進行測試,僅適用於新集群。

IPv6僅在 Kubernetes 集群中啟用,請使用本指南

希望能幫助到你。

引用自:https://serverfault.com/questions/1006325