Поделиться через


Руководство по масштабированию кластера Service Fabric в Azure

Это руководство является третьей частью серии и показывает, как масштабировать существующий кластер наружу и вовнутрь. По завершении вы узнаете, как масштабировать кластер и как очистить все оставшиеся ресурсы. Дополнительные сведения о масштабировании кластера, работающего в Azure, см. в статье "Масштабирование кластеров Service Fabric".

В этом руководстве описано, как:

  • Добавление и удаление узлов (масштабирование вверх и вниз)
  • Добавление и удаление типов узлов (масштабирование наружу и внутрь)
  • Увеличение ресурсов узлов (увеличение масштаба)

Из этого цикла руководств вы узнаете, как выполнять следующие задачи:

Примечание.

Мы рекомендуем использовать модуль Azure Az PowerShell для взаимодействия с Azure. Сведения о начале работы см. в статье "Установка Azure PowerShell". Чтобы узнать, как перейти на модуль Az PowerShell, см. статью Миграция Azure PowerShell с AzureRM на Az.

Предпосылки

Перед началом работы с этим руководством выполните следующие действия:

Важные аспекты и указания

Изменяются ли рабочие нагрузки приложений с течением времени, нужно ли вашим существующим службам больше (или меньше) ресурсов? Добавление или удаление узлов из типа узла для увеличения или уменьшения ресурсов кластера.

Вам нужно добавить более 100 узлов в кластер? Один тип узла Service Fabric или масштабируемый набор не может содержать более 100 узлов и виртуальных машин. Чтобы масштабировать кластер за пределами 100 узлов, добавьте дополнительные типы узлов.

Имеет ли ваше приложение несколько служб, и должны ли какие-либо из них быть общедоступными или доступными через интернет? Типичные приложения содержат интерфейсную службу шлюза, которая получает входные данные от клиента и одну или несколько внутренних служб, взаимодействующих с интерфейсными службами. В этом случае рекомендуется добавить в кластер по крайней мере два типа узлов .

Имеют ли службы различные потребности инфраструктуры, такие как более высокий объем ОЗУ или более высокий цикл ЦП? Например, приложение содержит интерфейсную службу и серверную службу. Интерфейсная служба может работать на небольших виртуальных машинах (таких как D2), имеющих порты, открытые в Интернете. Однако серверная служба является ресурсоемкой и должна работать на больших виртуальных машинах (с такими размерами виртуальных машин, как D4, D6, D15), которые не имеют доступа к Интернету. В этом случае рекомендуется добавить в кластер два или более типов узлов . Это позволяет каждому типу узла иметь различные свойства, такие как подключение к Интернету или размер виртуальной машины. Число виртуальных машин можно масштабировать независимо.

При масштабировании кластера Azure имейте в виду следующие рекомендации.

  • Один тип узла Service Fabric или масштабируемый набор не может содержать более 100 узлов и виртуальных машин. Чтобы масштабировать кластер за пределами 100 узлов, добавьте дополнительные типы узлов.
  • Основные типы узлов, на которых работают производственные нагрузки, должны иметь уровень надежности Gold или Silver и всегда содержать пять или более узлов.
  • Непервичные типы узлов, всегда работающих с постоянными рабочими нагрузками, должны содержать пять или более узлов.
  • Типы вторичных узлов, работающие в рабочей нагрузке без отслеживания состояния, всегда должны иметь два или более узлов.
  • Тип узла с уровнем устойчивости Gold или Silver всегда должен содержать пять и более узлов.
  • При масштабировании (удалении узлов) первичного типа узла нельзя снижать количество экземпляров ниже требуемого уровнем надежности.

Дополнительные сведения см. в руководстве по емкости кластера.

Экспорт шаблона для группы ресурсов

После создания защищенного кластера Windows и настройки группы ресурсов экспортируйте шаблон Resource Manager для группы ресурсов. Экспорт шаблона позволяет автоматизировать будущие развертывания кластера и его ресурсов, так как шаблон содержит всю полную инфраструктуру. Дополнительные сведения об экспорте шаблонов см. в статье "Управление группами ресурсов Azure Resource Manager" с помощью портала Azure.

  1. На портале Azure перейдите в группу ресурсов, содержащую кластер (sfclustertutorialgroup, если вы используете этот учебник).

  2. В левой области выберите "Развертывания" или выберите ссылку в разделе "Развертывания".

  3. Выберите последнее успешное развертывание из списка.

  4. В левой области выберите "Шаблон" , а затем выберите "Скачать ", чтобы экспортировать шаблон в виде ZIP-файла. Сохраните шаблон и параметры на локальном компьютере.

