IPv4 / IPv6双堆栈

特征状态: Kubernetes v1.21(β)

IPv4 / IPv6双堆栈网络启用IPv4和IPv6地址的分配豆荚服务

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

支持的功能

Kubernetes集群上的IPv4/IPv6双栈提供了以下特性:

  • 双栈Pod网络(每个Pod分配一个IPv4和IPv6地址)
  • IPv4和IPv6支持的服务
  • 通过IPv4和IPv6接口进行缺消群体出口路由(例如,Internet)

先决条件

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

  • Kubernetes 1.20或更高版本
    有关在早期Kubernetes版本中使用双栈服务的信息,请参阅该版本的Kubernetes文档。德赢是不是大平台
  • 提供者支持双堆栈网络(云提供商或其他方式必须能够提供具有可路由的IPv4 / IPv6网络接口的Kubernetes节点)
  • 支持双栈的网络插件(如Kubenet或Calico)

配置IPv4 / IPv6双堆栈

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

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

  • kube apiserver:
    • ——service-cluster-ip-range = < IPv4 CIDR >、< IPv6 CIDR >
  • kube-controller-manager:
    • ——cluster-cidr = < IPv4 CIDR >、< IPv6 CIDR >
    • ——service-cluster-ip-range = < IPv4 CIDR >、< IPv6 CIDR >
    • --node-cidr-mask-size-ipv4 |--node-cidr-mask-size-ipv6IPv4默认为/24,IPv6默认为/64
  • kube-proxy:
    • ——cluster-cidr = < IPv4 CIDR >、< IPv6 CIDR >

服务

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

服务的地址族默认为第一个服务群集IP范围的地址系列(通过)--服务群集ip范围标记到kube apiserver)。

当您定义服务时,您可以选择将其配置为双堆栈。要指定所需的行为,请设置.spec.ipfamily政策字段以下值之一:

  • 单堆栈:单堆栈服务。控制平面使用第一个配置的业务集群IP范围为服务分配集群IP。
  • 首选双堆栈:
    • 为服务分配IPv4和IPv6集群ip。(如果集群有——feature-gates = " IPv6DualStack = false ",此设置遵循与相同的行为单堆栈.)
  • 所需数据包:分配服务.spec.ClusterIPs来自IPv4和IPv6地址范围。
    • 选择.spec.ClusterIP从列表中.spec.ClusterIPs的第一个元素的地址族.spec.ipFamilies数组中。

如果您想要定义单个堆栈使用哪个IP族,或者为双堆栈定义IP族的顺序,您可以通过设置一个可选字段来选择地址族,.spec.ipFamilies,在服务上。

你可以设置.spec.ipFamilies到以下任意数组值:

  • [“IPv4”]
  • (“IPv6”)
  • [“IPv4”、“IPv6”](双堆叠)
  • (“IPv6”、“IPv4”)(双堆叠)

您列出的第一个族用于传统.spec.ClusterIP场地。

双栈业务配置场景

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

新服务上的双栈选项

  1. 此服务规范没有明确定义.spec.ipfamily政策.当您创建此服务时,Kubernetes从第一个配置中为该服务分配一个集群IPservice-cluster-ip-range并设置.spec.ipfamily政策单堆栈. (不带选择器的服务无头服务与选择器的行为方式相同。)
蜂房:v1种类:服务元数据:姓名:我的服务标签:应用程序:MyApp规格:选择器:应用程序:MyApp港口:-协议:TCP港口城市:80
  1. 此服务规范明确定义了首选双堆栈.spec.ipfamily政策.当您在双栈集群上创建此服务时,Kubernetes会为该服务分配IPv4和IPv6地址。控制平面更新.spec.用于服务记录IP地址分配。田野.spec.ClusterIPs是主字段,包含两个分配的IP地址;.spec.ClusterIP是一个辅助字段,其值根据.spec.ClusterIPs

    • 对于.spec.ClusterIP字段中,控制平面记录与第一个服务群集IP范围来自同一地址系列的IP地址。
    • 在单堆栈集群上.spec.ClusterIPs.spec.ClusterIP两个字段仅列出一个地址。
    • 在启用双堆栈的群集上,指定所需数据包.spec.ipfamily政策行为与首选双堆栈
