Udostępnij za pośrednictwem


Tryby sieciowe kontenera usługi Service Fabric

Klaster usługi Azure Service Fabric dla usług kontenerów domyślnie używa trybu sieci nat . Gdy nasłuchuje więcej niż jedną usługę kontenera na tym samym porcie, a używany jest tryb nat, mogą wystąpić błędy wdrażania. Aby obsługiwać wiele usług kontenerów nasłuchuje na tym samym porcie, usługa Service Fabric oferuje tryb open networking (wersje 5.7 i nowsze). W trybie otwierania każda usługa kontenera ma wewnętrzny, dynamicznie przypisany adres IP, który obsługuje wiele usług nasłuchiwania na tym samym porcie.

Jeśli masz jedną usługę kontenera ze statycznym punktem końcowym w manifeście usługi, możesz utworzyć i usunąć nowe usługi przy użyciu trybu otwierania bez błędów wdrażania. Ten sam plik docker-compose.yml może być również używany z mapowaniami portów statycznych w celu utworzenia wielu usług.

Gdy usługa kontenera zostanie ponownie uruchomiona lub przeniesiona do innego węzła w klastrze, adres IP ulegnie zmianie. Z tego powodu nie zalecamy używania dynamicznie przypisanego adresu IP do odnajdywania usług kontenerów. Do odnajdywania usługi należy używać tylko usługi Nazewnictwa usługi Service Fabric lub usługi DNS.

Ostrzeżenie

Platforma Azure zezwala na łączną liczbę 65 356 adresów IP na sieć wirtualną. Suma liczby węzłów i liczby wystąpień usługi kontenera (korzystających z trybu otwierania) nie może przekraczać 65 356 adresów IP w sieci wirtualnej. W przypadku scenariuszy o wysokiej gęstości zalecamy używanie trybu sieci nat. Ponadto inne zależności, takie jak moduł równoważenia obciążenia, będą miały inne ograniczenia do rozważenia. Obecnie przetestowano i sprawdzono stabilność do 50 adresów IP na węzeł.

Konfigurowanie trybu open networking

  1. Skonfiguruj szablon usługi Azure Resource Manager. W sekcji sieć szkieletowaUstawienia zasobu klastra włącz usługę DNS i dostawcę adresów IP:

    "fabricSettings": [
                {
                    "name": "DnsService",
                    "parameters": [
                       {
                            "name": "IsEnabled",
                            "value": "true"
                      }
                    ]
                },
                {
                    "name": "Hosting",
                    "parameters": [
                      { 
                            "name": "IPProviderEnabled",
                            "value": "true"
                      }
                    ]
                },
                {
                    "name": "Setup",
                    "parameters": [
                    {
                            "name": "ContainerNetworkSetup",
                            "value": "true"
                    }
                    ]
                }
            ],
    
  2. Skonfiguruj sekcję profilu sieciowego zasobu zestawu skalowania maszyn wirtualnych. Umożliwia to skonfigurowanie wielu adresów IP w każdym węźle klastra. W poniższym przykładzie skonfigurowano pięć adresów IP na węzeł dla klastra usługi Service Fabric systemu Windows/Linux. Na porcie w każdym węźle może być nasłuchiwanie pięciu wystąpień usługi. Aby uzyskać dostęp do pięciu adresów IP z usługi Azure Load Balancer, zarejestruj pięć adresów IP w puli adresów zaplecza usługi Azure Load Balancer, jak pokazano poniżej. Należy również dodać zmienne na początku szablonu w sekcji zmiennych.

    Dodaj tę sekcję do zmiennych:

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

    Dodaj tę sekcję do zasobu zestawu skalowania maszyn wirtualnych:

    "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. Tylko w przypadku klastrów systemu Windows skonfiguruj regułę sieciowej grupy zabezpieczeń platformy Azure, która otwiera port UDP/53 dla sieci wirtualnej z następującymi wartościami:

    Ustawienie Wartość
    Priorytet 2000
    Nazwisko Custom_Dns
    Źródło VirtualNetwork
    Element docelowy VirtualNetwork
    Usługa DNS (UDP/53)
    Akcja Zezwalaj
  4. Określ tryb sieciowy w manifeście aplikacji dla każdej usługi: <NetworkConfig NetworkType="Open">. Otwieranie trybu sieciowego powoduje uzyskanie dedykowanego adresu IP w usłudze. Jeśli tryb nie jest określony, usługa jest domyślnie ustawiona na tryb nat . W poniższym przykładzie manifestu NodeContainerServicePackage1 usługi i NodeContainerServicePackage2 mogą nasłuchiwać na tym samym porcie (obie usługi nasłuchują na Endpoint1). Po określeniu PortBinding trybu otwierania sieci nie można określić konfiguracji.

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

    Można mieszać i dopasowywać różne tryby sieciowe między usługami w aplikacji dla klastra systemu Windows. Niektóre usługi mogą używać trybu otwierania, podczas gdy inne używają trybu nat. Gdy usługa jest skonfigurowana do korzystania z trybu nat, port, na który nasłuchuje usługa, musi być unikatowy.

    Uwaga

    W klastrach systemu Linux mieszanie trybów sieci dla różnych usług nie jest obsługiwane.

  5. Po wybraniu trybu otwierania definicja punktu końcowego w manifeście usługi powinna jawnie wskazywać pakiet kodu odpowiadający punktowi końcowemu, nawet jeśli pakiet usługi ma w nim tylko jeden pakiet kodu.

    <Resources>
      <Endpoints>
        <Endpoint Name="ServiceEndpoint" Protocol="http" Port="80" CodePackageRef="Code"/>
      </Endpoints>
    </Resources>
    
  6. W przypadku systemu Windows ponowne uruchomienie maszyny wirtualnej spowoduje ponowne utworzenie otwartej sieci. Jest to rozwiązanie podstawowego problemu w stosie sieci. Domyślne zachowanie polega na ponownym utworzeniu sieci. Jeśli to zachowanie musi zostać wyłączone, można użyć następującej konfiguracji, a następnie uaktualnić konfigurację.

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

Następne kroki