将容器终结点连接到租户虚拟网络

适用于:Windows Server 2022、Windows Server 2019、Windows Server 2016,Azure Stack HCI 版本 21H2 和 20H2

本主题介绍如何将容器终结点连接到通过 SDN 创建的现有租户虚拟网络。 使用适用于 Docker 的 Windows libnetwork 插件提供的 l2bridge(和可选的 l2tunnel)网络驱动程序在租户 VM 上创建容器网络。

容器网络驱动程序主题中,我们讨论了通过 Windows 上的 Docker 提供的多个网络驱动程序。 对于 SDN,请使用 l2bridge 和 l2tunnel 驱动程序。 对于这两个驱动程序,每个容器终结点都与容器主机(租户)虚拟机位于同一虚拟子网中。

主机网络服务 (HNS) 通过私有云插件为容器终结点动态分配 IP 地址。 由于第 2 层地址转换,容器终结点具有唯一的 IP 地址,但共享容器主机(租户)虚拟机的相同 MAC 地址。

这些容器终结点的网络策略(ACL、封装和 QoS)在物理 Hyper-V 主机中强制实施,由网络控制器接收并在上层管理系统中定义。

l2bridge 和 l2tunnel 驱动程序之间的区别是:

l2bridge l2tunnel
驻留在以下位置的容器终结点具有以下特点:
  • 驻留在同一容器主机虚拟机和同一子网上的容器终结点将所有网络流量桥接在 Hyper-V 虚拟交换机内。
  • 驻留在不同容器主机 VM 或不同子网上的容器终结点将其流量转发到物理 Hyper-V 主机。
由于同一主机和同一子网中容器之间的网络流量不会流向物理主机,因此不会强制执行网络策略。 网络策略仅适用于跨主机或跨子网容器网络流量。
无论主机或子网是什么,两个容器终结点之间的所有网络流量都会转发到物理 Hyper-V 主机。 网络策略适用于跨子网和跨主机网络流量。

注意

这些网络模式不适用于将 Windows 容器终结点连接到 Azure 公有云中的租户虚拟网络的情况。

先决条件

  • 带有网络控制器的已部署 SDN 基础结构。

  • 已创建租户虚拟网络。

  • 启用了 Windows 容器功能、安装了 Docker 并启用了 Hyper-V 功能的已部署租户虚拟机。 为 l2bridge 和 l2tunnel 网络安装多个二进制文件需要 Hyper-V 功能。

    # To install HyperV feature without checks for nested virtualization
    dism /Online /Enable-Feature /FeatureName:Microsoft-Hyper-V /All
    

注意

除非使用 Hyper-V 容器,否则不需要嵌套虚拟化和公开虚拟化扩展。

工作流

1. 通过网络控制器(Hyper-V 主机)将多个 IP 配置添加到现有的 VM NIC 资源2. 在主机上启用网络代理,为容器终结点(Hyper-V 主机)分配 CA IP 地址3. 安装私有云插件以将 CA IP 地址分配给容器终结点(容器主机 VM)4. 使用 docker(容器主机 VM)创建 l2bridge 或 l2tunnel 网络

注意

通过 System Center Virtual Machine Manager 创建的 VM NIC 资源不支持多个 IP 配置。 对于这些部署类型,建议使用网络控制器 PowerShell 创建带外 VM NIC 资源。

1. 添加多个 IP 配置

在此步骤中,我们假设租户虚拟机的 VM NIC 有一个 IP 地址为 192.168.1.9 的 IP 配置,并在 192.168.1.0/24 IP 子网中附加到 VNet 资源 ID“VNet1”和 VM 子网资源“Subnet1”。 我们为 192.168.1.101 - 192.168.1.110 范围内的容器添加 10 个 IP 地址。

Import-Module NetworkController

# Specify Network Controller REST IP or FQDN
$uri = "<NC REST IP or FQDN>"
$vnetResourceId = "VNet1"
$vsubnetResourceId = "Subnet1"

$vmnic= Get-NetworkControllerNetworkInterface -ConnectionUri $uri | where {$_.properties.IpConfigurations.Properties.PrivateIPAddress -eq "192.168.1.9" }
$vmsubnet = Get-NetworkControllerVirtualSubnet -VirtualNetworkId $vnetResourceId -ResourceId $vsubnetResourceId -ConnectionUri $uri

# For this demo, we will assume an ACL has already been defined; any ACL can be applied here
$allowallacl = Get-NetworkControllerAccessControlList -ConnectionUri $uri -ResourceId "AllowAll"


foreach ($i in 1..10)
{
    $newipconfig = new-object Microsoft.Windows.NetworkController.NetworkInterfaceIpConfiguration
    $props = new-object Microsoft.Windows.NetworkController.NetworkInterfaceIpConfigurationProperties

    $resourceid = "IP_192_168_1_1"
    if ($i -eq 10)
    {
        $resourceid += "10"
        $ipstr = "192.168.1.110"
    }
    else
    {
        $resourceid += "0$i"
        $ipstr = "192.168.1.10$i"
    }

    $newipconfig.ResourceId = $resourceid
    $props.PrivateIPAddress = $ipstr

    $props.PrivateIPAllocationMethod = "Static"
    $props.Subnet = new-object Microsoft.Windows.NetworkController.Subnet
    $props.Subnet.ResourceRef = $vmsubnet.ResourceRef
    $props.AccessControlList = new-object Microsoft.Windows.NetworkController.AccessControlList
    $props.AccessControlList.ResourceRef = $allowallacl.ResourceRef

    $newipconfig.Properties = $props
    $vmnic.Properties.IpConfigurations += $newipconfig
}

New-NetworkControllerNetworkInterface -ResourceId $vmnic.ResourceId -Properties $vmnic.Properties -ConnectionUri $uri

2. 启用网络代理

在此步骤中,我们启用网络代理为容器主机虚拟机分配多个 IP 地址。

若要启用网络代理,请在托管容器主机(租户)虚拟机的 Hyper-V 主机上运行 ConfigureMCNP.ps1 脚本。

PS C:\> ConfigureMCNP.ps1

3. 安装私有云插件

在此步骤中,请安装插件以允许 HNS 与 Hyper-V 主机上的网络代理通信。

若要安装插件,请在容器主机(租户)虚拟机中运行 InstallPrivateCloudPlugin.ps1 脚本。

PS C:\> InstallPrivateCloudPlugin.ps1

4. 创建 l2bridge 容器网络

在此步骤中,我们在容器主机(租户)虚拟机上使用 docker network create 命令创建 l2bridge 网络。

# Create the container network
C:\> docker network create -d l2bridge --subnet="192.168.1.0/24" --gateway="192.168.1.1" MyContainerOverlayNetwork

# Attach a container to the MyContainerOverlayNetwork
C:\> docker run -it --network=MyContainerOverlayNetwork <image> <cmd>

注意

与 Microsoft SDN 堆栈一起使用时,l2bridge 或 l2tunnel 容器网络不支持静态 IP 分配。

详细信息

若要更详细地了解如何部署 SDN 基础结构,请参阅部署软件定义的网络基础结构