Síťové režimy kontejneru Service Fabric

Cluster Azure Service Fabric pro služby kontejnerů ve výchozím nastavení používá síťový režim NAT . Pokud na stejném portu naslouchá více než jedna služba kontejneru a používá se režim nat, může dojít k chybám nasazení. Service Fabric nabízí režim otevřené sítě (verze 5.7 a novější) pro podporu více služeb kontejneru, které naslouchají na stejném portu. V otevřeném režimu má každá služba kontejneru interní dynamicky přiřazenou IP adresu, která podporuje více služeb, které naslouchají na stejném portu.

Pokud máte v manifestu služby jednu službu kontejneru se statickým koncovým bodem, můžete vytvořit a odstranit nové služby pomocí režimu otevření bez chyb nasazení. Stejný soubor docker-compose.yml je také možné použít se statickým mapováním portů k vytvoření více služeb.

Když se služba kontejneru restartuje nebo se přesune do jiného uzlu v clusteru, IP adresa se změní. Z tohoto důvodu nedoporučujeme ke zjišťování služeb kontejneru používat dynamicky přiřazenou IP adresu. Ke zjišťování služeb by se měla používat pouze služba pojmenování Service Fabric nebo služba DNS.

Upozornění

Azure umožňuje celkem 65 356 IP adres na virtuální síť. Součet počtu uzlů a počtu instancí služby kontejneru (které používají režim Open) nesmí překročit 65 356 IP adres ve virtuální síti. Pro scénáře s vysokou hustotou doporučujeme režim sítě NAT. Kromě toho další závislosti, jako je nástroj pro vyrovnávání zatížení, budou mít další omezení , která je potřeba zvážit. V současné době bylo testováno až 50 IP adres na uzel a ukázalo se, že jsou stabilní.

Nastavení režimu Otevřené sítě

  1. Nastavte šablonu Azure Resource Manager. V části fabricSettings prostředku clusteru povolte službu DNS a poskytovatele IP:

    "fabricSettings": [
                {
                    "name": "DnsService",
                    "parameters": [
                       {
                            "name": "IsEnabled",
                            "value": "true"
                      }
                    ]
                },
                {
                    "name": "Hosting",
                    "parameters": [
                      { 
                            "name": "IPProviderEnabled",
                            "value": "true"
                      }
                    ]
                },
                {
                    "name": "Setup",
                    "parameters": [
                    {
                            "name": "ContainerNetworkSetup",
                            "value": "true"
                    }
                    ]
                }
            ],
    
  2. Nastavte část profilu sítě prostředku škálovací sady virtuálních počítačů. To umožňuje konfiguraci několika IP adres na každém uzlu clusteru. Následující příklad nastaví pět IP adres na uzel pro cluster Service Fabric se systémem Windows nebo Linux. Na každém uzlu můžete mít pět instancí služby, které naslouchají na portu. Pokud chcete mít z Azure Load Balancer přístup k pěti IP adresám, zaregistrujte pět IP adres ve fondu back-endových adres Azure Load Balancer, jak je znázorněno níže. Proměnné budete také muset přidat na začátek šablony v oddílu variables.

    Do části Proměnné přidejte tento oddíl:

    "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')]"
    }
    

    Do prostředku škálovací sady virtuálních počítačů přidejte tuto část:

    "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. Pouze pro clustery s Windows nastavte pravidlo skupiny zabezpečení sítě (NSG) Azure, které otevře port UDP/53 pro virtuální síť s následujícími hodnotami:

    Nastavení Hodnota
    Priorita 2000
    Name Custom_Dns
    Zdroj VirtualNetwork
    Cíl VirtualNetwork
    Služba DNS (UDP/53)
    Akce Povolit
  4. Zadejte režim sítě v manifestu aplikace pro každou službu: <NetworkConfig NetworkType="Open">. Otevřený síťový režim způsobí, že služba získá vyhrazenou IP adresu. Pokud není režim zadaný, služba ve výchozím nastavení použije režim nat . V následujícím příkladu manifestu NodeContainerServicePackage1 můžou služby a NodeContainerServicePackage2 naslouchat na stejném portu (obě služby naslouchají na Endpoint1). Pokud je zadán režim otevřené sítě, PortBinding nelze zadat konfiguraci.

    <?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>
    

    Pro cluster s Windows můžete kombinovat různé síťové režimy mezi službami v rámci aplikace. Některé služby můžou používat režim Otevření, zatímco jiné režim překladu adres (NAT). Pokud je služba nakonfigurovaná tak, aby používala režim nat, port, na který služba naslouchá, musí být jedinečný.

    Poznámka

    V clusterech s Linuxem není podporováno kombinování síťových režimů pro různé služby.

  5. Když je vybraný režim Otevření , definice koncového bodu v manifestu služby by měla explicitně odkazovat na balíček kódu odpovídající koncovému bodu, a to i v případě, že balíček služby obsahuje pouze jeden balíček kódu.

    <Resources>
      <Endpoints>
        <Endpoint Name="ServiceEndpoint" Protocol="http" Port="80" CodePackageRef="Code"/>
      </Endpoints>
    </Resources>
    
  6. Restartování virtuálního počítače ve Windows způsobí opětovné vytvoření otevřené sítě. Cílem je zmírnit základní problém v síťovém zásobníku. Výchozí chování spočívá v opětovném vytvoření sítě. Pokud je toto chování potřeba vypnout, je možné použít následující konfiguraci následovanou upgradem konfigurace.

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

Další kroky