Samouczek: skalowanie klastra usługi Service Fabric na platformie Azure

Ten samouczek jest trzecią częścią serii i pokazuje, jak skalować istniejący klaster w poziomie i w poziomie. Ukończenie tego samouczka pozwoli Ci uzyskać wiedzę na temat skalowania klastra i czyszczenia pozostałych zasobów. Aby uzyskać więcej informacji na temat skalowania klastra uruchomionego na platformie Azure, przeczytaj Scaling Service Fabric clusters (Skalowanie klastrów usługi Service Fabric).

Ten samouczek zawiera informacje na temat wykonywania następujących czynności:

  • Dodawanie i usuwanie węzłów (skalowanie w poziomie i skalowanie w poziomie)
  • Dodawanie i usuwanie typów węzłów (skalowanie w poziomie i skalowanie w poziomie)
  • Zwiększanie zasobów węzłów (skalowanie w górę)

Ta seria samouczków zawiera informacje na temat wykonywania następujących czynności:

Uwaga

Zalecamy korzystanie z modułu Azure Az programu PowerShell do interakcji z platformą Azure. Zobacz Instalowanie programu Azure PowerShell, aby rozpocząć. Aby dowiedzieć się, jak przeprowadzić migrację do modułu Az PowerShell, zobacz Migracja programu Azure PowerShell z modułu AzureRM do modułu Az.

Wymagania wstępne

Przed rozpoczęciem tego samouczka:

Ważne zagadnienia i wskazówki

Obciążenia aplikacji zmieniają się w czasie, czy istniejące usługi potrzebują więcej (lub mniej) zasobów? Dodawanie lub usuwanie węzłów z typu węzła w celu zwiększenia lub zmniejszenia zasobów klastra.

Czy musisz dodać do klastra więcej niż 100 węzłów? Pojedynczy typ/zestaw skalowania węzła usługi Service Fabric nie może zawierać więcej niż 100 węzłów/maszyn wirtualnych. Aby skalować klaster powyżej 100 węzłów, dodaj dodatkowe typy węzłów.

Czy aplikacja ma wiele usług i czy każda z nich musi być publiczna lub dostępna w Internecie? Typowe aplikacje zawierają usługę bramy frontonu, która odbiera dane wejściowe od klienta i co najmniej jedną usługę zaplecza komunikującą się z usługami frontonu. W takim przypadku zalecamy dodanie co najmniej dwóch typów węzłów do klastra.

Czy usługi mają różne potrzeby dotyczące infrastruktury, takie jak większe wykorzystanie pamięci RAM lub wyższe cykle procesora CPU? Na przykład aplikacja zawiera usługę frontonu i usługę zaplecza. Usługa frontonu może działać na mniejszych maszynach wirtualnych (takich jak D2), które mają otwarte porty w Internecie. Jednak usługa zaplecza intensywnie korzysta z obliczeń i musi działać na większych maszynach wirtualnych (z rozmiarami maszyn wirtualnych, takimi jak D4, D6, D15), które nie są dostępne z Internetu. W takim przypadku zalecamy dodanie co najmniej dwóch typów węzłów do klastra. Dzięki temu każdy typ węzła może mieć odrębne właściwości, takie jak łączność z Internetem lub rozmiar maszyny wirtualnej. Liczbę maszyn wirtualnych można również skalować niezależnie.

Podczas skalowania klastra platformy Azure należy pamiętać o następujących wytycznych:

  • Pojedynczy typ/zestaw skalowania węzła usługi Service Fabric nie może zawierać więcej niż 100 węzłów/maszyn wirtualnych. Aby skalować klaster powyżej 100 węzłów, dodaj dodatkowe typy węzłów.
  • Podstawowe typy węzłów z uruchomionymi obciążeniami produkcyjnymi powinny mieć poziom trwałości Gold lub Silver i zawsze mieć co najmniej pięć węzłów.
  • Typy węzłów innych niż podstawowe z uruchomionymi stanowymi obciążeniami produkcyjnymi powinny mieć zawsze pięć lub więcej węzłów.
  • Typy węzłów innych niż podstawowe z uruchomionymi bezstanowymi obciążeniami produkcyjnymi powinny zawsze mieć co najmniej dwa węzły.
  • Każdy typ węzła poziomu trwałości Gold lub Silver powinien zawsze mieć pięć lub więcej węzłów.
  • W przypadku skalowania w poziomie (usuwania węzłów z) typu węzła podstawowego nigdy nie należy zmniejszać liczby wystąpień do mniejszej niż wymagany poziom niezawodności .

Aby uzyskać więcej informacji, przeczytaj wskazówki dotyczące pojemności klastra.

Eksportowanie szablonu dla grupy zasobów

