Implementar um cluster do Azure Service Fabric com tipos de nó sem estado

Os tipos de nós do Service Fabric vêm com o pressuposto inerente de que, em algum momento, os serviços com estado podem ser colocados nos nós. Os tipos de nós sem estado alteram esta suposição para um tipo de nó, permitindo assim que o tipo de nó utilize outras funcionalidades, como operações de escalamento horizontal mais rápidas, suporte para Atualizações Automáticas do SO em Durabilidade de Bronze e aumento horizontal para mais de 100 nós num único conjunto de dimensionamento de máquinas virtuais.

  • Os tipos de nós primários não podem ser configurados para serem sem estado
  • Os tipos de nó sem estado só são suportados com Níveis de Durabilidade de Bronze
  • Os tipos de nó sem estado só são suportados na versão 7.1.409 ou superior do Service Fabric Runtime.

Estão disponíveis modelos de exemplo: Modelo de Tipos de Nó Sem Estado do Service Fabric

Ativar tipos de nós sem estado no cluster do Service Fabric

Para definir um ou mais tipos de nó como sem estado num recurso de cluster, defina a propriedade isStateless como true. Ao implementar um cluster do Service Fabric com tipos de nó sem estado, lembre-se de ter, pelo menos, um tipo de nó primário no recurso do cluster.

  • O recurso de cluster do Service Fabric apiVersion deve ser "2020-12-01-preview" ou superior.
{
    "nodeTypes": [
    {
        "name": "[parameters('vmNodeType0Name')]",
        "applicationPorts": {
            "endPort": "[parameters('nt0applicationEndPort')]",
            "startPort": "[parameters('nt0applicationStartPort')]"
        },
        "clientConnectionEndpointPort": "[parameters('nt0fabricTcpGatewayPort')]",
        "durabilityLevel": "Silver",
        "ephemeralPorts": {
            "endPort": "[parameters('nt0ephemeralEndPort')]",
            "startPort": "[parameters('nt0ephemeralStartPort')]"
        },
        "httpGatewayEndpointPort": "[parameters('nt0fabricHttpGatewayPort')]",
        "isPrimary": true,
        "isStateless": false, // Primary Node Types cannot be stateless
        "vmInstanceCount": "[parameters('nt0InstanceCount')]"
    },
    {
        "name": "[parameters('vmNodeType1Name')]",
        "applicationPorts": {
            "endPort": "[parameters('nt1applicationEndPort')]",
            "startPort": "[parameters('nt1applicationStartPort')]"
        },
        "clientConnectionEndpointPort": "[parameters('nt1fabricTcpGatewayPort')]",
        "durabilityLevel": "Bronze",
        "ephemeralPorts": {
            "endPort": "[parameters('nt1ephemeralEndPort')]",
            "startPort": "[parameters('nt1ephemeralStartPort')]"
        },
        "httpGatewayEndpointPort": "[parameters('nt1fabricHttpGatewayPort')]",
        "isPrimary": false,
        "isStateless": true,
        "vmInstanceCount": "[parameters('nt1InstanceCount')]"
    }    
    ],
}

Configurar o conjunto de dimensionamento de máquinas virtuais para tipos de nós sem estado

Para ativar os tipos de nós sem estado, deve configurar o recurso do conjunto de dimensionamento de máquinas virtuais subjacente da seguinte forma:

  • A propriedade valor singlePlacementGroup , que deve ser definida como falso se precisar de dimensionar para mais de 100 VMs.
  • A atualização do conjunto de dimensionamentoPolítica deve ser definida como Rolling.
  • O Modo de Atualização Sem Interrupção requer a Configuração da Extensão do Estado de Funcionamento da Aplicação ou sondas do Estado de Funcionamento. Para obter mais detalhes sobre como configurar as sondas de estado de funcionamento ou a extensão do estado de funcionamento da aplicação, veja este documento. Configure a sonda de estado de funcionamento com a configuração predefinida para tipos de Nó Sem Estado, conforme sugerido abaixo. Assim que as aplicações forem implementadas no tipo de nó, as portas da extensão Sonda de Estado de Funcionamento/Estado de Funcionamento podem ser alteradas para monitorizar o estado de funcionamento real da aplicação.

Nota

