Tutorial: Dimensionar um cluster do Service Fabric no Azure

Este tutorial é a terceira parte de uma série e mostra-lhe como aumentar e reduzir horizontalmente o cluster existente. Quando tiver terminado, saberá como dimensionar o seu cluster e como limpar quaisquer recursos restantes. Para obter mais informações sobre o dimensionamento de um cluster em execução no Azure, leia Dimensionar clusters do Service Fabric.

Neste tutorial, ficará a saber como:

  • Adicionar e remover nós (aumentar horizontalmente e aumentar horizontalmente)
  • Adicionar e remover tipos de nós (aumentar horizontalmente e aumentar horizontalmente)
  • Aumentar os recursos de nós (aumentar verticalmente)

Nesta série de tutoriais, ficará a saber como:

Nota

Recomendamos que utilize o módulo do Azure Az PowerShell para interagir com o Azure. Veja Instalar o Azure PowerShell para começar. Para saber como migrar para o módulo do Az PowerShell, veja Migrar o Azure PowerShell do AzureRM para o Az.

Pré-requisitos

Antes de começar este tutorial:

Considerações e diretrizes importantes

As cargas de trabalho da aplicação mudam ao longo do tempo, os serviços existentes precisam de mais (ou menos) recursos? Adicione ou remova nós de um tipo de nó para aumentar ou diminuir os recursos do cluster.

Precisa de adicionar mais de 100 nós ao cluster? Um único conjunto de nós/dimensionamento do Service Fabric não pode conter mais de 100 nós/VMs. Para dimensionar um cluster para além de 100 nós, adicione tipos de nós adicionais.

A sua aplicação tem vários serviços e algum deles tem de ser público ou com acesso à Internet? As aplicações típicas contêm um serviço de gateway de front-end que recebe entradas de um cliente e de um ou mais serviços de back-end que comunicam com os serviços de front-end. Neste caso, recomendamos que adicione pelo menos dois tipos de nós ao cluster.

Os seus serviços têm necessidades de infraestrutura diferentes, como RAM maior ou ciclos de CPU superiores? Por exemplo, a sua aplicação contém um serviço de front-end e um serviço de back-end. O serviço de front-end pode ser executado em VMs mais pequenas (tamanhos de VM como D2) que têm portas abertas para a Internet. No entanto, o serviço de back-end é intensivo em termos de computação e tem de ser executado em VMs maiores (com tamanhos de VM como D4, D6, D15) que não têm acesso à Internet. Neste caso, recomendamos que adicione dois ou mais tipos de nós ao cluster. Isto permite que cada tipo de nó tenha propriedades distintas, como a conectividade à Internet ou o tamanho da VM. O número de VMs também pode ser dimensionado de forma independente.

Ao dimensionar um cluster do Azure, tenha em atenção as seguintes diretrizes:

  • Um único conjunto de nós/dimensionamento do Service Fabric não pode conter mais de 100 nós/VMs. Para dimensionar um cluster para além de 100 nós, adicione tipos de nós adicionais.
  • Os tipos de nós principais que executam cargas de trabalho de produção devem ter um nível de durabilidade de Ouro ou Prata e ter sempre cinco ou mais nós.
  • Os tipos de nós não primários que executam cargas de trabalho de produção com estado devem ter sempre cinco ou mais nós.
  • Os tipos de nós não primários que executam cargas de trabalho de produção sem estado devem ter sempre dois ou mais nós.
  • Qualquer tipo de nó de nível de durabilidade de Ouro ou Prata deve ter sempre cinco ou mais nós.
  • Se dimensionar (removendo nós de) um tipo de nó primário, nunca deve diminuir o número de instâncias para menos do que o nível de fiabilidade necessário.

Para obter mais informações, leia a documentação de orientação sobre a capacidade do cluster.

Exportar o modelo para o grupo de recursos

Depois de criar um cluster seguro do Windows e configurar o seu grupo de recursos com êxito, exporte o modelo de Resource Manager para o grupo de recursos. A exportação do modelo permite-lhe automatizar futuras implementações do cluster e dos respetivos recursos porque o modelo contém toda a infraestrutura completa. Para obter mais informações sobre como exportar modelos, leia Gerir grupos de recursos do Azure Resource Manager com o portal do Azure.

  1. No portal do Azure, aceda ao grupo de recursos que contém o cluster (sfclustertutorialgroup, se estiver a seguir este tutorial).

  2. No painel esquerdo, selecione Implementações ou selecione a ligação em Implementações.

  3. Selecione a implementação com êxito mais recente na lista.

  4. No painel esquerdo, selecione Modelo e, em seguida, selecione Transferir para exportar o modelo como um ficheiro ZIP. Guarde o modelo e os parâmetros no seu computador local.

