主机网络服务中的多子网支持

适用于:Windows Server 2022

Windows 容器的主机网络服务(HNS)现在支持使用每个网络的多个子网。 以前,HNS 限制 Kubernetes 容器终结点配置,以仅使用基础子网的前缀长度。 HNS 已得到增强,因此可以使用更严格的子网,例如具有较长前缀长度的子网,以及每个 Windows 工作器节点的多个子网。 此功能的第一个容器网络接口(CNI)是适用于 Windows 的 Calico。 Calico 网络策略是由 Tigera 创立的开源网络和网络安全解决方案。

只能在 l2bridgel2tunnel覆盖网络驱动程序中使用 HNS 中的多个子网。 这些网络驱动程序可以公开多个子网,然后允许每个终结点绑定到其中一个子网。

HNS 和主机计算服务(HCS)协同工作,以创建容器并将终结点附加到网络。 可以使用 HNS Powershell 帮助程序模块与 HNS 交互。

Calico 要求

对 Calico CNI 的多个子网支持要求将子网细分为较小的 IP 块。 所有 IP 块必须共享相同的网关,但每个 IP 块可以有自己的单独的广播域。 为了最大程度地提高 IPV4 分配的效率,Calico 需要创建非常小的 IP 块(小到一个块 = 四个 IP 地址),除了在容器终结点上设置非常小的前缀(小到 /32)。

Calico IP 地址管理(IPAM)的完整实现如下所示:

Calico 的 IPAM 函数旨在按需将 IP 地址分配给工作负荷。 Calico 还支持多个 IP 池进行管理分组。 为特定工作负荷配置分配时,允许的池集可能会受到配置的限制,从而允许各种用例。 针对不同的用例,请遵循以下指南:

  • 使用多个不相交的池来增加容量。
  • 对于 机架中的 l2bridge 网络,请为每个机架配置 IP 池,其中机架中的主机只能从特定池进行分配。
  • 使用每个堆栈层的 IP 池,其中前端 Pod 从前端池(可能是公共的)获取 IP,但后端 Pod(可能位于同一主机上)从不同的范围接收 IP。 这样,Calico 就可以适应咄咄逼人的网络分区要求(可能需要使用旧防火墙)。
  • 使用非常小的微池,每个堆栈层都有一个。 由于这些池非常小,因此它们要求每个主机支持来自多个池的工作负荷。

IP 始终从块分配,这些块可以与特定主机相交。 如果存在空间(并且仅当块来自给定工作负荷的允许池)时,主机将始终尝试从其自己的一个相交块分配 IP。 如果主机的现有块都没有空间,主机将尝试从允许的池中声明新块。 如果没有空块可用,主机将借用允许池中具有可用空间的任何块的 IP,即使该块与另一个主机相交。

Calico 依赖于最长的 前缀匹配路由 来支持聚合。 每个主机都播发其所有相交块的路由,并为它借来的任何 IP 播发 /32 路由。 由于 /32 路由更具体,因此需要转发到 /32 的远程主机将使用 /32 路由,而不是使用 affine 块到主机的更广泛 /26 路由。

由于 Calico 是路由 L3 网络,因此值得注意的是,/26 路由不是子网。 例如,没有网络或广播地址;块的“0”和“255”地址用作普通 IP。

Calico HNS 数据平面要求

在 HNS 中启用多个子网需要多个 Calico 连接和策略要求:

  • 同一主机上的所有工作负荷必须相互连接,并且必须连接到远程 Pod。
  • Pod 之间的所有数据包路径都应具有以下条件,无论发送方和接收方是否位于同一主机上,以及它们是直接访问还是由服务群集 IP 访问:
    • 访问控制列表(ACL)出口和入口策略必须适用。
    • 发送 Pod 的出口策略和接收 Pod 的入口策略都必须允许流量。
    • 所有 Calico 编程的 ACL 规则都应能够查看 Pod IP。
  • 主机和 Pod 必须能够相互访问,并通过通过边界网关协议(BGP)学习的路由访问其他主机上的 Pod。

