Nginx ingress 为 kubernetes IPv4 集群支持 ipv4 和 ipv6

Nginx ingress 为 kubernetes IPv4 集群支持 ipv4 和 ipv6

我已经使用 3 个虚拟机(1 个主虚拟机、2 个工作虚拟机)安装了 K8S 集群。

VM1:Eth0:IPv4-A1,Eth1:IPv4-B1,IPv6-C1

VM1:Eth0:IPv4-A2,Eth1:IPv4-B2,IPv6-C2

VM1:Eth0:IPv4-A3,Eth1:IPv4-B3,IPv6-C3

我的 K8S 集群全部是 IPv4 - PodIp、serviceIP - 全部是 Ipv4 并且运行良好。

我曾提到https://github.com/nginxinc/kubernetes-ingress/tree/master/examples/complete-example用于部署示例应用程序并通过 nginx 的 ingress 将其公开。

我可以使用 Ipv4 地址(A 和 B)访问该服务。但是,我无法使用 Ipv6 访问该服务。

然后我创建了一个 NodePort 服务来公开入口服务,现在我看到以下工作节点。

netstat -anlp | grep -w LISTEN | grep 32407
(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.)
tcp6       0      0 :::32407                :::*                    LISTEN      -               

现在 - 当我尝试使用 Ipv6 访问该服务时 - 它就超时了。

当我尝试使用 Wireshark 查看发生了什么时。

当使用 IPv4 来搜索服务时 - TCP,然后是 HTTP GET,我们会得到响应。

当使用 IPv6 时 - TCP 已建立,甚至在 curl 等待时也会交换 TCP KeepAlive。但是,我没有看到发送的 HTTP GET 的响应。

不确定工作节点内发生了什么:-(我在 wireshark 中看不到任何东西。

在 Google 上搜索了一下,发现 K8S 使用 Netfilter 来确保数据包到达正确的目的地。难道它不能对 IPv6 数据包做到这一点吗?

请帮忙。

答案1

根据官方 gcloud 文档:

VPC 网络仅支持 IPv4 单播流量。它们不支持网络内的广播、多播或 IPv6 流量:VPC 网络中的虚拟机只能发送到 IPv4 目标,并且只能接收来自 IPv4 源的流量。可以为全局负载均衡器创建 IPv6 地址

请阅读此文章IPv6 支持和双栈配置

在 Azure 中:

Azure 虚拟网络的 IPv6 目前处于公共预览阶段。此预览版不提供服务级别协议,不建议用于生产工作负载。您可以找到更多信息这里

关于 ipv6 支持的讨论github

除了使集群支持 ipv 之外,集群还应具有支持 IPv4 和 IPv6 的双栈实现,用于 pod 和服务。例如,请看这里这里和这里kubeadm-dind 集群

目前,亚马逊可能提供最大的IPv6 支持

相关内容