Adicionar ou remover nós de um tipo de nó

Aumentar e reduzir horizontalmente, ou dimensionar horizontalmente, altera o número de nós no cluster. Ao aumentar ou reduzir horizontalmente, adiciona mais instâncias de máquina virtual ao conjunto de dimensionamento. Estas instâncias tornam-se os nós que o Service Fabric utiliza. O Service Fabric sabe quando são adicionadas mais instâncias ao conjunto de dimensionamento (ao aumentar horizontalmente) e reage automaticamente. Pode dimensionar o cluster em qualquer altura, mesmo quando as cargas de trabalho estão em execução no cluster.

Atualizar o modelo

Exporte um modelo e um ficheiro de parâmetros do grupo de recursos para a implementação mais recente. Abra o ficheiro parameters.json . Se implementou o cluster com o modelo de exemplo neste tutorial, existem três tipos de nós no cluster e três parâmetros que definem o número de nós para cada tipo de nó: nt0InstanceCount, nt1InstanceCount e nt2InstanceCount. O parâmetro nt1InstanceCount , por exemplo, define a contagem de instâncias para o segundo tipo de nó e define o número de VMs no conjunto de dimensionamento de máquinas virtuais associado.

Assim, ao atualizar o valor de nt1InstanceCount , altere o número de nós no segundo tipo de nó. Lembre-se de que não pode dimensionar um nó para mais de 100 nós. Os tipos de nós não primários que executam cargas de trabalho de produção com estado devem ter sempre cinco ou mais nós. Os tipos de nós não primários que executam cargas de trabalho de produção sem estado devem ter sempre dois ou mais nós.

Se estiver a dimensionar, a remover nós de, um tipo de nó do nível de durabilidade Bronze, tem de remover manualmente o estado desses nós. Para o escalão de durabilidade Silver e Gold, estes passos são efetuados automaticamente pela plataforma.

Implementar o modelo atualizado

Guarde quaisquer alterações aos ficheiros template.json e parameters.json . Para implementar o modelo atualizado, execute o seguinte comando:

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

Ou o seguinte comando da CLI do Azure:

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

Adicionar um tipo de nó ao cluster

Cada tipo de nó definido num cluster do Service Fabric em execução no Azure é configurado como um conjunto de dimensionamento de máquinas virtuais separado. Cada tipo de nó pode ser gerido separadamente. Pode aumentar ou reduzir verticalmente cada nó de forma independente, ter diferentes conjuntos de portas abertos e utilizar diferentes métricas de capacidade. Também pode alterar o SKU do SO em execução em cada nó de cluster, mas tenha em atenção que não pode ter uma mistura de Windows e Linux em execução no cluster de exemplo. Um único tipo de nó/conjunto de dimensionamento não pode conter mais de 100 nós. Pode dimensionar um cluster horizontalmente para mais de 100 nós ao adicionar tipos/conjuntos de dimensionamento de nós adicionais. Pode dimensionar o cluster em qualquer altura, mesmo quando as cargas de trabalho estão em execução no cluster.

Atualizar o modelo

Exporte um modelo e um ficheiro de parâmetros do grupo de recursos para a implementação mais recente. Abra o ficheiro parameters.json . Se implementou o cluster com o modelo de exemplo neste tutorial, existem três tipos de nós no cluster. Nesta secção, vai adicionar um quarto tipo de nó ao atualizar e implementar um modelo de Resource Manager.

Além do novo tipo de nó, também adiciona o conjunto de dimensionamento de máquinas virtuais associado (que é executado numa sub-rede separada da rede virtual) e o grupo de segurança de rede. Pode optar por adicionar o endereço IP público novo ou existente e os recursos do balanceador de carga do Azure para o novo conjunto de dimensionamento. O novo tipo de nó tem um nível de durabilidade de Prata e tamanho de "Standard_D2_V2".

No ficheiro template.json , adicione os seguintes novos parâmetros:

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

No ficheiro template.json , adicione as seguintes novas variáveis:

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

No ficheiro template.json , adicione uma nova sub-rede ao recurso de rede virtual:

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

No ficheiro template.json , adicione novos endereços IP públicos e recursos do balanceador de carga:

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