Po utworzeniu bezpiecznego klastra systemu Windows i pomyślnym skonfigurowaniu grupy zasobów wyeksportuj szablon Resource Manager dla grupy zasobów. Eksportowanie szablonu umożliwia zautomatyzowanie przyszłych wdrożeń klastra i jego zasobów, ponieważ szablon zawiera całą pełną infrastrukturę. Aby uzyskać więcej informacji na temat eksportowania szablonów, przeczytaj Zarządzanie grupami zasobów usługi Azure Resource Manager przy użyciu Azure Portal.

  1. W Azure Portal przejdź do grupy zasobów zawierającej klaster (sfclustertutorialgroup, jeśli korzystasz z tego samouczka).

  2. W okienku po lewej stronie wybierz pozycję Wdrożenia lub wybierz link w obszarze Wdrożenia.

  3. Wybierz najnowsze pomyślne wdrożenie z listy.

  4. W okienku po lewej stronie wybierz pozycję Szablon , a następnie wybierz pozycję Pobierz , aby wyeksportować szablon jako plik ZIP. Zapisz szablon i parametry na komputerze lokalnym.

Dodawanie węzłów do węzłów lub usuwanie ich z typu węzła

Skalowanie w poziomie i w poziomie zmienia liczbę węzłów w klastrze. Podczas skalowania w poziomie lub w poziomie do zestawu skalowania dodaje się więcej wystąpień maszyn wirtualnych. Wystąpienia te stają się węzłami używanymi przez usługę Service Fabric. Usługa Service Fabric wykrywa zwiększenie liczby wystąpień (efekt skalowania w poziomie) i reaguje automatycznie. Klaster można skalować w dowolnym momencie, nawet wtedy, gdy obciążenia są uruchomione w klastrze.

Aktualizowanie szablonu

Wyeksportuj plik szablonu i parametrów z grupy zasobów na potrzeby ostatniego wdrożenia. Otwórz plik parameters.json . Jeśli klaster został wdrożony przy użyciu przykładowego szablonu w tym samouczku , istnieją trzy typy węzłów w klastrze i trzy parametry, które ustawiają liczbę węzłów dla każdego typu węzła: nt0InstanceCount, nt1InstanceCount i nt2InstanceCount. Parametr nt1InstanceCount , na przykład, ustawia liczbę wystąpień dla drugiego typu węzła i ustawia liczbę maszyn wirtualnych w skojarzonym zestawie skalowania maszyn wirtualnych.

Dlatego przez zaktualizowanie wartości nt1InstanceCount należy zmienić liczbę węzłów w drugim typie węzła. Pamiętaj, że nie można skalować typu węzła w poziomie do więcej niż 100 węzłów. Typy węzłów innych niż podstawowe z uruchomionymi stanowymi obciążeniami produkcyjnymi powinny mieć zawsze pięć lub więcej węzłów. Typy węzłów innych niż podstawowe z uruchomionymi bezstanowymi obciążeniami produkcyjnymi powinny zawsze mieć co najmniej dwa węzły.

W przypadku skalowania w poziomie, usuwania węzłów z węzłów typu trwałości z brązu należy ręcznie usunąć stan tych węzłów. W przypadku warstwy trwałości Silver i Gold te kroki są wykonywane automatycznie przez platformę.

Wdrażanie zaktualizowanego szablonu

Zapisz wszelkie zmiany w plikach template.json i parameters.json . Aby wdrożyć zaktualizowany szablon, uruchom następujące polecenie:

New-AzResourceGroupDeployment -ResourceGroupName sfclustertutorialgroup -TemplateFile c:\temp\template.json -TemplateParameterFile c:\temp\parameters.json -Name "ChangingInstanceCount"

Lub następujące polecenie interfejsu wiersza polecenia platformy Azure:

az deployment group create --resource-group sfclustertutorialgroup --template-file c:\temp\template.json --parameters c:\temp\parameters.json

Dodawanie typu węzła do klastra

Każdy typ węzła zdefiniowany w klastrze usługi Service Fabric uruchomionym na platformie Azure jest konfigurowany jako oddzielny zestaw skalowania maszyn wirtualnych. Każdy typ węzła może być zarządzany oddzielnie. Można niezależnie skalować każdy typ węzła w górę lub w dół, mieć otwarte różne zestawy portów i używać różnych metryk pojemności. Możesz również niezależnie zmienić jednostkę SKU systemu operacyjnego uruchomioną w każdym węźle klastra, ale należy pamiętać, że w przykładowym klastrze nie można uruchomić kombinacji systemów Windows i Linux. Pojedynczy typ węzła/zestaw skalowania nie może zawierać więcej niż 100 węzłów. Klaster można skalować w poziomie do więcej niż 100 węzłów, dodając dodatkowe typy węzłów/zestawy skalowania. Klaster można skalować w dowolnym momencie, nawet wtedy, gdy obciążenia są uruchomione w klastrze.

Aktualizowanie szablonu

Wyeksportuj plik szablonu i parametrów z grupy zasobów na potrzeby ostatniego wdrożenia. Otwórz plik parameters.json . Jeśli klaster został wdrożony przy użyciu przykładowego szablonu w tym samouczku , w klastrze znajdują się trzy typy węzłów. W tej sekcji dodasz czwarty typ węzła, aktualizując i wdrażając szablon Resource Manager.

