Partilhar via


Modos de rede de contêiner do Service Fabric

Um cluster do Azure Service Fabric para serviços de contêiner usa o modo de rede nat por padrão. Quando mais de um serviço de contêiner está escutando na mesma porta e o modo nat está sendo usado, erros de implantação podem ocorrer. Para oferecer suporte a vários serviços de contêiner escutando na mesma porta, o Service Fabric oferece o modo de rede aberta (versões 5.7 e posteriores). No modo aberto, cada serviço de contêiner tem um endereço IP interno atribuído dinamicamente que suporta vários serviços escutando na mesma porta.

Se você tiver um serviço de contêiner com um ponto de extremidade estático em seu manifesto de serviço, poderá criar e excluir novos serviços usando o modo Aberto sem erros de implantação. O mesmo arquivo docker-compose.yml também pode ser usado com mapeamentos de porta estática para criar vários serviços.

Quando um serviço de contêiner é reiniciado ou se move para outro nó no cluster, o endereço IP é alterado. Por esse motivo, não recomendamos o uso do endereço IP atribuído dinamicamente para descobrir serviços de contêiner. Somente o Serviço de Nomenclatura do Service Fabric ou o Serviço DNS deve ser usado para a descoberta do serviço.

Aviso

O Azure permite um total de 65.356 IPs por rede virtual. A soma do número de nós e o número de instâncias de serviço de contêiner (que estão usando o modo Aberto) não pode exceder 65.356 IPs em uma rede virtual. Para cenários de alta densidade, recomendamos o modo de rede nat. Além disso, outras dependências, como o balanceador de carga, terão outras limitações a serem consideradas. Atualmente, até 50 IPs por nó foram testados e provaram ser estáveis.