No ficheiro template.json , adicione novos recursos do grupo de segurança de rede e do conjunto de dimensionamento de máquinas virtuais. A propriedade NodeTypeRef nas propriedades da extensão do Service Fabric do conjunto de dimensionamento de máquinas virtuais mapeia o tipo de nó especificado para o conjunto de dimensionamento.

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

No ficheiro template.json , atualize o recurso do cluster e adicione um novo tipo de nó:

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

No ficheiro parameters.json , adicione os seguintes novos parâmetros e valores:

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

Implementar o modelo atualizado

Guarde quaisquer alterações aos ficheiros template.json e parameters.json . Para implementar o modelo atualizado, execute o seguinte comando:

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

Ou o seguinte comando da CLI do Azure:

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

Remover um tipo de nó do cluster

Depois de criar um cluster do Service Fabric, pode dimensionar um cluster horizontalmente ao remover um tipo de nó (conjunto de dimensionamento de máquinas virtuais) e todos os respetivos nós. Pode dimensionar o cluster em qualquer altura, mesmo quando as cargas de trabalho estão em execução no cluster. À medida que o cluster é dimensionado, as aplicações também são dimensionadas automaticamente.

Aviso

A utilização de Remove-AzServiceFabricNodeType para remover um tipo de nó de um cluster de produção não é recomendada para ser utilizada com frequência. É um comando perigoso, uma vez que elimina o recurso do conjunto de dimensionamento de máquinas virtuais por trás do tipo de nó.

Para remover o tipo de nó, execute o cmdlet Remove-AzServiceFabricNodeType . O tipo de nó tem de ter o nível de durabilidade Silver ou Gold O cmdlet elimina o conjunto de dimensionamento associado ao tipo de nó e demora algum tempo a concluir. Em seguida, execute o cmdlet Remove-ServiceFabricNodeState em cada um dos nós a remover, o que elimina o estado do nó e remove os nós do cluster. Se existirem serviços nos nós, os serviços são movidos primeiro para outro nó. Se o gestor de clusters não conseguir encontrar um nó para a réplica/serviço, a operação será adiada/bloqueada.

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

Aumentar recursos de nós

Depois de criar um cluster do Service Fabric, pode dimensionar verticalmente um tipo de nó de cluster (alterar os recursos dos nós) ou atualizar o sistema operativo das VMs do tipo de nó ao substituir o tipo de nó original por um novo tipo de nó (com SKU ou imagem do SO da VM atualizada). Para obter mais detalhes, veja Aumentar verticalmente um tipo de nó do Azure Service Fabric.

Importante

Nunca tente uma alteração no local do SKU da VM ou da imagem do SO, que é uma operação perigosa e não suportada.

Se isso não for possível, pode criar um novo cluster e restaurar o estado da aplicação (se aplicável) a partir do cluster antigo. Não precisa de restaurar nenhum estado de serviço do sistema; são recriadas quando implementa as suas aplicações no novo cluster. Se estava apenas a executar aplicações sem estado no cluster, tudo o que faz é implementar as suas aplicações no novo cluster, não tem nada para restaurar.

Atualizar o modelo

Exporte um modelo e um ficheiro de parâmetros do grupo de recursos para a implementação mais recente. Abra o ficheiro parameters.json . Se implementou o cluster com o modelo de exemplo neste tutorial, existem três tipos de nós no cluster.

O tamanho das VMs no segundo tipo de nó é definido no parâmetro vmNodeType1Size . Altere o valor do parâmetro vmNodeType1Size de Standard_D2_V2 para Standard_D3_V2, o que duplica os recursos de cada instância de VM.

O SKU da VM para os três tipos de nó está definido no parâmetro vmImageSku . Mais uma vez, a alteração do SKU da VM de um tipo de nó deve ser abordada com cuidado e não é recomendada para o tipo de nó primário.

Implementar o modelo atualizado

Guarde quaisquer alterações aos ficheiros template.json e parameters.json . Para implementar o modelo atualizado, execute o seguinte comando:

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

Ou o seguinte comando da CLI do Azure:

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

Passos seguintes

Neste tutorial, ficou a saber como:

  • Adicionar e remover nós (aumentar horizontalmente e aumentar horizontalmente)
  • Adicionar e remover tipos de nós (aumentar horizontalmente e aumentar horizontalmente)
  • Aumentar os recursos de nós (aumentar verticalmente)

Em seguida, avance para o tutorial seguinte para saber como atualizar o runtime de um cluster.