Oprócz nowego typu węzła dodaje się również skojarzony zestaw skalowania maszyn wirtualnych (uruchamiany w oddzielnej podsieci sieci wirtualnej) i sieciową grupę zabezpieczeń. Możesz dodać nowy lub istniejący publiczny adres IP oraz zasoby modułu równoważenia obciążenia platformy Azure dla nowego zestawu skalowania. Nowy typ węzła ma poziom trwałości Silver i rozmiar "Standard_D2_V2".

W pliku template.json dodaj następujące nowe parametry:

"nt3InstanceCount": {
    "defaultValue": 5,
    "type": "Int",
    "metadata": {
        "description": "Instance count for node type"
    }
},
"vmNodeType3Size": {
    "defaultValue": "Standard_D2_V2",
    "type": "String"
},

W pliku template.json dodaj następujące nowe zmienne:

"lbID3": "[resourceId('Microsoft.Network/loadBalancers',concat('LB','-', parameters('clusterName'),'-',variables('vmNodeType3Name')))]",
"lbIPConfig3": "[concat(variables('lbID3'),'/frontendIPConfigurations/LoadBalancerIPConfig')]",
"lbPoolID3": "[concat(variables('lbID3'),'/backendAddressPools/LoadBalancerBEAddressPool')]",
"lbProbeID3": "[concat(variables('lbID3'),'/probes/FabricGatewayProbe')]",
"lbHttpProbeID3": "[concat(variables('lbID3'),'/probes/FabricHttpGatewayProbe')]",
"lbNatPoolID3": "[concat(variables('lbID3'),'/inboundNatPools/LoadBalancerBEAddressNatPool')]",
"vmNodeType3Name": "[toLower(concat('NT4', variables('vmName')))]",
"vmStorageAccountName3": "[toLower(concat(uniqueString(resourceGroup().id), '1', '3' ))]",
"nt3applicationStartPort": "20000",
"nt3applicationEndPort": "30000",
"nt3ephemeralStartPort": "49152",
"nt3ephemeralEndPort": "65534",
"nt3fabricTcpGatewayPort": "19000",
"nt3fabricHttpGatewayPort": "19080",
"nt3reverseProxyEndpointPort": "19081",
"subnet3Name": "Subnet-3",
"subnet3Prefix": "10.0.3.0/24",
"subnet3Ref": "[concat(variables('vnetID'),'/subnets/',variables('subnet3Name'))]",

W pliku template.json dodaj nową podsieć do zasobu sieci wirtualnej:

{
    "type": "Microsoft.Network/virtualNetworks",
    "name": "[variables('virtualNetworkName')]",
    "apiVersion": "2018-08-01",
    "location": "[variables('computeLocation')]",
    "tags": {
        "resourceType": "Service Fabric",
        "clusterName": "[parameters('clusterName')]"
    },
    "properties": {
        "addressSpace": {
            "addressPrefixes": [
                "[variables('addressPrefix')]"
            ]
        },
        "subnets": [
            ...
            {
                "name": "[variables('subnet3Name')]",
                "properties": {
                    "addressPrefix": "[variables('subnet3Prefix')]",
                    "networkSecurityGroup": {
                        "id": "[resourceId('Microsoft.Network/networkSecurityGroups', concat('nsg', variables('subnet3Name')))]"
                    }
                }
            }
        ]
    },
    "dependsOn": [
        ...
        "[concat('Microsoft.Network/networkSecurityGroups/', concat('nsg', variables('subnet3Name')))]"
    ]
},

W pliku template.json dodaj nowy publiczny adres IP i zasoby modułu równoważenia obciążenia:

{
    "type": "Microsoft.Network/publicIPAddresses",
    "name": "[concat(variables('lbIPName'),'-',variables('vmNodeType3Name'))]",
    "apiVersion": "2018-08-01",
    "location": "[variables('computeLocation')]",
    "tags": {
        "resourceType": "Service Fabric",
        "clusterName": "[parameters('clusterName')]"
    },
    "properties": {
        "dnsSettings": {
            "domainNameLabel": "[concat(variables('dnsName'),'-','nt4')]"
        },
        "publicIPAllocationMethod": "Dynamic"
    }
},
        {
    "type": "Microsoft.Network/loadBalancers",
    "name": "[concat('LB','-', parameters('clusterName'),'-',variables('vmNodeType3Name'))]",
    "apiVersion": "2018-08-01",
    "location": "[variables('computeLocation')]",
    "tags": {
        "resourceType": "Service Fabric",
        "clusterName": "[parameters('clusterName')]"
    },
    "properties": {
        "frontendIPConfigurations": [
            {
                "name": "LoadBalancerIPConfig",
                "properties": {
                    "publicIPAddress": {
                        "id": "[resourceId('Microsoft.Network/publicIPAddresses',concat(variables('lbIPName'),'-',variables('vmNodeType3Name')))]"
                    }
                }
            }
        ],
        "backendAddressPools": [
            {
                "name": "LoadBalancerBEAddressPool",
                "properties": {}
            }
        ],
        "loadBalancingRules": [
            {
                "name": "LBRule",
                "properties": {
                    "backendAddressPool": {
                        "id": "[variables('lbPoolID3')]"
                    },
                    "backendPort": "[variables('nt3fabricTcpGatewayPort')]",
                    "enableFloatingIP": "false",
                    "frontendIPConfiguration": {
                        "id": "[variables('lbIPConfig3')]"
                    },
                    "frontendPort": "[variables('nt3fabricTcpGatewayPort')]",
                    "idleTimeoutInMinutes": "5",
                    "probe": {
                        "id": "[variables('lbProbeID3')]"
                    },
                    "protocol": "tcp"
                }
            },
            {
                "name": "LBHttpRule",
                "properties": {
                    "backendAddressPool": {
                        "id": "[variables('lbPoolID3')]"
                    },
                    "backendPort": "[variables('nt3fabricHttpGatewayPort')]",
                    "enableFloatingIP": "false",
                    "frontendIPConfiguration": {
                        "id": "[variables('lbIPConfig3')]"
                    },
                    "frontendPort": "[variables('nt3fabricHttpGatewayPort')]",
                    "idleTimeoutInMinutes": "5",
                    "probe": {
                        "id": "[variables('lbHttpProbeID3')]"
                    },
                    "protocol": "tcp"
                }
            },
            {
                "name": "AppPortLBRule1",
                "properties": {
                    "backendAddressPool": {
                        "id": "[variables('lbPoolID3')]"
                    },
                    "backendPort": "[parameters('loadBalancedAppPort1')]",
                    "enableFloatingIP": "false",
                    "frontendIPConfiguration": {
                        "id": "[variables('lbIPConfig3')]"
                    },
                    "frontendPort": "[parameters('loadBalancedAppPort1')]",
                    "idleTimeoutInMinutes": "5",
                    "probe": {
                        "id": "[concat(variables('lbID3'),'/probes/AppPortProbe1')]"
                    },
                    "protocol": "tcp"
                }
            },
            {
                "name": "AppPortLBRule2",
                "properties": {
                    "backendAddressPool": {
                        "id": "[variables('lbPoolID3')]"
                    },
                    "backendPort": "[parameters('loadBalancedAppPort2')]",
                    "enableFloatingIP": "false",
                    "frontendIPConfiguration": {
                        "id": "[variables('lbIPConfig3')]"
                    },
                    "frontendPort": "[parameters('loadBalancedAppPort2')]",
                    "idleTimeoutInMinutes": "5",
                    "probe": {
                        "id": "[concat(variables('lbID3'),'/probes/AppPortProbe2')]"
                    },
                    "protocol": "tcp"
                }
            }
        ],
        "probes": [
            {
                "name": "FabricGatewayProbe",
                "properties": {
                    "intervalInSeconds": 5,
                    "numberOfProbes": 2,
                    "port": "[variables('nt3fabricTcpGatewayPort')]",
                    "protocol": "tcp"
                }
            },
            {
                "name": "FabricHttpGatewayProbe",
                "properties": {
                    "intervalInSeconds": 5,
                    "numberOfProbes": 2,
                    "port": "[variables('nt3fabricHttpGatewayPort')]",
                    "protocol": "tcp"
                }
            },
            {
                "name": "AppPortProbe1",
                "properties": {
                    "intervalInSeconds": 5,
                    "numberOfProbes": 2,
                    "port": "[parameters('loadBalancedAppPort1')]",
                    "protocol": "tcp"
                }
            },
            {
                "name": "AppPortProbe2",
                "properties": {
                    "intervalInSeconds": 5,
                    "numberOfProbes": 2,
                    "port": "[parameters('loadBalancedAppPort2')]",
                    "protocol": "tcp"
                }
            }
        ],
        "inboundNatPools": [
            {
                "name": "LoadBalancerBEAddressNatPool",
                "properties": {
                    "backendPort": "3389",
                    "frontendIPConfiguration": {
                        "id": "[variables('lbIPConfig3')]"
                    },
                    "frontendPortRangeEnd": "4500",
                    "frontendPortRangeStart": "3389",
                    "protocol": "tcp"
                }
            }
        ]
    },
    "dependsOn": [
        "[concat('Microsoft.Network/publicIPAddresses/',concat(variables('lbIPName'),'-',variables('vmNodeType3Name')))]"
    ]
},

W pliku template.json dodaj nową sieciowa grupa zabezpieczeń i zasoby zestawu skalowania maszyn wirtualnych. Właściwość NodeTypeRef we właściwościach rozszerzenia usługi Service Fabric zestawu skalowania maszyn wirtualnych mapuje określony typ węzła na zestaw skalowania.

