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 網路模式
設定 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" } ] } ],
設定虛擬機器擴展集資源的網路設定檔區段。 這允許在叢集的每個節點上設定多個 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 } } ] }
僅針對 Windows 叢集,使用下列值來設定能針對虛擬網路開啟連接埠 UDP/53 的 Azure 網路安全性群組 (NSG) 規則:
設定 值 優先順序 2000 名稱 Custom_Dns 來源 VirtualNetwork Destination VirtualNetwork 服務 DNS (UDP/53) 動作 允許 在每個服務的應用程式資訊清單中指定網路模式:
<NetworkConfig NetworkType="Open">
。 Open 網路模式會使服務取得專用 IP 位址。 如果未指定模式,服務會預設為 nat 模式。 在下列資訊清單範例中,NodeContainerServicePackage1
和NodeContainerServicePackage2
服務可以分別在相同的連接埠上接聽 (這兩個服務都會在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 叢集上,不支援針對不同服務混合網路模式。
選取 [開啟] 模式時,服務資訊清單中的 [端點] 定義應該明確地指向對應至端點的程式碼套件,即使服務套件中只有一個程式碼套件也是一樣。
<Resources> <Endpoints> <Endpoint Name="ServiceEndpoint" Protocol="http" Port="80" CodePackageRef="Code"/> </Endpoints> </Resources>
就 Windows 而言、VM 重新開機將會導致開放式網路重新建立。 這是為了緩解網路堆疊中潛藏的問題。 預設行為是重新建立網路。 如果必須關閉此行為,您可以在進行組態升級之前使用下列組態。
"fabricSettings": [
{
"name": "Setup",
"parameters": [
{
"name": "SkipContainerNetworkResetOnReboot",
"value": "true"
}
]
}
],