我在 Google Cloud 中创建了一个双栈 GKE 集群,使用 RequireDualStack 部署了一个示例 Nginx 部署和服务,并创建了一条防火墙规则以允许所有 IPv6 流量
::0/0
到达所有内容。
Pod 具有 IPv6 IP,可以从公共网络访问,没有任何问题;甚至使用 IPv6 的 NodePort 也可以从公共网络访问。该服务也有公共 IPv6 集群 IP,而不是 ULA,但仍然无法从外部访问。
仅供参考:pods IP 范围和服务 IP 范围不同,在 gke 中它是自动分配的并且无法更改。
无法从外部访问服务 IPv6 的原因是什么?有解决方案吗?”
尝试以下故障排除步骤来访问集群外部的服务,这可能有助于解决您的问题:
确保集群运行
GKE version 1.28
及以上 (GA)。 1.26+ GKE
仅包含 L4 DualStack 的预览版本,不包括 IPv6 静态 IP、标准层网络、自定义 IPv6 子网。
请注意,Pod 或节点不支持将 IPv6 作为单堆栈 IPv6。注意:对于 NodePort 服务,您可以使用 ClusterIP 地址(内部)和端口字段或节点 IP 地址(外部)和 NodePort 字段向 GKE 服务发送请求。每个节点的外部IP地址都可以用来访问服务。
使用以下命令检查防火墙规则是否正确配置:
gcloud alpha compute firewall-rules describe <firewall name\>
注意源范围与subnetIpv6CidrBlock相同。目标标签是GKE节点上的标签
验证节点是否已正确分配 IPv6 地址,使用以下命令验证节点是否已为 pod 正确分配 IPv6 地址:
kubectl get nodes <node-name\> -o go-template --template='{{range .status.addresses}}{{printf "%s: %s\\n" .type .address}}{{end}}'
kubectl get nodes <node-name\> -o go-template --template='{{range .spec.podCIDRs}}{{printf "%s\\n" .}}{{end}}'
如果上述步骤未能解决您的问题,请尝试使用服务类型负载均衡器。
附上故障排除文档以供参考。