{
    "type": "Microsoft.Network/networkSecurityGroups",
    "name": "[concat('nsg', variables('subnet3Name'))]",
    "apiVersion": "2018-08-01",
    "location": "[resourceGroup().location]",
    "tags": {
        "resourceType": "Service Fabric",
        "clusterName": "[parameters('clusterName')]"
    },
    "properties": {
        "securityRules": [
            {
                "name": "allowSvcFabSMB",
                "properties": {
                    "access": "Allow",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "445",
                    "direction": "Inbound",
                    "priority": 3950,
                    "protocol": "*",
                    "sourceAddressPrefix": "VirtualNetwork",
                    "sourcePortRange": "*",
                    "description": "allow SMB traffic within the net, used by fabric to move packages around"
                }
            },
            {
                "name": "allowSvcFabCluser",
                "properties": {
                    "access": "Allow",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "1025-1027",
                    "direction": "Inbound",
                    "priority": 3920,
                    "protocol": "*",
                    "sourceAddressPrefix": "VirtualNetwork",
                    "sourcePortRange": "*",
                    "description": "allow ports within vnet that are used by the fabric to talk between nodes"
                }
            },
            {
                "name": "allowSvcFabEphemeral",
                "properties": {
                    "access": "Allow",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "[concat(variables('nt3ephemeralStartPort'), '-', variables('nt3ephemeralEndPort'))]",
                    "direction": "Inbound",
                    "priority": 3930,
                    "protocol": "*",
                    "sourceAddressPrefix": "VirtualNetwork",
                    "sourcePortRange": "*",
                    "description": "allow fabric ephemeral ports within the vnet"
                }
            },
            {
                "name": "allowSvcFabPortal",
                "properties": {
                    "access": "Allow",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "[variables('nt3fabricHttpGatewayPort')]",
                    "direction": "Inbound",
                    "priority": 3900,
                    "protocol": "*",
                    "sourceAddressPrefix": "*",
                    "sourcePortRange": "*",
                    "description": "allow port used to access the fabric cluster web portal"
                }
            },
            {
                "name": "allowSvcFabClient",
                "properties": {
                    "access": "Allow",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "[variables('nt3fabricTcpGatewayPort')]",
                    "direction": "Inbound",
                    "priority": 3910,
                    "protocol": "*",
                    "sourceAddressPrefix": "*",
                    "sourcePortRange": "*",
                    "description": "allow port used by the fabric client (includes powershell)"
                }
            },
            {
                "name": "allowSvcFabApplication",
                "properties": {
                    "access": "Allow",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "[concat(variables('nt3applicationStartPort'), '-', variables('nt3applicationEndPort'))]",
                    "direction": "Inbound",
                    "priority": 3940,
                    "protocol": "*",
                    "sourceAddressPrefix": "*",
                    "sourcePortRange": "*",
                    "description": "allow fabric application ports within the vnet"
                }
            },
            {
                "name": "blockAll",
                "properties": {
                    "access": "Deny",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "*",
                    "direction": "Inbound",
                    "priority": 4095,
                    "protocol": "*",
                    "sourceAddressPrefix": "*",
                    "sourcePortRange": "*",
                    "description": "block all traffic except what we've explicitly allowed"
                }
            },
            {
                "name": "allowVNetRDP",
                "properties": {
                    "access": "Allow",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "3389",
                    "direction": "Inbound",
                    "priority": 3960,
                    "protocol": "*",
                    "sourceAddressPrefix": "*",
                    "sourcePortRange": "*",
                    "description": "allow RDP within the net"
                }
            },
            {
                "name": "allowSvcFabReverseProxy",
                "properties": {
                    "access": "Allow",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "[variables('nt3reverseProxyEndpointPort')]",
                    "direction": "Inbound",
                    "priority": 3980,
                    "protocol": "*",
                    "sourceAddressPrefix": "*",
                    "sourcePortRange": "*",
                    "description": "allow port used to access the fabric cluster using reverse proxy"
                }
            },
            {
                "name": "allowAppPort1",
                "properties": {
                    "access": "Allow",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "[parameters('loadBalancedAppPort1')]",
                    "direction": "Inbound",
                    "priority": 2001,
                    "protocol": "*",
                    "sourceAddressPrefix": "*",
                    "sourcePortRange": "*",
                    "description": "allow public application port 1"
                }
            },
            {
                "name": "allowAppPort2",
                "properties": {
                    "access": "Allow",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "[parameters('loadBalancedAppPort2')]",
                    "direction": "Inbound",
                    "priority": 2002,
                    "protocol": "*",
                    "sourceAddressPrefix": "*",
                    "sourcePortRange": "*",
                    "description": "allow public application port 2"
                }
            }
        ]
    }
},
{
    "type": "Microsoft.Compute/virtualMachineScaleSets",
    "sku": {
        "name": "[parameters('vmNodeType3Size')]",
        "capacity": "[parameters('nt3InstanceCount')]",
        "tier": "Standard"
    },
    "name": "[variables('vmNodeType3Name')]",
    "apiVersion": "2018-10-01",
    "location": "[variables('computeLocation')]",
    "tags": {
        "resourceType": "Service Fabric",
        "clusterName": "[parameters('clusterName')]"
    },
    "properties": {
        "overprovision": "[variables('overProvision')]",
        "upgradePolicy": {
            "mode": "Automatic"
        },
        "virtualMachineProfile": {
            "extensionProfile": {
                "extensions": [
                    {
                        "name": "[concat(variables('vmNodeType3Name'),'OMS')]",
                        "properties": {
                            "publisher": "Microsoft.EnterpriseCloud.Monitoring",
                            "type": "MicrosoftMonitoringAgent",
                            "typeHandlerVersion": "1.0",
                            "autoUpgradeMinorVersion": true,
                            "settings": {
                                "workspaceId": "[reference(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspacename')), '2015-11-01-preview').customerId]"
                            },
                            "protectedSettings": {
                                "workspaceKey": "[listKeys(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspacename')),'2015-11-01-preview').primarySharedKey]"
                            }
                        }
                    },
                    {
                        "name": "[concat('ServiceFabricNodeVmExt','_vmNodeType3Name')]",
                        "properties": {
                            "type": "ServiceFabricNode",
                            "autoUpgradeMinorVersion": true,
                            "protectedSettings": {
                                "StorageAccountKey1": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('supportLogStorageAccountName')),'2015-05-01-preview').key1]",
                                "StorageAccountKey2": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('supportLogStorageAccountName')),'2015-05-01-preview').key2]"
                            },
                            "publisher": "Microsoft.Azure.ServiceFabric",
                            "settings": {
                                "clusterEndpoint": "[reference(parameters('clusterName')).clusterEndpoint]",
                                "nodeTypeRef": "[variables('vmNodeType3Name')]",
                                "dataPath": "D:\\SvcFab",
                                "durabilityLevel": "Silver",
                                "enableParallelJobs": true,
                                "nicPrefixOverride": "[variables('subnet3Prefix')]",
                                "certificate": {
                                    "thumbprint": "[parameters('certificateThumbprint')]",
                                    "x509StoreName": "[parameters('certificateStoreValue')]"
                                }
                            },
                            "typeHandlerVersion": "1.0"
                        }
                    },
                    {
                        "name": "[concat('VMDiagnosticsVmExt','_vmNodeType3Name')]",
                        "properties": {
                            "type": "IaaSDiagnostics",
                            "autoUpgradeMinorVersion": true,
                            "protectedSettings": {
                                "storageAccountName": "[variables('applicationDiagnosticsStorageAccountName')]",
                                "storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('applicationDiagnosticsStorageAccountName')),'2015-05-01-preview').key1]",
                                "storageAccountEndPoint": "https://core.windows.net/"
                            },
                            "publisher": "Microsoft.Azure.Diagnostics",
                            "settings": {
                                "WadCfg": {
                                    "DiagnosticMonitorConfiguration": {
                                        "overallQuotaInMB": "50000",
                                        "EtwProviders": {
                                            "EtwEventSourceProviderConfiguration": [
                                                {
                                                    "provider": "Microsoft-ServiceFabric-Actors",
                                                    "scheduledTransferKeywordFilter": "1",
                                                    "scheduledTransferPeriod": "PT5M",
                                                    "DefaultEvents": {
                                                        "eventDestination": "ServiceFabricReliableActorEventTable"
                                                    }
                                                },
                                                {
                                                    "provider": "Microsoft-ServiceFabric-Services",
                                                    "scheduledTransferPeriod": "PT5M",
                                                    "DefaultEvents": {
                                                        "eventDestination": "ServiceFabricReliableServiceEventTable"
                                                    }
                                                }
                                            ],
                                            "EtwManifestProviderConfiguration": [
                                                {
                                                    "provider": "cbd93bc2-71e5-4566-b3a7-595d8eeca6e8",
                                                    "scheduledTransferLogLevelFilter": "Information",
                                                    "scheduledTransferKeywordFilter": "4611686018427387904",
                                                    "scheduledTransferPeriod": "PT5M",
                                                    "DefaultEvents": {
                                                        "eventDestination": "ServiceFabricSystemEventTable"
                                                    }
                                                }
                                            ]
                                        }
                                    }
                                },
                                "StorageAccount": "[variables('applicationDiagnosticsStorageAccountName')]"
                            },
                            "typeHandlerVersion": "1.5"
                        }
                    },
                    {
                        "name": "[concat('VMIaaSAntimalware','_vmNodeType3Name')]",
                        "properties": {
                            "publisher": "Microsoft.Azure.Security",
                            "type": "IaaSAntimalware",
                            "typeHandlerVersion": "1.5",
                            "settings": {
                                "AntimalwareEnabled": "true",
                                "Exclusions": {
                                    "Paths": "D:\\SvcFab;D:\\SvcFab\\Log;C:\\Program Files\\Microsoft Service Fabric",
                                    "Processes": "Fabric.exe;FabricHost.exe;FabricInstallerService.exe;FabricSetup.exe;FabricDeployer.exe;ImageBuilder.exe;FabricGateway.exe;FabricDCA.exe;FabricFAS.exe;FabricUOS.exe;FabricRM.exe;FileStoreService.exe"
                                },
                                "RealtimeProtectionEnabled": "true",
                                "ScheduledScanSettings": {
                                    "isEnabled": "true",
                                    "scanType": "Quick",
                                    "day": "7",
                                    "time": "120"
                                }
                            },
                            "protectedSettings": null
                        }
                    }
                ]
            },
            "networkProfile": {
                "networkInterfaceConfigurations": [
                    {
                        "name": "[concat(variables('nicName'), '-2')]",
                        "properties": {
                            "ipConfigurations": [
                                {
                                    "name": "[concat(variables('nicName'),'-',2)]",
                                    "properties": {
                                        "loadBalancerBackendAddressPools": [
                                            {
                                                "id": "[variables('lbPoolID3')]"
                                            }
                                        ],
                                        "loadBalancerInboundNatPools": [
                                            {
                                                "id": "[variables('lbNatPoolID3')]"
                                            }
                                        ],
                                        "subnet": {
                                            "id": "[variables('subnet3Ref')]"
                                        }
                                    }
                                }
                            ],
                            "primary": true
                        }
                    }
                ]
            },
            "osProfile": {
                "adminPassword": "[parameters('adminPassword')]",
                "adminUsername": "[parameters('adminUsername')]",
                "computernamePrefix": "[variables('vmNodeType3Name')]",
                "secrets": [
                    {
                        "sourceVault": {
                            "id": "[parameters('sourceVaultValue')]"
                        },
                        "vaultCertificates": [
                            {
                                "certificateStore": "[parameters('certificateStoreValue')]",
                                "certificateUrl": "[parameters('certificateUrlValue')]"
                            }
                        ]
                    }
                ]
            },
            "storageProfile": {
                "imageReference": {
                    "publisher": "[parameters('vmImagePublisher')]",
                    "offer": "[parameters('vmImageOffer')]",
                    "sku": "[parameters('vmImageSku')]",
                    "version": "[parameters('vmImageVersion')]"
                },
                "osDisk": {
                    "caching": "ReadOnly",
                    "createOption": "FromImage",
                    "managedDisk": {
                        "storageAccountType": "[parameters('storageAccountType')]"
                    }
                }
            }
        }
    },
    "dependsOn": [
        "[concat('Microsoft.Network/virtualNetworks/', variables('virtualNetworkName'))]",
        "[concat('Microsoft.Network/loadBalancers/', concat('LB','-', parameters('clusterName'),'-',variables('vmNodeType3Name')))]",
        "[concat('Microsoft.Storage/storageAccounts/', variables('supportLogStorageAccountName'))]",
        "[concat('Microsoft.Storage/storageAccounts/', variables('applicationDiagnosticsStorageAccountName'))]"
    ]
},

