--- reviewers: - lachie83 - khenidak - aramase title: IPv4/IPv6 双协议栈 feature: title: IPv4/IPv6 双协议栈 description: > Allocation of IPv4 and IPv6 addresses to Pods and Services content_template: templates/concept weight: 70 --- {{% capture overview %}} {{< feature-state for_k8s_version="v1.16" state="alpha" >}} IPv4/IPv6 双协议栈能够将 IPv4 和 IPv6 地址分配给 {{< glossary_tooltip text="Pods" term_id="pod" >}} 和 {{< glossary_tooltip text="Services" term_id="service" >}}。 如果你为 Kubernetes 集群启用了 IPv4/IPv6 双协议栈网络,则该集群将支持同时分配 IPv4 和 IPv6 地址。 {{% /capture %}} {{% capture body %}} ## 支持的功能 在 Kubernetes 集群上启用 IPv4/IPv6 双协议栈可提供下面的功能: * 双协议栈 pod 网络 (每个 pod 分配一个 IPv4 和 IPv6 地址) * IPv4 和 IPv6 启用的服务 (每个服务必须是一个单独的地址族) * Kubenet 多地址族支持(IPv4 和 IPv6) * Pod 的集群外出口通过 IPv4 和 IPv6 路由 ## 先决条件 为了使用 IPv4/IPv6 双栈的 Kubernetes 集群,需要满足以下先决条件: * Kubernetes 1.16 版本及更高版本 * 提供商支持双协议栈网络(云提供商或其他提供商必须能够为 Kubernetes 节点提供可路由的 IPv4/IPv6 网络接口) * Kubenet 网络插件 * Kube-proxy 运行在 IPVS 模式 ## 启用 IPv4/IPv6 双协议栈 要启用 IPv4/IPv6 双协议栈,为集群的相关组件启用 `IPv6DualStack` [特性门控](/docs/reference/command-line-tools-reference/feature-gates/),并且设置双协议栈的集群网络分配: * kube-controller-manager: * `--feature-gates="IPv6DualStack=true"` * `--cluster-cidr=,` 例如 `--cluster-cidr=10.244.0.0/16,fc00::/24` * `--service-cluster-ip-range=,` * `--node-cidr-mask-size-ipv4|--node-cidr-mask-size-ipv6` 对于 IPv4 默认为 /24,对于 IPv6 默认为 /64 * kubelet: * `--feature-gates="IPv6DualStack=true"` * kube-proxy: * `--proxy-mode=ipvs` * `--cluster-cidrs=,` * `--feature-gates="IPv6DualStack=true"` {{< caution >}} 如果命令行的 `--cluster-cidr` 指定大于 /24 的 IPv6 地址块,地址分配将失败。 {{< /caution >}} ## 服务 如果你的集群启用了 IPv4/IPv6 双协议栈网络,则可以使用 IPv4 或 IPv6 地址来创建 {{< glossary_tooltip text="Services" term_id="service" >}}。你可以通过设置服务的 `.spec.ipFamily` 字段来选择服务的集群 IP 的地址族。你只能在创建新服务时设置该字段。`.spec.ipFamily` 字段的设置是可选的,并且仅当你计划在集群上启用 IPv4 和 IPv6 的 {{< glossary_tooltip text="Services" term_id="service" >}} 和 {{< glossary_tooltip text="Ingresses" term_id="ingress" >}}。对于[出口](#出口流量)流量,该字段的配置不是必须的。 {{< note >}} 集群的默认地址族是第一个服务集群 IP 范围的地址族,该地址范围通过 kube-controller-manager 上的 `--service-cluster-ip-range` 标志设置。 {{< /note >}} 你可以设置 `.spec.ipFamily` 为: * `IPv4`:API 服务器将从 `service-cluster-ip-range` 中分配 `ipv4` 地址 * `IPv6`:API 服务器将从 `service-cluster-ip-range` 中分配 `ipv6` 地址 以下服务规约不包含 `ipFamily` 字段。Kubernetes 将从最初配置的 `service-cluster-ip-range` 范围内分配一个 IP 地址(也称作“集群 IP”)给该服务。 {{< codenew file="service/networking/dual-stack-default-svc.yaml" >}} 以下服务规约不包含 `ipFamily` 字段。Kubernetes 将从已配置的 `service-cluster-ip-range` 范围内分配一个 IPv6 地址(也称作“集群 IP”)给该服务。 {{< codenew file="service/networking/dual-stack-ipv6-svc.yaml" >}} 为了进行比较,将从已配置的 `service-cluster-ip-range` 向该服务分配以下 IPV4 地址(也称为“集群 IP”)。 {{< codenew file="service/networking/dual-stack-ipv4-svc.yaml" >}} ### 负载均衡器类型 在支持启用了 IPv6 的外部服务均衡器的云驱动上,除了将 `ipFamily` 字段设置为 `IPv6`,将 `type` 字段设置为 `LoadBalancer`,为你的服务提供云负载均衡。 ## 出口流量 公共路由和非公共路由的 IPv6 地址块的使用是可以的。提供底层 {{< glossary_tooltip text="CNI" term_id="cni" >}} 的提供程序可以实现这种传输。如果你拥有使用非公共路由 IPv6 地址的 Pod,并且希望该 Pod 到达集群外目的(比如,公共网络),你必须为出口流量和任何响应消息设置 IP 伪装。[ip-masq-agent](https://github.com/kubernetes-incubator/ip-masq-agent) 可以感知双栈,所以你可以在双栈集群中使用 ip-masq-agent 来进行 IP 伪装。 ## 已知问题 * Kubenet 强制 IPv4,IPv6 的 IPs 位置报告 (--cluster-cidr) {{% /capture %}} {{% capture whatsnext %}} * [验证 IPv4/IPv6 双协议栈](/docs/tasks/network/validate-dual-stack)网络 {{% /capture %}}