蜂房:v1种类:服务元数据:姓名:我的服务标签:应用程序:MyApp规格:家庭政策:首选双堆栈选择器:应用程序:MyApp港口:-协议:TCP港口城市:80
  1. 此服务规范明确定义了IPv6.IPv4..spec.ipFamilies以及定义首选双堆栈.spec.ipfamily政策.当Kubernetes分配IPv6和IPv4地址时.spec.ClusterIPs,.spec.ClusterIP设置为IPv6地址,因为这是.spec.ClusterIPs数组,覆盖默认值。
蜂房:v1种类:服务元数据:姓名:我的服务标签:应用程序:MyApp规格:家庭政策:首选双堆栈ipFamilies:——IPv6- - - - - - IPv4选择器:应用程序:MyApp港口:-协议:TCP港口城市:80

现有服务的双栈默认值

这些示例演示了在服务已经存在的集群上新启用双栈时的默认行为。(将现有集群升级到1.21将启用双栈,除非——feature-gates = " IPv6DualStack = false "已设置。)

  1. 在群集上启用双堆栈时,现有服务(无论IPv4.IPv6.)由控制平面配置为.spec.ipfamily政策单堆栈和集合.spec.ipFamilies到现有服务的地址族。现有的服务集群IP将存储在.spec.ClusterIPs
蜂房:v1种类:服务元数据:姓名:我的服务标签:应用程序:MyApp规格:选择器:应用程序:MyApp港口:-协议:TCP港口城市:80

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

Kubectl得到SVC我的服务-o yaml
蜂房:v1种类:服务元数据:标签:应用程序:MyApp姓名:我的服务规格:clusterIP:10.0.197.123集群:-10.0.197.123ipFamilies:- - - - - - IPv4家庭政策:单堆栈港口:-港口城市:80协议:TCP目标港:80选择器:应用程序:MyApp类型:ClusterIP状态:LoadBalancer.:{}
  1. 在群集上启用双堆栈时,现有无头服务通过控制平面将带选择器配置为.spec.ipfamily政策单堆栈和集合.spec.ipFamilies到第一个服务群集IP范围的地址系列(通过--服务群集ip范围即使.spec.ClusterIP设置为没有一个
蜂房:v1种类:服务元数据:姓名:我的服务标签:应用程序:MyApp规格:选择器:应用程序:MyApp港口:-协议:TCP港口城市:80

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

Kubectl得到SVC我的服务-o yaml
蜂房:v1种类:服务元数据:标签:应用程序:MyApp姓名:我的服务规格:clusterIP:没有一个集群:- 没有任何ipFamilies:- - - - - - IPv4家庭政策:单堆栈港口:-港口城市:80协议:TCP目标港:80选择器:应用程序:MyApp

在单栈和双栈之间切换服务

服务可以从单堆栈更改为双堆栈,也可以从双堆栈更改为单堆栈。

  1. 如果需要将服务由单栈改为双栈,请修改.spec.ipfamily政策从…起单堆栈首选双堆栈所需数据包如所愿。当您将此服务从单堆栈更改为双堆栈时,Kubernetes将分配丢失的地址系列,以便该服务现在具有IPv4和IPv6地址。

    编辑服务规范以更新.spec.ipfamily政策从…起单堆栈首选双堆栈

之前:

规格:家庭政策:单堆栈

后:

规格:家庭政策:首选双堆栈
  1. 将服务从双堆栈更改为单堆栈,更改.spec.ipfamily政策从…起首选双堆栈所需数据包单堆栈.当您将此服务从双栈改为单栈时,Kubernetes只保留.spec.ClusterIPs数组和集合.spec.ClusterIP的IP地址,并设置.spec.ipFamilies到地址家庭.spec.ClusterIPs

不带选择器的无头服务

没有选择器的Headless服务和不.spec.ipfamily政策显式设置.spec.ipfamily政策字段默认为所需数据包

服务类型loadbalance

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

  • 设定.spec.type字段负载平衡器
  • .spec.ipfamily政策字段首选双堆栈所需数据包

出口流量

如果要启用出口流量,以便从使用非公开路由IPv6地址的Pod到达非群集目的地(例如,公共Internet),则需要通过透明代理或IP伪装等机制使Pod使用公开路由IPv6地址。这个ip-masq-agentproject支持双堆栈群集上的IP伪装。

下一步是什么

最后修改时间为2021年2月23日太平洋标准时间下午5:24:通过kubeadm为双堆栈添加文档:示例(5a6c4244c)