Linux-Networking
Kubernetes kube-proxy NodePort 和 IPv6
我正在嘗試在本地裸機 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)?
是的,這就是雙棧的用途。它可以分配
IPv6
和IPv4
地址。沒有它,將無法從一種或另一種 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 集群中啟用,請使用本指南。希望能幫助到你。