Добавление или удаление узлов из типа узла

Масштабирование «внутрь и наружу» изменяет количество узлов в кластере. Горизонтальное масштабирование увеличивает или уменьшает количество узлов. При горизонтальном масштабировании в масштабируемом наборе добавляются дополнительные экземпляры виртуальных машин. Эти экземпляры становятся узлами, которые использует Service Fabric. Service Fabric знает, когда масштабируемый набор добавляет больше экземпляров (путем масштабирования) и реагирует автоматически. Вы можете масштабировать кластер в любое время, даже когда в нём выполняются рабочие нагрузки.

Обновление шаблона

Экспортируйте файл шаблона и параметров из группы ресурсов для последнего развертывания. Откройте файлparameters.json . Если вы развернули кластер с помощью примера шаблона в этом руководстве, в кластере есть три типа узлов и три параметра, которые задают количество узлов для каждого типа узла: nt0InstanceCount, nt1InstanceCount и nt2InstanceCount. Например, параметр nt1InstanceCount задает количество экземпляров для второго типа узла и задает количество виртуальных машин в связанном масштабируемом наборе виртуальных машин.

Таким образом, обновив значение nt1InstanceCount , измените количество узлов во втором типе узла. Помните, что нельзя масштабировать тип узла до более чем 100 узлов. Непервичные типы узлов, всегда работающих с постоянными рабочими нагрузками, должны содержать пять или более узлов. Типы вторичных узлов, работающие в рабочей нагрузке без отслеживания состояния, всегда должны иметь два или более узлов.

Если вы масштабируете, удаляя узлы из типа узлов с уровнем надежности Bronze , вы должны вручную удалить состояние этих узлов. Для уровня устойчивости Silver и Gold эти действия выполняются автоматически платформой.

Развертывание обновленного шаблона

Сохраните все изменения в файлахtemplate.json и parameters.json . Чтобы развернуть обновленный шаблон, выполните следующую команду:

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

Или следующая команда Azure CLI:

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

Добавление типа узла в кластер

Каждый тип узла, определенный в кластере Service Fabric, работающем в Azure, настраивается как отдельный масштабируемый набор виртуальных машин. Затем каждый тип узла можно управлять отдельно. Вы можете независимо масштабировать каждый тип узла вверх или вниз, открывать разные наборы портов и использовать различные метрики емкости. Вы также можете независимо изменить номер SKU ОС, работающий на каждом узле кластера, но обратите внимание, что в примере кластера не удается использовать сочетание Windows и Linux. Один тип узла или масштабируемый набор не может содержать более 100 узлов. Вы можете горизонтально масштабировать кластер до более чем 100 узлов, добавив дополнительные типы узлов и масштабируемые наборы. Вы можете масштабировать кластер в любое время, даже когда в нём выполняются рабочие нагрузки.

Обновление шаблона

Экспортируйте файл шаблона и параметров из группы ресурсов для последнего развертывания. Откройте файлparameters.json . Если вы развернули кластер с помощью примера шаблона в этом руководстве, в кластере есть три типа узлов. В этом разделе описано, как добавить четвертый тип узла, обновив и развернув шаблон Resource Manager.

В дополнение к новому типу узла вы также добавляете связанный набор виртуальных машин (который выполняется в отдельной подсети виртуальной сети) и группу безопасности сети. Вы можете добавить новый или существующий общедоступный IP-адрес и ресурсы подсистемы балансировки нагрузки Azure для нового масштабируемого набора. Новый тип ноды имеет уровень устойчивости Silver и размер "Standard_D2_V2".

В файлеtemplate.json добавьте следующие новые параметры:

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

В файлеtemplate.json добавьте следующие новые переменные:

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

В файлеtemplate.json добавьте новую подсеть в ресурс виртуальной сети:

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

