IPv4/IPv6 双栈

IPv4/IPv6 双栈

我正在尝试在本地使用 NodePort 公开服务裸机 Kubernetes(1.17)集群(Calico 用于 CNI 和CRI-O 1.17

  • 所有节点(Ubuntu 18.04)都具有 IPv4 和 IPv6 地址,并且可以通过两种方式访问​​(例如 ssh)
  • 已使用 kubeadm 和 IPv4 启动 Kubernetes
  • 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)?

答案1

是的,这就是双栈的用途。它允许分配IPv6IPv4地址。没有它,pod 和服务将无法通过一个或另一个 IP 协议访问。如果无法处理 IP 协议,DNS 解析不足以实现正确的网络连接。

根据Kubernetes文档:

IPv4/IPv6 双栈

特征状态: Kubernetes v1.16 α

IPv4/IPv6 双栈允许同时分配 IPv4 和 IPv6 地址 Pod服务

如果您为 Kubernetes 集群启用 IPv4/IPv6 双栈网络,则该集群将支持同时分配 IPv4 和 IPv6 地址。

请注意,这是一个 alpha 功能,不适用于生产环境。


替代方法是使用IPv6终止模型。IPv6流量通过代理发送到集群网络内的 IPv4 后端。例子来自 GCP 文档。


更新:

可以IPv6IPv4与 calico 一起使用。但是有一些限制。

根据印花布文档:

  • 目前,Kubernetes 一次仅支持一个 IP 堆栈版本。这意味着如果您为 IPv6 配置 Kubernetes,则 Calico 应配置为仅分配 IPv6 地址。
  • 此处的步骤和设置尚未针对现有 IPv4 集群进行测试,仅适用于新集群。

IPv6要仅在 kubernetes 集群中启用,请使用以下命令指导

希望能帮助到你。

相关内容