IPv4./IPv6 dual-stack

FEATURE STATE: Kubernetes v1.21 [beta]

IPv4./IPv6 dual-stack networking enables the allocation of both IPv4 and IPv6 addresses to豆荚and服务s

默认情况下启用IPv4 / IPv6双堆栈网络,允许在1.21中启动Kubernetes群集,允许同时分配IPv4和IPv6地址。

支持的特点

Kubernetes群集上的IPv4 / IPv6双堆栈提供以下功能:

  • 双堆栈POD网络(每个POD的单个IPv4和IPv6地址分配)
  • IPv4.and IPv6 enabled Services
  • Pod off-cluster egress routing (eg. the Internet) via both IPv4 and IPv6 interfaces

先决条件

需要以下先决条件,以便利用IPv4 / IPv6双堆栈Kubernetes集群:

  • Kubernetes.1.20 or later
    为了在formation about using dual-stack services with earlier Kubernetes versions, refer to the documentation for that version of Kubernetes.
  • Provider support for dual-stack networking (Cloud provider or otherwise must be able to provide Kubernetes nodes with routable IPv4/IPv6 network interfaces)
  • A network plugin that supports dual-stack (such as Kubenet or Calico)

配置IPv4 / IPv6双堆栈

要使用IPv4 / IPv6双堆栈,请确保IPv6dualstack.特征门已启用群集的相关组件。(从1.21开始,IPv4 / IPv6双堆栈默认为启用。)

要配置IPv4 / IPv6双堆栈,请设置双堆栈群集网络分配:

  • Kube-Apiserver:
    • --service-cluster-ip-Range =
  • Kube-Controller-Manager:
    • - CLUST-CIDR =
    • --service-cluster-ip-Range =
    • --node-cidr-mask-size-ipv4 | --node-cidr-mask-size-ipv6默认为IPv4和/ 64的默认为/ 24 for ipv6
  • Kube-Proxy:
    • - CLUST-CIDR =
Note:

IPv4 CIDR的示例:10.244.0.0/16(虽然您将提供自己的地址范围)