Ao utilizar o Dimensionamento Automático com tipos de nó Sem Estado, após a operação de redução horizontal, o estado do nó não é limpo automaticamente. Para limpar o NodeState de Nós Inativos durante o Dimensionamento Automático, é aconselhável utilizar o Auxiliar de Dimensionamento Automático do Service Fabric .

{
    "apiVersion": "2019-03-01",
    "type": "Microsoft.Compute/virtualMachineScaleSets",
    "name": "[parameters('vmNodeType1Name')]",
    "location": "[parameters('computeLocation')]",
    "properties": {
        "overprovision": "[variables('overProvision')]",
        "upgradePolicy": {
          "mode": "Rolling",
          "automaticOSUpgradePolicy": {
            "enableAutomaticOSUpgrade": true
          }
        },
        "platformFaultDomainCount": 5
    },
    "virtualMachineProfile": {
    "extensionProfile": {
    "extensions": [
    {
    "name": "[concat(parameters('vmNodeType1Name'),'_ServiceFabricNode')]",
    "properties": {
        "type": "ServiceFabricNode",
        "autoUpgradeMinorVersion": false,
        "publisher": "Microsoft.Azure.ServiceFabric",
        "settings": {
            "clusterEndpoint": "[reference(parameters('clusterName')).clusterEndpoint]",
            "nodeTypeRef": "[parameters('vmNodeType1Name')]",
            "dataPath": "D:\\\\SvcFab",
            "durabilityLevel": "Bronze",
            "certificate": {
                "thumbprint": "[parameters('certificateThumbprint')]",
                "x509StoreName": "[parameters('certificateStoreValue')]"
            },
            "systemLogUploadSettings": {
                "Enabled": true
            },
        },
        "typeHandlerVersion": "1.1"
    }
    },
    {
        "type": "extensions",
        "name": "HealthExtension",
        "properties": {
            "publisher": "Microsoft.ManagedServices",
            "type": "ApplicationHealthWindows",
            "autoUpgradeMinorVersion": true,
            "typeHandlerVersion": "1.0",
            "settings": {
            "protocol": "tcp",
            "port": "19000"
            }
            }
        },
    ]
}

Configurar tipos de nós Sem Estado com vários Zonas de Disponibilidade

Para configurar o tipo de nó Sem Estado, abrangendo várias zonas de disponibilidade, siga a documentação aqui, juntamente com as poucas alterações seguintes:

  • Defina singlePlacementGroup : falso se forem necessários vários grupos de colocação para serem ativados.
  • Defina upgradePolicy : Rolling e adicione Application Health Extension/Health Probes, conforme mencionado acima.
  • Definir platformFaultDomainCount : 5 para o conjunto de dimensionamento de máquinas virtuais.

Para referência, veja o modelo para configurar tipos de nós Sem Estado com vários Zonas de Disponibilidade

Requisitos de rede

IP público e Recurso de Balanceador de Carga

Para permitir o dimensionamento para mais de 100 VMs num recurso de conjunto de dimensionamento de máquinas virtuais, o balanceador de carga e o recurso IP referenciados por esse conjunto de dimensionamento de máquinas virtuais têm de estar ambos a utilizar um SKU Standard . A criação de um balanceador de carga ou recurso IP sem a propriedade SKU irá criar um SKU Básico, que não suporta o dimensionamento para mais de 100 VMs. Por predefinição, um balanceador de carga SKU Standard bloqueará todo o tráfego externo; para permitir tráfego externo, tem de ser implementado um NSG na sub-rede.

{
    "apiVersion": "2018-11-01",
    "type": "Microsoft.Network/publicIPAddresses",
    "name": "[concat('LB','-', parameters('clusterName')]",
    "location": "[parameters('computeLocation')]",
    "sku": {
        "name": "Standard"
    }
}
{
    "apiVersion": "2018-11-01",
    "type": "Microsoft.Network/loadBalancers",
    "name": "[concat('LB','-', parameters('clusterName')]", 
    "location": "[parameters('computeLocation')]",
    "dependsOn": [
        "[concat('Microsoft.Network/networkSecurityGroups/', concat('nsg', parameters('subnet0Name')))]"
    ],
    "properties": {
        "addressSpace": {
            "addressPrefixes": [
                "[parameters('addressPrefix')]"
            ]
        },
        "subnets": [
        {
            "name": "[parameters('subnet0Name')]",
            "properties": {
                "addressPrefix": "[parameters('subnet0Prefix')]",
                "networkSecurityGroup": {
                "id": "[resourceId('Microsoft.Network/networkSecurityGroups', concat('nsg', parameters('subnet0Name')))]"
              }
            }
          }
        ]
    },
    "sku": {
        "name": "Standard"
    }
}

Nota

Não é possível fazer uma alteração no local do SKU no IP público e nos recursos do balanceador de carga.

Regras NAT do conjunto de dimensionamento de máquinas virtuais

As regras NAT de entrada do balanceador de carga devem corresponder aos conjuntos NAT do conjunto de dimensionamento de máquinas virtuais. Cada conjunto de dimensionamento de máquinas virtuais tem de ter um conjunto NAT de entrada exclusivo.

{
"inboundNatPools": [
    {
        "name": "LoadBalancerBEAddressNatPool0",
        "properties": {
            "backendPort": "3389",
            "frontendIPConfiguration": {
                "id": "[variables('lbIPConfig0')]"
            },
            "frontendPortRangeEnd": "50999",
            "frontendPortRangeStart": "50000",
            "protocol": "tcp"
        }
    },
    {
        "name": "LoadBalancerBEAddressNatPool1",
        "properties": {
            "backendPort": "3389",
            "frontendIPConfiguration": {
                "id": "[variables('lbIPConfig0')]"
            },
            "frontendPortRangeEnd": "51999",
            "frontendPortRangeStart": "51000",
            "protocol": "tcp"
        }
    },
    {
        "name": "LoadBalancerBEAddressNatPool2",
        "properties": {
            "backendPort": "3389",
            "frontendIPConfiguration": {
                "id": "[variables('lbIPConfig0')]"
            },
            "frontendPortRangeEnd": "52999",
            "frontendPortRangeStart": "52000",
            "protocol": "tcp"
        }
    }
    ]
}

Regras de saída do SKU standard Balanceador de Carga

Balanceador de Carga Standard e IP Público Standard introduzem novas capacidades e diferentes comportamentos para a conectividade de saída quando comparados com a utilização de SKUs Básicos. Se quiser conectividade de saída ao trabalhar com SKUs Standard, tem de defini-la explicitamente com endereços IP Públicos Standard ou com Balanceador de Carga públicos Standard. Para obter mais informações, veja Ligações de saída e Balanceador de Carga Standard do Azure.

Nota

O modelo padrão referencia um NSG que permite todo o tráfego de saída por predefinição. O tráfego de entrada está limitado às portas necessárias para as operações de gestão do Service Fabric. As regras do NSG podem ser modificadas para cumprir os seus requisitos.

Nota

Qualquer cluster do Service Fabric que utilize um SLB de SKU Standard tem de garantir que cada tipo de nó tem uma regra que permite o tráfego de saída na porta 443. Isto é necessário para concluir a configuração do cluster e qualquer implementação sem essa regra falhará.

Migrar para a utilização de tipos de nó Sem Estado num cluster

Para todos os cenários de migração, é necessário adicionar um novo tipo de nó sem estado. Não é possível migrar o tipo de nó existente para ser apenas sem estado.

Para migrar um cluster, que estava a utilizar um Balanceador de Carga e um IP com um SKU básico, primeiro tem de criar um recurso de BALANCEADOR DE CARGA e IP totalmente novo com o SKU padrão. Não é possível atualizar estes recursos no local.

O novo LB e IP devem ser referenciados nos novos tipos de nó Sem Estado que pretende utilizar. No exemplo acima, é adicionado um novo conjunto de dimensionamento de máquinas virtuais para ser utilizado para tipos de nós Sem Estado. Estes conjuntos de dimensionamento de máquinas virtuais referenciam o LB e o IP recentemente criados e são marcados como tipos de nó sem estado no Recurso de Cluster do Service Fabric.

Para começar, terá de adicionar os novos recursos ao modelo de Resource Manager existente. Estes recursos incluem:

  • Um Recurso IP Público com o SKU Standard.
  • Um Recurso Balanceador de Carga com o SKU Standard.
  • Um NSG referenciado pela sub-rede na qual implementa os conjuntos de dimensionamento de máquinas virtuais.

Assim que os recursos terminarem a implementação, pode começar a desativar os nós no tipo de nó que pretende remover do cluster original.

Passos seguintes