W pliku template.json zaktualizuj zasób klastra i dodaj nowy typ węzła:

{
    "type": "Microsoft.ServiceFabric/clusters",
    "name": "[parameters('clusterName')]",
    "apiVersion": "2018-02-01",
    "location": "[parameters('clusterLocation')]",
    "tags": {
        "resourceType": "Service Fabric",
        "clusterName": "[parameters('clusterName')]"
    },
    "properties": {
        "nodeTypes": [
            ...
            {
                "name": "[variables('vmNodeType3Name')]",
                "applicationPorts": {
                    "endPort": "[variables('nt3applicationEndPort')]",
                    "startPort": "[variables('nt3applicationStartPort')]"
                },
                "clientConnectionEndpointPort": "[variables('nt3fabricTcpGatewayPort')]",
                "durabilityLevel": "Silver",
                "ephemeralPorts": {
                    "endPort": "[variables('nt3ephemeralEndPort')]",
                    "startPort": "[variables('nt3ephemeralStartPort')]"
                },
                "httpGatewayEndpointPort": "[variables('nt3fabricHttpGatewayPort')]",
                "isPrimary": false,
                "reverseProxyEndpointPort": "[variables('nt3reverseProxyEndpointPort')]",
                "vmInstanceCount": "[parameters('nt3InstanceCount')]"
            }
        ],    
    }
}                

