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

Os tipos de nó do Service Fabric vêm com a suposição 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 escalonamento mais rápidas, suporte para Atualizações Automáticas do SO na durabilidade do Bronze e escalabilidade para mais de 100 nós numa única escala de máquina virtual.

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

Modelos de exemplo estão disponíveis: modelo de Tipos de Nós 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 em um recurso de cluster, defina a propriedade isStateless como true. Ao implantar um cluster do Service Fabric com tipos de nó sem monitoração de estado, lembre-se de ter pelo menos um tipo de nó primário no recurso de cluster.

  • A versão api do recurso de cluster do Service Fabric 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')]"
    }    
    ],
}

Configurando um grupo de dimensionamento de máquinas virtuais para tipos de nós sem estado

Para habilitar tipos de nó sem monitoração de estado, você deve configurar o recurso de conjunto de escala de máquina virtual subjacente da seguinte maneira:

  • O valor da propriedade singlePlacementGroup, que deve ser definido como false se necessitar dimensionar para mais de 100 VMs.
  • A política de atualização do conjunto de escala deve ser configurada para Rolling.
  • O modo de atualização contínua requer a Extensão de Integridade do Aplicativo ou sondas de integridade configuradas. Para mais informações sobre a configuração das sondas de saúde ou da extensão de saúde da aplicação, consulte este documento. Configure a sonda de saúde com a configuração padrão para tipos de Nós Sem Estado, conforme sugerido abaixo. Assim que os aplicativos são implantados no tipo de nó, as portas de extensão do Health Probe/Health podem ser alteradas para monitorar o estado real de saúde do aplicativo.

Nota

Ao usar AutoScaling com tipos de nós Stateless, após a operação de redução de escala, o estado do nó não é automaticamente limpo. Para limpar o estado do nó dos nós em baixo durante o escalar automático, recomenda-se usar Service Fabric AutoScale Helper.

{
    "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": true,
        "enableAutomaticUpgrade": true,
        "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"
            }
            }
        },
    ]
}

Configuração de tipos de nós sem estado com várias zonas de disponibilidade

Para configurar o tipo de nó sem estado que abrange várias zonas de disponibilidade, siga a documentação aqui, juntamente com as poucas alterações da forma a seguir:

  • Defina singlePlacementGroup : false se for necessário habilitar múltiplos grupos de posicionamento.
  • Definir upgradePolicy : Rolling e adicionar Application Health Extension/Health Probes conforme mencionado acima.
  • Defina platformFaultDomainCount : 5 para o conjunto de escala da máquina virtual.

Para referência, examine o modelo para configurar tipos de nó sem estado com várias zonas de disponibilidade

Requisitos de rede

IP público e recurso de balanceador de carga

Para habilitar o dimensionamento para mais de 100 VMs num recurso de grupo de dimensionamento de máquinas virtuais, o balanceador de carga e o recurso de IP referenciados por esse grupo de dimensionamento de máquinas virtuais devem estar ambos a usar uma SKU Standard. Criar um recurso IP sem a propriedade SKU cria um SKU Básico, que não suporta escalabilidade para mais de 100 VMs. Um balanceador de carga SKU padrão bloqueia todo o tráfego externo por padrão; para permitir o tráfego externo, um NSG deve ser implantado 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.

Dimensionamento de máquina virtual definir regras NAT

As regras NAT de entrada do balanceador de carga devem corresponder aos pools de NAT do conjunto de escala da máquina virtual. Cada conjunto de escala de máquina virtual deve ter um pool de 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 padrão do SKU Load Balancer

O IP público padrão introduz novas habilidades e comportamentos diferentes para a conectividade de saída quando comparado ao uso do SKU básico. Se desejar conectividade de saída ao trabalhar com SKUs padrão, você deve defini-la explicitamente com endereços IP públicos padrão ou com o balanceador de carga público padrão. Para obter mais informações, consulte Conexões de saída e Azure Standard Load Balancer.

Nota

O template padrão refere-se a um NSG que permite todo o tráfego de saída por padrão. O tráfego de entrada é limitado às portas necessárias para as operações de gerenciamento do Service Fabric. As regras do NSG podem ser modificadas para atender às suas necessidades.

Nota

Qualquer cluster do Service Fabric, uma plataforma de serviço na nuvem, que utilize um SKU Standard SLB, precisa garantir que cada tipo de nó tenha uma regra que permita o tráfego de saída na porta 443. Isso é necessário para concluir a configuração do cluster, e qualquer implantaçã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, precisa ser adicionado um novo tipo de nó exclusivamente sem estado. O tipo de nó existente não pode ser migrado para ser somente sem estado.

Para migrar um cluster, que estava usando um IP com uma SKU básica, você deve primeiro criar um recurso IP totalmente novo usando a 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 você gostaria de usar. No exemplo acima, novos recursos de conjunto de dimensionamento de máquinas virtuais são adicionados para serem usados em tipos de nós sem estado. Esses conjuntos de dimensionamento de máquina virtual fazem referência ao LB e ao IP recém-criados, e são marcados como tipos de nós sem estado no recurso de cluster do Service Fabric.

Para começar, precisa de adicionar os novos recursos ao seu modelo existente do Gestor de Recursos. Esses recursos incluem:

  • Um recurso IP público usando SKU padrão.
  • Um recurso de balanceador de carga usando SKU padrão.
  • Um NSG referenciado pela sub-rede na qual você implanta seus conjuntos de dimensionamento de máquina virtual.

Quando os recursos terminarem a implantação, você poderá começar a desabilitar os nós no tipo de nó que deseja remover do cluster original.

Próximos passos