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-ipv6
IPv4默认为/24,IPv6默认为/64
- kube-proxy:
——cluster-cidr = < IPv4 CIDR >、< IPv6 CIDR >
IPv4 CIDR的示例:10.244.0.0/16
(尽管您需要提供自己的地址范围)
IPv6 CIDR示例:fdXY: IJKL: MNOP: 15:: / 64
(这显示了格式,但不是一个有效的地址-参见RFC 4193)
从1.21开始,IPv4/IPv6双堆栈默认为已启用。您可以在必要时通过指定——feature-gates = " IPv6DualStack = false "
在kube apiserver上,使用kube控制器管理器、kubelet和kube代理命令行。
服务
您可以创建服务它可以使用IPv4,IPv6或两者。
服务的地址族默认为第一个服务群集IP范围的地址系列(通过)--服务群集ip范围
标记到kube apiserver)。
当您定义服务时,您可以选择将其配置为双堆栈。要指定所需的行为,请设置.spec.ipfamily政策
字段以下值之一:
单堆栈
:单堆栈服务。控制平面使用第一个配置的业务集群IP范围为服务分配集群IP。首选双堆栈
:- 为服务分配IPv4和IPv6集群ip。(如果集群有
——feature-gates = " IPv6DualStack = false "
,此设置遵循与相同的行为单堆栈
.)
- 为服务分配IPv4和IPv6集群ip。(如果集群有
所需数据包
:分配服务.spec.ClusterIPs
来自IPv4和IPv6地址范围。- 选择
.spec.ClusterIP
从列表中.spec.ClusterIPs
的第一个元素的地址族.spec.ipFamilies
数组中。
- 选择
如果您想要定义单个堆栈使用哪个IP族,或者为双堆栈定义IP族的顺序,您可以通过设置一个可选字段来选择地址族,.spec.ipFamilies
,在服务上。
.spec.ipFamilies
字段是不可变的,因为.spec.ClusterIP
不能在已经存在的服务上重新分配。如果你想改变.spec.ipFamilies
,删除并重新创建服务。你可以设置.spec.ipFamilies
到以下任意数组值:
[“IPv4”]
(“IPv6”)
[“IPv4”、“IPv6”]
(双堆叠)(“IPv6”、“IPv4”)
(双堆叠)
您列出的第一个族用于传统.spec.ClusterIP
场地。
双栈业务配置场景
这些示例演示了各种双堆栈服务配置场景的行为。
新服务上的双栈选项
- 此服务规范没有明确定义
.spec.ipfamily政策
.当您创建此服务时,Kubernetes从第一个配置中为该服务分配一个集群IPservice-cluster-ip-range
并设置.spec.ipfamily政策
来单堆栈
. (不带选择器的服务和无头服务与选择器的行为方式相同。)
蜂房:v1种类:服务元数据:姓名:我的服务标签:应用程序:MyApp规格:选择器:应用程序:MyApp港口:-协议:TCP港口城市:80
此服务规范明确定义了
首选双堆栈
在.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
- 此服务规范明确定义了
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 "
已设置。)
- 在群集上启用双堆栈时,现有服务(无论
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.:{}
- 在群集上启用双堆栈时,现有无头服务通过控制平面将带选择器配置为
.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
在单栈和双栈之间切换服务
服务可以从单堆栈更改为双堆栈,也可以从双堆栈更改为单堆栈。
如果需要将服务由单栈改为双栈,请修改
.spec.ipfamily政策
从…起单堆栈
来首选双堆栈
或所需数据包
如所愿。当您将此服务从单堆栈更改为双堆栈时,Kubernetes将分配丢失的地址系列,以便该服务现在具有IPv4和IPv6地址。编辑服务规范以更新
.spec.ipfamily政策
从…起单堆栈
来首选双堆栈
.
之前:
规格:家庭政策:单堆栈
后:
规格:家庭政策:首选双堆栈
- 将服务从双堆栈更改为单堆栈,更改
.spec.ipfamily政策
从…起首选双堆栈
或所需数据包
来单堆栈
.当您将此服务从双栈改为单栈时,Kubernetes只保留.spec.ClusterIPs
数组和集合.spec.ClusterIP
的IP地址,并设置.spec.ipFamilies
到地址家庭.spec.ClusterIPs
.
不带选择器的无头服务
为没有选择器的Headless服务和不.spec.ipfamily政策
显式设置.spec.ipfamily政策
字段默认为所需数据包
.
服务类型loadbalance
为您的服务提供双堆栈负载均衡器:
- 设定
.spec.type
字段负载平衡器
- 集
.spec.ipfamily政策
字段首选双堆栈
或所需数据包
负载平衡器
类型服务,您的云提供商必须支持IPv4和IPv6负载均衡器。出口流量
如果要启用出口流量,以便从使用非公开路由IPv6地址的Pod到达非群集目的地(例如,公共Internet),则需要通过透明代理或IP伪装等机制使Pod使用公开路由IPv6地址。这个ip-masq-agentproject支持双堆栈群集上的IP伪装。