В файлеtemplate.json добавьте новые общедоступные IP-адреса и ресурсы подсистемы балансировки нагрузки:

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

В файлеtemplate.json добавьте новую группу безопасности сети и ресурсы масштабируемого набора виртуальных машин. Свойство NodeTypeRef в свойствах расширения Service Fabric масштабируемого набора виртуальных машин сопоставляет указанный тип узла с масштабируемым набором.

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

В файлеtemplate.json обновите ресурс кластера и добавьте новый тип узла:

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

В файлеparameters.json добавьте следующие новые параметры и значения:

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

Развертывание обновленного шаблона

Сохраните все изменения в файлахtemplate.json и parameters.json . Чтобы развернуть обновленный шаблон, выполните следующую команду:

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

Или следующая команда Azure CLI:

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

Удаление типа узла из кластера

После создания кластера Service Fabric можно горизонтально масштабировать кластер, удалив тип узла (масштабируемый набор виртуальных машин) и все его узлы. Вы можете масштабировать кластер в любое время, даже когда в нём выполняются рабочие нагрузки. По мере масштабирования кластера приложения автоматически масштабируются.

Предупреждение

Использование Remove-AzServiceFabricNodeType для удаления типа узла из рабочего кластера не рекомендуется часто использовать. Это опасная команда, так как она удаляет ресурс масштабируемого набора виртуальных машин, связанный с типом узла.

Чтобы удалить тип узла, выполните командлет Remove-AzServiceFabricNodeType . Тип узла должен обладать уровнем устойчивости Silver или Gold уровнем прочности. Командлет удаляет масштабируемый набор, связанный с типом узла, и выполнение этой операции требует некоторого времени. Затем запустите командлет Remove-ServiceFabricNodeState на каждом из узлов для удаления, который удаляет состояние узла и удаляет узлы из кластера. Если на узлах есть службы, то сначала они перемещаются на другой узел. Если диспетчер кластеров не может найти узел для реплики или службы, операция отложена или заблокирована.

$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 
}

Увеличение ресурсов узла

После создания кластера Service Fabric можно вертикально масштабировать тип узла кластера (изменить ресурсы узлов) или обновить операционную систему виртуальных машин типа узла, заменив исходный тип узла новым типом узла (обновленным номером SKU виртуальной машины или образом ОС). Дополнительные сведения см. в статье "Масштабирование типа узла Azure Service Fabric".

Это важно

Никогда не пытайтесь выполнить изменение на месте SKU виртуальной машины или образа ОС, так как это является опасной и неподдерживаемой операцией.

Если это невозможно, вы можете создать новый кластер и восстановить состояние приложения (если применимо) из старого кластера. Не нужно восстанавливать состояние службы системы; они повторно создаются при развертывании приложений в новом кластере. Если бы вы работали с безгосударственными приложениями в кластере, то единственное, что нужно сделать, — это развернуть их в новом кластере, и вам не нужно ничего восстанавливать.

Обновление шаблона

Экспортируйте файл шаблона и параметров из группы ресурсов для последнего развертывания. Откройте файлparameters.json . Если вы развернули кластер с помощью примера шаблона в этом руководстве, в кластере есть три типа узлов.

Размер виртуальных машин во втором типе узла задается в параметре vmNodeType1Size . Измените значение параметра vmNodeType1Size с Standard_D2_V2 на Standard_D3_V2, что удвоит ресурсы каждого экземпляра виртуальной машины.

Номер SKU виртуальной машины для всех трех типов узлов задан в параметре vmImageSku . Опять же, изменение SKU виртуальной машины для типа узла должно выполняться с осторожностью и не рекомендуется для основного типа узла.

Развертывание обновленного шаблона

Сохраните все изменения в файлахtemplate.json и parameters.json . Чтобы развернуть обновленный шаблон, выполните следующую команду:

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

Или следующая команда Azure CLI:

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

Дальнейшие действия

Из этого руководства вы узнали, как:

  • Добавление и удаление узлов (масштабирование вверх и вниз)
  • Добавление и удаление типов узлов (масштабирование наружу и внутрь)
  • Увеличение ресурсов узлов (увеличение масштаба)

Затем перейдите к следующему уроку, чтобы узнать, как обновить время выполнения кластера.