共用方式為


Service Fabric 容器網路模式

適用於容器服務的 Azure Service Fabric 叢集預設會使用 nat 網路模式。 當有多個容器服務在相同的連接埠上接聽,且正在使用 nat 模式時,可能會發生部署錯誤。 為了支援在相同連接埠上進行多個容器服務接聽,Service Fabric 會提供 Open 網路模式 (5.7 版及更新版本)。 在 Open 模式下,每個容器服務都具一個以動態方式指派的內部 IP 位址,此 IP 位址可支援在相同連接埠上進行多個服務接聽。

如果您的其中一個容器服務在服務資訊清單中含有靜態端點,可以使用 Open 模式來建立與刪除新的服務,而不會發生任何部署錯誤。 相同的 docker-compose.yml 檔案也可以搭配靜態連接埠對應使用,以建立多個服務。

當某個容器服務重新啟動或移到叢集中的另一個節點時,IP 位址便會變更。 因此,不建議使用以動態方式指派的 IP 位址來探索容器服務。 只有 Service Fabric 命名服務或 DNS 服務可用於服務探索。

警告

Azure 允許每個虛擬網路總計最多可有 65,356 個 IP。 在虛擬網路內,節點數目和容器服務執行個體 (使用開放模式) 的數目總和不得超過 65,356 個 IP。 針對高密度的情況,建議使用 nat 網路模式。 此外,其他相依性 (如負載平衡器) 也須考慮其他 限制。 目前各節點最多已有 50 個 IP 經過測試和證實穩定。

設定 Open 網路模式

  1. 設定 Azure Resource Manager 範本。 在叢集資源的 [fabricSettings] 區段中,啟用 DNS 服務及 IP 提供者:

    "fabricSettings": [
                {
                    "name": "DnsService",
                    "parameters": [
                       {
                            "name": "IsEnabled",
                            "value": "true"
                      }
                    ]
                },
                {
                    "name": "Hosting",
                    "parameters": [
                      { 
                            "name": "IPProviderEnabled",
                            "value": "true"
                      }
                    ]
                },
                {
                    "name": "Setup",
                    "parameters": [
                    {
                            "name": "ContainerNetworkSetup",
                            "value": "true"
                    }
                    ]
                }
            ],
    
  2. 設定虛擬機器擴展集資源的網路設定檔區段。 這允許在叢集的每個節點上設定多個 IP 位址。 下列範例會針對 Windows/Linux Service Fabric 叢集的每個節點,設定五個 IP 位址。 您可以在每個節點的連接埠上接聽五個服務執行個體。 若要讓五個 IP 可從 Azure Load Balancer 存取,請在 Azure Load Balancer 後端位址集區註冊五個 IP,如下所示。 您也需要在 variables 區段中將變數新增到您範本的頂端。

    將以下區段新增至 Variables:

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

    將以下區段新增至虛擬機器擴展集資源:

    "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. 僅針對 Windows 叢集,使用下列值來設定能針對虛擬網路開啟連接埠 UDP/53 的 Azure 網路安全性群組 (NSG) 規則:

    設定
    優先順序 2000
    名稱 Custom_Dns
    來源 VirtualNetwork
    Destination VirtualNetwork
    服務 DNS (UDP/53)
    動作 允許
  4. 在每個服務的應用程式資訊清單中指定網路模式:<NetworkConfig NetworkType="Open">Open 網路模式會使服務取得專用 IP 位址。 如果未指定模式,服務會預設為 nat 模式。 在下列資訊清單範例中,NodeContainerServicePackage1NodeContainerServicePackage2 服務可以分別在相同的連接埠上接聽 (這兩個服務都會在 Endpoint1 上接聽)。 指定 Open 網路模式之後,就無法指定 PortBinding 設定。

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

    您可以跨 Windows 叢集之應用程式內的服務,混合和比對不同網路模式。 有些服務可以使用 Open 模式,有些服務則是使用 nat 模式。 當服務設定為使用 nat 模式時,服務接聽的連接埠必須是唯一的。

    注意

    在 Linux 叢集上,不支援針對不同服務混合網路模式。

  5. 選取 [開啟] 模式時,服務資訊清單中的 [端點] 定義應該明確地指向對應至端點的程式碼套件,即使服務套件中只有一個程式碼套件也是一樣。

    <Resources>
      <Endpoints>
        <Endpoint Name="ServiceEndpoint" Protocol="http" Port="80" CodePackageRef="Code"/>
      </Endpoints>
    </Resources>
    
  6. 就 Windows 而言、VM 重新開機將會導致開放式網路重新建立。 這是為了緩解網路堆疊中潛藏的問題。 預設行為是重新建立網路。 如果必須關閉此行為,您可以在進行組態升級之前使用下列組態。

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

下一步