W pliku parameters.json dodaj następujące nowe parametry i wartości:

"nt3InstanceCount": {
    "Value": 5    
},
"vmNodeType3Size": {
    "Value": "Standard_D2_V2"
},

Wdrażanie zaktualizowanego szablonu

Zapisz wszelkie zmiany w plikach template.json i parameters.json . Aby wdrożyć zaktualizowany szablon, uruchom następujące polecenie:

New-AzResourceGroupDeployment -ResourceGroupName sfclustertutorialgroup -TemplateFile c:\temp\template.json -TemplateParameterFile c:\temp\parameters.json -Name "AddingNodeType"

Lub następujące polecenie interfejsu wiersza polecenia platformy Azure:

az deployment group create --resource-group sfclustertutorialgroup --template-file c:\temp\template.json --parameters c:\temp\parameters.json

Usuwanie typu węzła z klastra

Po utworzeniu klastra usługi Service Fabric można skalować klaster w poziomie, usuwając typ węzła (zestaw skalowania maszyn wirtualnych) i wszystkie jego węzły. Klaster można skalować w dowolnym momencie, nawet gdy obciążenia są uruchomione w klastrze. W miarę skalowania klastra aplikacje są również automatycznie skalowane.

Ostrzeżenie

Nie zaleca się częstego używania Remove-AzServiceFabricNodeType usuwania typu węzła z klastra produkcyjnego. Jest to niebezpieczne polecenie, ponieważ usuwa zasób zestawu skalowania maszyn wirtualnych za typem węzła.