IPv6 CIDR的示例:FDXY:IJKL:MNOP:15 :: / 64(这显示了格式但不是有效地址 - 请参阅RFC 4193

从1.21,IPv4 / IPv6双堆叠默认为启用。通过指定,您可以在必要时禁用它- geature-gates =“IPv6dualstack = false”在Kube-Apiserver,Kube-Controller-Manager,Kubelet和Kube-Proxy命令行。

服务s

你可以创建服务s它可以使用IPv4,IPv6或两者。

这address family of a Service defaults to the address family of the first service cluster IP range (configured via the--service-cluster-IP范围旗帜到kube-apiserver)。

When you define a Service you can optionally configure it as dual stack. To specify the behavior you want, you set the.spec.ipfamileypolicy.领域one of the following values:

  • Singlestack.:单堆栈服务。控制平面使用第一个配置的服务群集IP范围分配用于服务的群集IP。
  • 偏爱
    • 为服务分配IPv4和IPv6群集IP。(如果群集有- geature-gates =“IPv6dualstack = false”,此设置遵循相同的行为Singlestack.。)
  • 要求:Allocates Service.spec.clusterip.s来自IPv4和IPv6地址范围。
    • Selects the.spec.clusterip.从the list of.spec.clusterip.s基于第一个元素的地址系列.spec.ipfamilies.大批。

如果您想定义用于单叠的IP系列或定义双堆栈的IP系列的顺序,您可以通过设置可选字段来选择地址系列,.spec.ipfamilies.在服务上。

Note:.spec.ipfamilies.field is immutable because the.spec.clusterip.无法在已经存在的服务上重新分配。如果你想改变.spec.ipfamilies.,删除并重新创建服务。

你可以设置.spec.ipfamilies.到以下任何数组值:

  • [“IPv4”]
  • ["IPv6"]
  • [“IPv4”,“IPv6”](双堆)
  • [“IPv6”,“IPv4”](双堆)

您列出的第一个家庭用于遗留.spec.clusterip.field.

双堆栈服务配置方案

这些示例演示了各种双堆栈服务配置场景的行为。

新服务的双堆栈选项

  1. 此服务规范没有明确定义.spec.ipfamileypolicy.。创建此服务时,Kubernetes会为第一个配置的服务为服务分配群集IP服务群集IP范围并套装.spec.ipfamileypolicy.toSinglestack.。(没有选择者的服务and无头服务有选择器会以此同样的方式行事。)
apiersionv1种类服务metadata名称我的服务labelsappmyapp.规格选择器appmyapp.港口s-协议TCP.港口80
  1. 此服务规范明确定义偏爱.spec.ipfamileypolicy.。在双堆栈集群上创建此服务时,Kubernetes会为服务分配IPv4和IPv6地址。控制平面更新。规格为服务录制IP地址分配。场.spec.clusterip.s是主要字段,并包含两个分配的IP地址;.spec.clusterip.是一个次要字段,其值计算.spec.clusterip.s

    • 为了.spec.clusterip.字段,控制平面记录与第一服务群集IP范围相同的地址系列的IP地址。
    • 在单堆栈集群上.spec.clusterip.sand.spec.clusterip.字段只有列出一个地址。
    • 在启用双堆栈的群集中,指定要求.spec.ipfamileypolicy.表现相同偏爱
apiersionv1种类服务metadata名称我的服务labelsappmyapp.规格IPFamiLypolicy.偏爱选择器appmyapp.港口s-协议TCP.港口80
  1. 此服务规范明确定义IPv6.andIPv4..spec.ipfamilies.以及定义偏爱.spec.ipfamileypolicy.。当Kubernetes分配IPv6和IPv4地址时.spec.clusterip.s.spec.clusterip.设置为IPv6地址,因为这是第一个元素.spec.clusterip.s数组,覆盖默认值。
apiersionv1种类服务metadata名称我的服务labelsappmyapp.规格IPFamiLypolicy.偏爱IPFAMILIES.-  IPv6.-  IPv4.选择器appmyapp.港口s-协议TCP.港口80

Dual-stack defaults on existing Services

这些示例演示了在已存在的群集中新启用双堆栈时的默认行为。(将现有群集升级到1.21将启用双堆栈,除非- geature-gates =“IPv6dualstack = false”被设置。)

  1. 在群集中启用双堆栈时,现有服务(是否IPv4.orIPv6.)由控制平面配置为设置.spec.ipfamileypolicy.toSinglestack.and set.spec.ipfamilies.到现有服务的地址系列。现有的服务群集IP将存储在中.spec.clusterip.s
apiersionv1种类服务metadata名称我的服务labelsappmyapp.规格选择器appmyapp.港口s-协议TCP.港口80

您可以使用kubectl检查此行为来检查现有服务。

kubectl get svc my-service -o yaml
apiersionv1种类服务metadatalabelsappmyapp.名称我的服务规格clusterIP10.0.197.123集群-10.0.197.123IPFAMILIES.-  IPv4.IPFamiLypolicy.Singlestack.港口s-港口80协议TCP.目标口80选择器appmyapp.类型Clusterip.地位loadBalancer{}
  1. 当群集中启用双堆栈时,现有无头服务选择器由控制平面配置为设置.spec.ipfamileypolicy.toSinglestack.and set.spec.ipfamilies.到第一个服务群集IP范围的地址系列(通过--service-cluster-IP范围旗帜到kube-apiserver)即使.spec.clusterip.设定为没有任何
apiersionv1种类服务metadata名称我的服务labelsappmyapp.规格选择器appmyapp.港口s-协议TCP.港口80

您可以使用kubectl验证此行为,以通过选择器检查现有的无头服务。

kubectl get svc my-service -o yaml
apiersionv1种类服务metadatalabelsappmyapp.名称我的服务规格clusterIP没有任何集群-没有任何IPFAMILIES.-  IPv4.IPFamiLypolicy.Singlestack.港口s-港口80协议TCP.目标口80选择器appmyapp.

单堆叠和双堆叠之间的切换服务

服务可以从单堆栈更改为双堆栈,并从双堆叠到单堆栈。

  1. 将服务从单堆栈更改为双堆栈,更改.spec.ipfamileypolicy.Singlestack.to偏爱or要求如预期的。从单堆栈将此服务更改为双堆栈时,Kubernetes会分配丢失的地址系列,以便服务现在具有IPv4和IPv6地址。

    编辑服务规范更新.spec.ipfamileypolicy.Singlestack.to偏爱

Before:

规格IPFamiLypolicy.Singlestack.

后:

规格IPFamiLypolicy.偏爱
  1. To change a Service from dual-stack to single-stack, change.spec.ipfamileypolicy.偏爱or要求toSinglestack.。当您将此服务从双堆栈更改为单堆栈时,Kubernetes仅保留第一个元素.spec.clusterip.s阵列和集合.spec.clusterip.到该IP地址和集合.spec.ipfamilies.to the address family of.spec.clusterip.s

没有选择器的无头服务

为了没有选择者的无头服务and without.spec.ipfamileypolicy.明确设置,.spec.ipfamileypolicy.field defaults to要求

服务类型LoadBalancer.

为您的服务提供双堆栈负载均衡器:

  • 设定。规格。类型领域LoadBalancer.
  • .spec.ipfamileypolicy.领域偏爱or要求
Note:To use a dual-stackLoadBalancer.服务类型,IPv云提供者必须支持4 and IPv6 load balancers.

出口流量

如果要启用出口流量以从使用非公开可路由的IPv6地址的POD到达偏离群集目的地(例如,公共互联网),则需要启用POD以通过机制使用公开路由的IPv6地址如透明代理或IP伪装。这IP-Masq-AgentProject支持双堆栈集群的IP伪装。

Note:确保你的CNI.提供商支持IPv6。

下一步是什么

上次修改2月23日,2021年5:24 PM PST:通过Kubeadm添加双堆栈的文档:示例(5a6c4244c)