Dela via


Service Fabric-containernätverkslägen

Ett Azure Service Fabric-kluster för containertjänster använder nat-nätverksläge som standard. När fler än en containertjänst lyssnar på samma port och nat-läge används kan distributionsfel uppstå. För att stöda flera containertjänster som lyssnar på samma port erbjuder Service Fabric öppet nätverksläge (version 5.7 och senare). I öppet läge har varje containertjänst en intern, dynamiskt tilldelad IP-adress som stöder flera tjänster som lyssnar på samma port.

Om du har en containertjänst med en statisk slutpunkt i tjänstmanifestet kan du skapa och ta bort nya tjänster med hjälp av Öppet läge utan distributionsfel. Samma docker-compose.yml-fil kan också användas med statiska portmappningar för att skapa flera tjänster.

När en containertjänst startas om eller flyttas till en annan nod i klustret ändras IP-adressen. Därför rekommenderar vi inte att du använder den dynamiskt tilldelade IP-adressen för att identifiera containertjänster. Endast Service Fabric Naming Service eller DNS-tjänsten ska användas för tjänstidentifiering.

Varning

Azure tillåter totalt 65 356 IP-adresser per virtuellt nätverk. Summan av antalet noder och antalet containertjänstinstanser (som använder öppet läge) får inte överstiga 65 356 IP-adresser i ett virtuellt nätverk. För scenarier med hög densitet rekommenderar vi nat-nätverksläge. Dessutom har andra beroenden, till exempel lastbalanseraren, andra begränsningar att tänka på. För närvarande har upp till 50 IP-adresser per nod testats och visat sig vara stabila.

Konfigurera Öppna nätverksläge

  1. Konfigurera Azure Resource Manager-mallen. I avsnittet fabricSettings i klusterresursen aktiverar du DNS-tjänsten och IP-providern:

    "fabricSettings": [
                {
                    "name": "DnsService",
                    "parameters": [
                       {
                            "name": "IsEnabled",
                            "value": "true"
                      }
                    ]
                },
                {
                    "name": "Hosting",
                    "parameters": [
                      { 
                            "name": "IPProviderEnabled",
                            "value": "true"
                      }
                    ]
                },
                {
                    "name": "Setup",
                    "parameters": [
                    {
                            "name": "ContainerNetworkSetup",
                            "value": "true"
                    }
                    ]
                }
            ],
    
  2. Konfigurera avsnittet nätverksprofil i resursen Vm-skalningsuppsättning. Detta gör att flera IP-adresser kan konfigureras på varje nod i klustret. I följande exempel konfigureras fem IP-adresser per nod för ett Windows/Linux Service Fabric-kluster. Du kan ha fem tjänstinstanser som lyssnar på porten på varje nod. Om du vill att de fem IP-adresserna ska vara tillgängliga från Azure Load Balancer registrerar du de fem IP-adresserna i Azure Load Balancer serverdelsadresspool enligt nedan. Du måste också lägga till variablerna överst i mallen i avsnittet variabler.

    Lägg till det här avsnittet i Variabler:

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

    Lägg till det här avsnittet i resursen Vm-skalningsuppsättning:

    "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. Endast för Windows-kluster konfigurerar du en NSG-regel (Azure Network Security Group) som öppnar port UDP/53 för det virtuella nätverket med följande värden:

    Inställningen Värde
    Prioritet 2000
    Name Custom_Dns
    Källa VirtualNetwork
    Mål VirtualNetwork
    Tjänst DNS (UDP/53)
    Åtgärd Tillåt
  4. Ange nätverksläget i programmanifestet för varje tjänst: <NetworkConfig NetworkType="Open">. Öppna nätverksläget resulterar i att tjänsten får en dedikerad IP-adress. Om inget läge har angetts är tjänsten som standard nat-läge . I följande manifestexempel NodeContainerServicePackage1 kan tjänsterna och var och NodeContainerServicePackage2 en lyssna på samma port (båda tjänsterna lyssnar på Endpoint1). När Öppna nätverksläge har angetts PortBinding går det inte att ange konfigurationer.

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

    Du kan blanda och matcha olika nätverkslägen mellan tjänster i ett program för ett Windows-kluster. Vissa tjänster kan använda öppet läge medan andra använder nat-läge. När en tjänst har konfigurerats för att använda nat-läge måste porten som tjänsten lyssnar på vara unik.

    Anteckning

    På Linux-kluster stöds inte blandning av nätverkslägen för olika tjänster.

  5. När läget Öppna har valts ska slutpunktsdefinitionen i tjänstmanifestet uttryckligen peka på kodpaketet som motsvarar slutpunkten, även om tjänstpaketet bara har ett kodpaket i sig.

    <Resources>
      <Endpoints>
        <Endpoint Name="ServiceEndpoint" Protocol="http" Port="80" CodePackageRef="Code"/>
      </Endpoints>
    </Resources>
    
  6. För Windows gör en omstart av den virtuella datorn att det öppna nätverket återskapas. Det här är för att åtgärda ett underliggande problem i nätverksstacken. Standardbeteendet är att återskapa nätverket. Om det här beteendet måste inaktiveras kan följande konfiguration användas följt av en konfigurationsuppgradering.

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

Nästa steg