在 Kubernetes 集群中启用 IPv4/IPv6 双栈后,数据流向取决于应用配置、DNS 解析、网络策略、客户端/服务端双栈支持等因素。以下是具体场景的流向规则:
一、核心原则:IP 版本选择取决于通信双方的能力和配置
-
若通信双方(客户端和服务端)同时支持双栈,通常遵循客户端优先选择 IPv6(取决于操作系统或应用配置)。
-
若某一方仅支持单一 IP 版本(如仅 IPv4),则强制使用该版本。
二、具体场景分析
1. Pod 到 Pod 通信
-
场景:同一集群内 Pod 间直接通信。
-
规则:
-
若目标 Pod 有双栈 IP,发起方 Pod 会优先使用 IPv6(若双方均支持)。
-
若目标 Pod 仅支持 IPv4,则自动回退到 IPv4。
-
显式指定 IP 版本:应用代码可直接绑定
0.0.0.0
(IPv4)或::
(IPv6)强制使用特定协议。
-
2. Service 访问
-
场景:通过 Service(ClusterIP/NodePort)访问后端 Pod。
-
规则:
-
Service 配置双栈时,会分配 IPv4 和 IPv6 的虚拟 IP(VIP)。
-
客户端 Pod 根据自身双栈能力选择 Service 的 IP 版本:
-
若客户端支持双栈,默认优先选择 IPv6 VIP。
-
若客户端仅支持 IPv4,则只能使用 IPv4 VIP。
-
-
kube-proxy 会为两种 VIP 创建 iptables/ipvs 规则,确保流量正确转发。
-
3. DNS 解析
-
场景:通过 Service 域名(如
my-svc.default.svc.cluster.local
)访问。 -
规则:
-
DNS 查询会返回 IPv4 和 IPv6 地址(AAAA 和 A 记录)。
-
客户端选择逻辑:
-
大多数现代操作系统优先选择 IPv6(若支持)。
-
应用可通过配置强制使用 IPv4(如
ping -4
)或 IPv6(如ping -6
)。
-
-
4. 外部流量(Ingress/LoadBalancer)
-
场景:外部用户通过 Ingress 或 LoadBalancer 访问集群内服务。
-
规则:
-
云提供商支持:若 LoadBalancer 分配了双栈外部 IP,客户端根据自身能力选择 IP 版本。
-
Ingress 控制器:需配置监听双栈地址,流量路径由外部客户端 IP 版本决定。
-
5. 节点间通信
-
场景:跨节点 Pod 通信或节点组件(kubelet、kube-proxy)通信。
-
规则:
-
依赖 CNI 插件和节点路由表:
-
如 Calico 双栈模式下,跨节点流量可能通过 IPv6 隧道(若节点间 IPv6 路由可达)。
-
若节点间网络仅支持 IPv4,则回退到 IPv4。
-
-
三、关键影响因素
-
DNS 解析顺序:
-
若 DNS 返回 IPv6 地址优先,客户端支持 IPv6 则使用它。
-
可通过修改
/etc/gai.conf
(Linux)调整优先级。
-
-
CNI 插件配置:
-
确保 CNI(如 Calico、Cilium)正确启用双栈并配置路由。
-
-
Kubernetes 双栈要求:
-
kube-apiserver
启用--service-cluster-ip-range=<IPv4>,<IPv6>
。 -
kube-proxy
配置--cluster-cidr=<IPv4>,<IPv6>
。 -
节点网络接口启用双栈。
-
四、调试工具
-
查看 IP 分配:
kubectl get pod <pod-name> -o jsonpath='{.status.podIPs}'
-
强制指定 IP 版本:
curl -6 http://service-name # 强制 IPv6 curl -4 http://service-name # 强制 IPv4
-
检查 DNS 记录:
dig +short AAAA my-svc.default.svc.cluster.local # IPv6 记录 dig +short A my-svc.default.svc.cluster.local # IPv4 记录
五、总结:何时走 IPv4/IPv6?
场景 |
IPv4 使用条件 |
IPv6 使用条件 |
Pod 到 Pod |
目标仅 IPv4 或客户端强制 IPv4 |
双方支持 IPv6 且未强制指定 IPv4 |
Service 访问(ClusterIP) |
客户端仅支持 IPv4 或 Service 未配置 IPv6 |
Service 有 IPv6 VIP 且客户端支持双栈 |
DNS 解析 |
DNS 返回 IPv4 或客户端禁用 IPv6 |
DNS 返回 IPv6 且客户端优先选择 |
外部访问(LoadBalancer) |
外部 IP 为 IPv4 或客户端不支持 IPv6 |
外部 IP 为 IPv6 且客户端支持 |
通过合理配置和明确策略,双栈集群可实现平滑的 IPv4/IPv6 共存与过渡。