Aby usunąć typ węzła, uruchom polecenie cmdlet Remove-AzServiceFabricNodeType . Typ węzła musi mieć poziom trwałości Silver lub Gold Polecenie cmdlet usuwa zestaw skalowania skojarzony z typem węzła i zajmuje trochę czasu. Następnie uruchom polecenie cmdlet Remove-ServiceFabricNodeState w każdym z węzłów, aby usunąć, co spowoduje usunięcie stanu węzła i usunięcie węzłów z klastra. Jeśli w węzłach znajdują się usługi, usługi są najpierw przenoszone do innego węzła. Jeśli menedżer klastra nie może odnaleźć węzła repliki/usługi, operacja jest opóźniona/zablokowana.

$groupname = "sfclustertutorialgroup"
$nodetype = "nt4vm"
$clustername = "mysfcluster123"

Remove-AzServiceFabricNodeType -Name $clustername  -NodeType $nodetype -ResourceGroupName $groupname

Connect-ServiceFabricCluster -ConnectionEndpoint mysfcluster123.eastus.cloudapp.azure.com:19000 `
          -KeepAliveIntervalInSec 10 `
          -X509Credential -ServerCertThumbprint <thumbprint> `
          -FindType FindByThumbprint -FindValue <thumbprint> `
          -StoreLocation CurrentUser -StoreName My

$nodes = Get-ServiceFabricNode | Where-Object {$_.NodeType -eq $nodetype} | Sort-Object { $_.NodeName.Substring($_.NodeName.LastIndexOf('_') + 1) } -Descending

Foreach($node in $nodes)
{
    Remove-ServiceFabricNodeState -NodeName $node.NodeName -TimeoutSec 300 -Force 
}

Zwiększanie zasobów węzła

Po utworzeniu klastra usługi Service Fabric można skalować typ węzła klastra w pionie (zmienić zasoby węzłów) lub uaktualnić system operacyjny maszyn wirtualnych typu węzła, zastępując oryginalny typ węzła nowym typem węzła (zaktualizowaną jednostkę SKU maszyny wirtualnej lub obraz systemu operacyjnego). Aby uzyskać więcej informacji, zobacz Skalowanie w górę typu węzła usługi Azure Service Fabric.

Ważne

Nigdy nie spróbuj zmienić w miejscu jednostki SKU maszyny wirtualnej lub obrazu systemu operacyjnego, który jest niebezpieczną operacją i nieobsługiwaną.

Jeśli to nie jest możliwe, możesz utworzyć nowy klaster i przywrócić stan aplikacji (jeśli ma to zastosowanie) ze starego klastra. Nie trzeba przywracać żadnego stanu usługi systemu; są one tworzone ponownie podczas wdrażania aplikacji w nowym klastrze. Jeśli właśnie uruchomiono aplikacje bezstanowe w klastrze, wszystko, co robisz, to wdrażanie aplikacji w nowym klastrze, nie masz nic do przywrócenia.

Aktualizowanie szablonu

Wyeksportuj plik szablonu i parametrów z grupy zasobów do najnowszego wdrożenia. Otwórz plik parameters.json . Jeśli klaster został wdrożony przy użyciu przykładowego szablonu w tym samouczku, w klastrze znajdują się trzy typy węzłów.

Rozmiar maszyn wirtualnych w drugim typie węzła jest ustawiony w parametrze vmNodeType1Size . Zmień wartość parametru vmNodeType1Size z Standard_D2_V2 na Standard_D3_V2, która podwoi zasoby każdego wystąpienia maszyny wirtualnej.

Jednostka SKU maszyny wirtualnej dla wszystkich trzech typów węzłów jest ustawiana w parametrze vmImageSku . Ponownie zmiana jednostki SKU maszyny wirtualnej typu węzła powinna być zwracana z ostrożnością i nie jest zalecana dla typu węzła podstawowego.

Wdrażanie zaktualizowanego szablonu

Zapisz wszelkie zmiany w plikach template.json i parameters.json . Aby wdrożyć zaktualizowany szablon, uruchom następujące polecenie:

New-AzResourceGroupDeployment -ResourceGroupName sfclustertutorialgroup -TemplateFile c:\temp\template.json -TemplateParameterFile c:\temp\parameters.json -Name "ScaleUpNodeType"

Lub następujące polecenie interfejsu wiersza polecenia platformy Azure:

az deployment group create --resource-group sfclustertutorialgroup --template-file c:\temp\template.json --parameters c:\temp\parameters.json

Następne kroki

W niniejszym samouczku zawarto informacje na temat wykonywania następujących czynności:

  • Dodawanie i usuwanie węzłów (skalowanie w poziomie i skalowanie w poziomie)
  • Dodawanie i usuwanie typów węzłów (skalowanie w poziomie i skalowanie w poziomie)
  • Zwiększanie zasobów węzła (skalowanie w górę)

Przejdź do kolejnego samouczka, aby dowiedzieć się, jak uaktualnić środowisko uruchomieniowe klastra.