Service Fabric-containernetwerkmodi

Een Azure Service Fabric-cluster voor containerservices maakt standaard gebruik van de nat-netwerkmodus . Wanneer meer dan één containerservice op dezelfde poort luistert en de NAT-modus wordt gebruikt, kunnen er implementatiefouten optreden. Ter ondersteuning van meerdere containerservices die op dezelfde poort luisteren, biedt Service Fabric de open netwerkmodus (versie 5.7 en hoger). In de open modus heeft elke containerservice een intern, dynamisch toegewezen IP-adres dat ondersteuning biedt voor meerdere services die op dezelfde poort luisteren.

Als u één containerservice met een statisch eindpunt in uw servicemanifest hebt, kunt u nieuwe services maken en verwijderen met behulp van de open-modus zonder implementatiefouten. Hetzelfde bestand docker-compose.yml kan ook worden gebruikt met statische poorttoewijzingen om meerdere services te maken.

Wanneer een containerservice opnieuw wordt opgestart of verplaatst naar een ander knooppunt in het cluster, verandert het IP-adres. Daarom raden we u af om het dynamisch toegewezen IP-adres te gebruiken om containerservices te detecteren. Alleen de Service Fabric-naamgevingsservice of de DNS-service mag worden gebruikt voor servicedetectie.

Waarschuwing

Azure staat in totaal 65.356 IP-adressen per virtueel netwerk toe. De som van het aantal knooppunten en het aantal containerservice-exemplaren (dat de Open-modus gebruikt) mag niet groter zijn dan 65.356 IP-adressen binnen een virtueel netwerk. Voor high-densityscenario's raden we de NAT-netwerkmodus aan. Daarnaast hebben andere afhankelijkheden, zoals de load balancer, andere beperkingen om rekening mee te houden. Momenteel zijn maximaal 50 IP-adressen per knooppunt getest en stabiel gebleken.

Open netwerkmodus instellen

  1. Stel de Azure Resource Manager-sjabloon in. Schakel in de sectie fabricSettings van de clusterresource de DNS-service en de IP-provider in:

    "fabricSettings": [
                {
                    "name": "DnsService",
                    "parameters": [
                       {
                            "name": "IsEnabled",
                            "value": "true"
                      }
                    ]
                },
                {
                    "name": "Hosting",
                    "parameters": [
                      { 
                            "name": "IPProviderEnabled",
                            "value": "true"
                      }
                    ]
                },
                {
                    "name": "Setup",
                    "parameters": [
                    {
                            "name": "ContainerNetworkSetup",
                            "value": "true"
                    }
                    ]
                }
            ],
    
  2. Stel de sectie netwerkprofiel van de resource Virtuele-machineschaalset in. Hierdoor kunnen meerdere IP-adressen worden geconfigureerd op elk knooppunt van het cluster. In het volgende voorbeeld worden vijf IP-adressen per knooppunt ingesteld voor een Windows/Linux Service Fabric-cluster. U kunt vijf service-exemplaren hebben die luisteren op de poort op elk knooppunt. Als u wilt dat de vijf IP-adressen toegankelijk zijn vanuit de Azure Load Balancer, registreert u de vijf IP-adressen in de Azure Load Balancer back-endadresgroep, zoals hieronder wordt weergegeven. U moet ook de variabelen toevoegen aan de bovenkant van uw sjabloon in de sectie variabelen.

    Voeg deze sectie toe aan Variabelen:

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

    Voeg deze sectie toe aan de resource Virtuele-machineschaalset:

    "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. Stel alleen voor Windows-clusters een NSG-regel (Azure Network Security Group) in waarmee poort UDP/53 voor het virtuele netwerk wordt geopend met de volgende waarden:

    Instelling Waarde
    Prioriteit 2000
    Naam Custom_Dns
    Bron VirtualNetwork
    Doel VirtualNetwork
    Service DNS (UDP/53)
    Actie Toestaan
  4. Geef de netwerkmodus op in het toepassingsmanifest voor elke service: <NetworkConfig NetworkType="Open">. Als u de netwerkmodus opent, krijgt de service een toegewezen IP-adres. Als er geen modus is opgegeven, wordt de service standaard ingesteld op de NAT-modus . In het volgende manifestvoorbeeld kunnen de NodeContainerServicePackage1 services en NodeContainerServicePackage2 elk op dezelfde poort luisteren (beide services luisteren op Endpoint1). Wanneer De netwerkmodus Openen is opgegeven, PortBinding kunnen er geen configuraties worden opgegeven.

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

    U kunt verschillende netwerkmodi in verschillende services combineren binnen een toepassing voor een Windows-cluster. Sommige services kunnen de modus Open gebruiken, terwijl andere de NAT-modus gebruiken. Wanneer een service is geconfigureerd voor het gebruik van de NAT-modus, moet de poort waarop de service luistert uniek zijn.

    Notitie

    Op Linux-clusters wordt het combineren van netwerkmodi voor verschillende services niet ondersteund.

  5. Wanneer de modus Openen is geselecteerd, moet de eindpuntdefinitie in het servicemanifest expliciet verwijzen naar het codepakket dat overeenkomt met het eindpunt, zelfs als het servicepakket slechts één codepakket bevat.

    <Resources>
      <Endpoints>
        <Endpoint Name="ServiceEndpoint" Protocol="http" Port="80" CodePackageRef="Code"/>
      </Endpoints>
    </Resources>
    
  6. Voor Windows zorgt het opnieuw opstarten van een VM ervoor dat het geopende netwerk opnieuw wordt gemaakt. Dit is om een onderliggend probleem in de netwerkstack te verhelpen. Het standaardgedrag is om het netwerk opnieuw te maken. Als dit gedrag moet worden uitgeschakeld, kan de volgende configuratie worden gebruikt, gevolgd door een configuratie-upgrade.

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

Volgende stappen