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ödja 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 Läget Öppna nätverk

  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-serverdelsadresspoolen 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 vm-skalningsuppsättningsresursen:

    "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ällning 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 NodeContainerServicePackage2 lyssna på samma port (båda tjänsterna lyssnar på Endpoint1). När Läget Öppna nätverk 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.

    Kommentar

    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å det kodpaket 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