Configurar o modo de rede aberta

  1. Configure o modelo do Azure Resource Manager. Na seção fabricSettings do recurso Cluster, habilite o Serviço DNS e o Provedor IP:

    "fabricSettings": [
                {
                    "name": "DnsService",
                    "parameters": [
                       {
                            "name": "IsEnabled",
                            "value": "true"
                      }
                    ]
                },
                {
                    "name": "Hosting",
                    "parameters": [
                      { 
                            "name": "IPProviderEnabled",
                            "value": "true"
                      }
                    ]
                },
                {
                    "name": "Setup",
                    "parameters": [
                    {
                            "name": "ContainerNetworkSetup",
                            "value": "true"
                    }
                    ]
                }
            ],
    
  2. Configure a seção de perfil de rede do recurso Conjunto de Escala de Máquina Virtual. Isso permite que vários endereços IP sejam configurados em cada nó do cluster. O exemplo a seguir configura cinco endereços IP por nó para um cluster do Windows/Linux Service Fabric. Você pode ter cinco instâncias de serviço escutando na porta em cada nó. Para que os cinco IPs estejam acessíveis a partir do Balanceador de Carga do Azure, inscreva os cinco IPs no Pool de Endereços de Back-end do Balanceador de Carga do Azure, conforme mostrado abaixo. Você também precisará adicionar as variáveis à parte superior do seu modelo na seção de variáveis.

    Adicione esta seção a Variáveis:

    "variables": {
        "nicName": "NIC",
        "vmName": "vm",
        "virtualNetworkName": "VNet",
        "vnetID": "[resourceId('Microsoft.Network/virtualNetworks',variables('virtualNetworkName'))]",
        "vmNodeType0Name": "[toLower(concat('NT1', variables('vmName')))]",
        "subnet0Name": "Subnet-0",
        "subnet0Prefix": "10.0.0.0/24",
        "subnet0Ref": "[concat(variables('vnetID'),'/subnets/',variables('subnet0Name'))]",
        "lbID0": "[resourceId('Microsoft.Network/loadBalancers',concat('LB','-', parameters('clusterName'),'-',variables('vmNodeType0Name')))]",
        "lbIPConfig0": "[concat(variables('lbID0'),'/frontendIPConfigurations/LoadBalancerIPConfig')]",
        "lbPoolID0": "[concat(variables('lbID0'),'/backendAddressPools/LoadBalancerBEAddressPool')]",
        "lbProbeID0": "[concat(variables('lbID0'),'/probes/FabricGatewayProbe')]",
        "lbHttpProbeID0": "[concat(variables('lbID0'),'/probes/FabricHttpGatewayProbe')]",
        "lbNatPoolID0": "[concat(variables('lbID0'),'/inboundNatPools/LoadBalancerBEAddressNatPool')]"
    }
    

    Adicione esta seção ao recurso Conjunto de Dimensionamento de Máquina Virtual:

    "networkProfile": {
                "networkInterfaceConfigurations": [
                  {
                    "name": "[concat(parameters('nicName'), '-0')]",
                    "properties": {
                      "ipConfigurations": [
                        {
                          "name": "[concat(parameters('nicName'),'-',0)]",
                          "properties": {
                            "primary": "true",
                            "loadBalancerBackendAddressPools": [
                              {
                                "id": "[variables('lbPoolID0')]"
                              }
                            ],
                            "loadBalancerInboundNatPools": [
                              {
                                "id": "[variables('lbNatPoolID0')]"
                              }
                            ],
                            "subnet": {
                              "id": "[variables('subnet0Ref')]"
                            }
                          }
                        },
                        {
                          "name": "[concat(parameters('nicName'),'-', 1)]",
                          "properties": {
                            "primary": "false",
                            "loadBalancerBackendAddressPools": [
                              {
                                "id": "[variables('lbPoolID0')]"
                              }
                            ],
                            "subnet": {
                              "id": "[variables('subnet0Ref')]"
                            }
                          }
                        },
                        {
                          "name": "[concat(parameters('nicName'),'-', 2)]",
                          "properties": {
                            "primary": "false",
                            "loadBalancerBackendAddressPools": [
                              {
                                "id": "[variables('lbPoolID0')]"
                              }
                            ],
                            "subnet": {
                              "id": "[variables('subnet0Ref')]"
                            }
                          }
                        },
                        {
                          "name": "[concat(parameters('nicName'),'-', 3)]",
                          "properties": {
                            "primary": "false",
                            "loadBalancerBackendAddressPools": [
                              {
                                "id": "[variables('lbPoolID0')]"
                              }
                            ],
                            "subnet": {
                              "id": "[variables('subnet0Ref')]"
                            }
                          }
                        },
                        {
                          "name": "[concat(parameters('nicName'),'-', 4)]",
                          "properties": {
                            "primary": "false",
                            "loadBalancerBackendAddressPools": [
                              {
                                "id": "[variables('lbPoolID0')]"
                              }
                            ],
                            "subnet": {
                              "id": "[variables('subnet0Ref')]"
                            }
                          }
                        },
                        {
                          "name": "[concat(parameters('nicName'),'-', 5)]",
                          "properties": {
                            "primary": "false",
                            "loadBalancerBackendAddressPools": [
                              {
                                "id": "[variables('lbPoolID0')]"
                              }
                            ],
                            "subnet": {
                              "id": "[variables('subnet0Ref')]"
                            }
                          }
                        }
                      ],
                      "primary": true
                    }
                  }
                ]
              }
    
  3. Somente para clusters do Windows, configure uma regra NSG (Grupo de Segurança de Rede) do Azure que abra a porta UDP/53 para a rede virtual com os seguintes valores:

    Definição Value
    Prioridade 2000
    Nome Custom_Dns
    Origem VirtualNetwork
    Destino VirtualNetwork
    Serviço DNS (UDP/53)
    Ação Permitir
  4. Especifique o modo de rede no manifesto do aplicativo para cada serviço: <NetworkConfig NetworkType="Open">. O modo de rede aberta faz com que o serviço obtenha um endereço IP dedicado. Se um modo não for especificado, o serviço assume como padrão o modo nat . No exemplo de manifesto a seguir, os NodeContainerServicePackage1 e NodeContainerServicePackage2 serviços podem escutar cada um na mesma porta (ambos os serviços estão escutando em Endpoint1). Quando o modo de rede aberta é especificado, PortBinding as configurações não podem ser especificadas.

    <?xml version="1.0" encoding="UTF-8"?>
    <ApplicationManifest ApplicationTypeName="NodeJsApp" ApplicationTypeVersion="1.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
      <Description>Calculator Application</Description>
      <Parameters>
        <Parameter Name="ServiceInstanceCount" DefaultValue="3"></Parameter>
        <Parameter Name="MyCpuShares" DefaultValue="3"></Parameter>
      </Parameters>
      <ServiceManifestImport>
        <ServiceManifestRef ServiceManifestName="NodeContainerServicePackage1" ServiceManifestVersion="1.0"/>
        <Policies>
          <ContainerHostPolicies CodePackageRef="NodeContainerService1.Code" Isolation="hyperv">
           <NetworkConfig NetworkType="Open"/>
          </ContainerHostPolicies>
        </Policies>
      </ServiceManifestImport>
      <ServiceManifestImport>
        <ServiceManifestRef ServiceManifestName="NodeContainerServicePackage2" ServiceManifestVersion="1.0"/>
        <Policies>
          <ContainerHostPolicies CodePackageRef="NodeContainerService2.Code" Isolation="default">
            <NetworkConfig NetworkType="Open"/>
          </ContainerHostPolicies>
        </Policies>
      </ServiceManifestImport>
    </ApplicationManifest>
    

    Você pode misturar e combinar diferentes modos de rede entre serviços dentro de um aplicativo para um cluster do Windows. Alguns serviços podem usar o modo aberto, enquanto outros usam o modo nat. Quando um serviço é configurado para usar o modo nat, a porta na qual o serviço está escutando deve ser exclusiva.

    Nota

    Em clusters Linux, não há suporte para a mistura de modos de rede para diferentes serviços.

  5. Quando o modo Aberto é selecionado, a definição de Ponto de Extremidade no manifesto de serviço deve apontar explicitamente para o pacote de código correspondente ao ponto de extremidade, mesmo que o pacote de serviço tenha apenas um pacote de código.

    <Resources>
      <Endpoints>
        <Endpoint Name="ServiceEndpoint" Protocol="http" Port="80" CodePackageRef="Code"/>
      </Endpoints>
    </Resources>
    
  6. Para o Windows, uma reinicialização da VM fará com que a rede aberta seja recriada. Isso é para mitigar um problema subjacente na pilha de rede. O comportamento padrão é recriar a rede. Se esse comportamento precisar ser desativado, a configuração a seguir pode ser usada seguida por uma atualização de configuração.

"fabricSettings": [
                {
                    "name": "Setup",
                    "parameters": [
                    {
                            "name": "SkipContainerNetworkResetOnReboot",
                            "value": "true"
                    }
                    ]
                }
            ],          

Próximos passos