每个主机要求多个 IP 块

若要支持每个主机的多个 IP 块,请查看以下要求:

  • 对于给定的单个 IP 池,数据平面必须允许使用来自不同不连续 IP 块的 IP 添加 Pod。 例如,IP 池可以是 10.0.0.0/16,但主机可能会声明一对随机块:10.0.123.0/26 和 10.0.200.0/26。
  • 在首次分配之前,不需要知道池和块的大小。 强烈建议执行此操作。
  • 来自同一池的其他块可能存在于其他主机上。
  • 各种块的常见前缀可能与主机自己的 IP 地址重叠。

支持 IP 借款的要求

Calico IPAM 将 IP 分配到块中托管以实现聚合目的。 如果 IP 池已满,则节点还可以 从另一个节点的块借用 IP。 在 BGP 术语中,借款人随后为借入 IP 播发更具体的 /32 路由,然后将该 IP 的流量路由到借款主机。

Windows 节点不支持此借用机制。 即使 IP 池已满,它们也不会借用 IP,并且会标记其块,以便 Linux 节点也不会借用它们。

支持微池的要求

若要使用微池,将删除每个块保留四个 IP 的要求。 在微池用例中,使用非常小的池和非常小的块,因此每个块有四个 IP 会浪费大部分 IP。 可以要求每个主机或每个池的少量保留 IP。 最佳做法是取消所有 第 2 层支持限制(例如,不应支持广播和保留 IP)。

使用 PowerShell 创建子网和 IP 子网

在继续之前,请确保已从 HNS PowerShell 库安装 HNS.V2.psm1 模块。

以下步骤说明如何使用示例创建子网和 IP 子网。

  1. 若要创建 包含 192.168.0.0/16 子网(包含 192.168.1.0/24 IP 子网和 192.168.2.0/24 IP 子网)的 am l2bridge 网络,请运行以下命令:

    $net1 = New-HnsNetwork -Type L2Bridge -Name Test1 -AddressPrefix "192.168.0.0/16" -Gateway "192.168.0.1" -Verbose -IPSubnets @(@{"IpAddressPrefix"="192.168.1.0/24";"Flags"=0},@{"IpAddressPrefix"="192.168.2.0/24";"Flags"=[IPSubnetFlags]::EnableBroadcast})
    
  2. 若要将包含 172.16.16.1.0/16 IP 子网的新 172.16.0/16 子网添加到 l2bridge 网络,请运行以下命令:

    New-HnsSubnet -NetworkID $net1.ID -Subnets @{
        "IpAddressPrefix"="172.16.0.0/16";
        "Routes"=@(@{"NextHop"="172.16.0.1";"DestinationPrefix"="0.0.0.0"});
        "IpSubnets"=@(@{"IpAddressPrefix"="172.16.1.0/24"})
    
  3. 若要将新的 172.16.2.0/24 IP 子网添加到 172.16.0.0/16 子网,请运行以下命令:

    New-HnsIPSubnet -NetworkID $net1.ID -SubnetID $net2.Subnets[1].ID -IPSubnets @{"IpAddressPrefix"="172.16.2.0/24";"Flags"=0}
    

若要删除 IP 子网,请使用以下步骤:

  1. 若要删除 172.16.2.0/24 IP 子网,请运行以下命令:

       $net2 = Get-HnsNetwork -ID $net1.ID
       Remove-HnsIpSubnet -NetworkID $net1.ID -SubnetID $net2.Subnets[1].ID -IPSubnets @{"ID"=$net2.Subnets[1].IPSubnets[1].ID}
    
  2. 若要删除 172.16.0.0/16 子网,请运行以下命令:

    Remove-HnsSubnet -NetworkID $net1.ID -Subnets @{"ID"=$net2.Subnets[1].ID}