Skala upp ett Service Fabric-kluster som inte är en primär nodtyp

Den här artikeln beskriver hur du skalar upp ett Service Fabric-kluster som inte är en primär nodtyp med minimal stilleståndstid. SKU-uppgraderingar på plats stöds inte på Service Fabric-klusternoder, eftersom sådana åtgärder kan innebära data- och tillgänglighetsförluster. Den säkraste, mest tillförlitliga och rekommenderade metoden för att skala upp en Service Fabric-nodtyp är att:

  1. Lägg till en ny nodtyp i Service Fabric-klustret, som backas upp av din uppgraderade (eller ändrade) SKU och konfiguration av vm-skalningsuppsättningar. Det här steget omfattar även att konfigurera en ny lastbalanserare, ett undernät och en offentlig IP-adress för skalningsuppsättningen.

  2. När både de ursprungliga och uppgraderade skalningsuppsättningarna körs sida vid sida migrerar du arbetsbelastningen genom att ange placeringsbegränsningar för program till den nya nodtypen.

  3. Kontrollera att klustret är felfritt och ta sedan bort den ursprungliga skalningsuppsättningen (och relaterade resurser) och nodtillståndet för de borttagna noderna.

Följande vägleder dig genom processen för att uppdatera vm-storleken och operativsystemet för virtuella datorer av icke-primär nodtyp för ett exempelkluster med silverhållbarhet, som backas upp av en enda skalningsuppsättning med fem noder som används som sekundär nodtyp. Den primära nodtypen med Service Fabric-systemtjänster förblir orörd. Vi uppgraderar den icke-primära nodtypen:

  • Från VM-storlek Standard_D2_V2 till Standard D4_V2 och
  • Från operativsystemet Windows Server 2019 Datacenter till Windows Server 2022 Datacenter.

Varning

Innan du provar den här proceduren i ett produktionskluster rekommenderar vi att du studerar exempelmallarna och verifierar processen mot ett testkluster.

Försök inte skala upp en icke-primär nodtyp om klusterstatusen inte är felfri, eftersom detta endast destabiliserar klustret ytterligare. Vi använder de stegvisa Azure-distributionsmallarna som används i guiden Skala upp ett Service Fabric-kluster av primär nodtyp . Vi kommer dock att ändra dem så att de inte är specifika för primära nodtyper. Mallarna är tillgängliga på GitHub.

Konfigurera testklustret

Nu ska vi konfigurera det första Service Fabric-testklustret. Ladda först ned de Azure Resource Manager-exempelmallar som vi ska använda för att slutföra det här scenariot.

Logga sedan in på ditt Azure-konto.

# Sign in to your Azure account
Login-AzAccount -SubscriptionId "<subscription ID>"

Öppna sedan filen parameters.json och uppdatera värdet för clusterName till något unikt (i Azure).

Följande kommandon vägleder dig genom att generera ett nytt självsignerat certifikat och distribuera testklustret. Om du redan har ett certifikat som du vill använda går du vidare till Använd ett befintligt certifikat för att distribuera klustret.

Generera ett självsignerat certifikat och distribuera klustret

Tilldela först de variabler som du behöver för Distribution av Service Fabric-kluster. Justera värdena för resourceGroupName, certSubjectName, parameterFilePathoch templateFilePath för ditt specifika konto och din miljö:

# Assign deployment variables
$resourceGroupName = "sftestupgradegroup"
$certOutputFolder = "c:\certificates"
$certPassword = "Password!1" | ConvertTo-SecureString -AsPlainText -Force
$certSubjectName = "sftestupgrade.southcentralus.cloudapp.azure.com"
$parameterFilePath = "C:\parameters.json"
$templateFilePath = "C:\Initial-TestClusterSetup.json"

Kommentar

Kontrollera att platsen certOutputFolder finns på den lokala datorn innan du kör kommandot för att distribuera ett nytt Service Fabric-kluster. Distribuera sedan Service Fabric-testklustret:

# Deploy the initial test cluster
New-AzServiceFabricCluster `
    -ResourceGroupName $resourceGroupName `
    -CertificateOutputFolder $certOutputFolder `
    -CertificatePassword $certPassword `
    -CertificateSubjectName $certSubjectName `
    -TemplateFile $templateFilePath `
    -ParameterFile $parameterFilePath

När distributionen är klar letar du upp pfx-filen ($certPfx) på den lokala datorn och importerar den till certifikatarkivet:

cd c:\certificates
$certPfx = ".\sftestupgradegroup20200312121003.pfx"
Import-PfxCertificate `
     -FilePath $certPfx `
     -CertStoreLocation Cert:\CurrentUser\My `
     -Password (ConvertTo-SecureString Password!1 -AsPlainText -Force)

Åtgärden returnerar certifikatets tumavtryck, som du nu kan använda för att ansluta till det nya klustret och kontrollera dess hälsostatus. (Hoppa över följande avsnitt, som är en alternativ metod för klusterdistribution.)

Använda ett befintligt certifikat för att distribuera klustret

Alternativt kan du använda ett befintligt Azure Key Vault-certifikat för att distribuera testklustret. För att göra detta måste du hämta referenser till ditt Key Vault och certifikatets tumavtryck.

# Key Vault variables
$certUrlValue = "https://sftestupgradegroup.vault.azure.net/secrets/sftestupgradegroup20200309235308/dac0e7b7f9d4414984ccaa72bfb2ea39"
$sourceVaultValue = "/subscriptions/########-####-####-####-############/resourceGroups/sftestupgradegroup/providers/Microsoft.KeyVault/vaults/sftestupgradegroup"
$thumb = "BB796AA33BD9767E7DA27FE5182CF8FDEE714A70"

Ange sedan ett resursgruppsnamn för klustret och ange templateFilePath platserna och parameterFilePath :

Kommentar

Den avsedda resursgruppen måste redan finnas och finnas i samma region som ditt Key Vault.

$resourceGroupName = "sftestupgradegroup"
$templateFilePath = "C:\Initial-TestClusterSetup.json"
$parameterFilePath = "C:\parameters.json"

Kör slutligen följande kommando för att distribuera det första testklustret:

# Deploy the initial test cluster
New-AzResourceGroupDeployment `
    -ResourceGroupName $resourceGroupName `
    -TemplateFile $templateFilePath `
    -TemplateParameterFile $parameterFilePath `
    -CertificateThumbprint $thumb `
    -CertificateUrlValue $certUrlValue `
    -SourceVaultValue $sourceVaultValue `
    -Verbose

Anslut till det nya klustret och kontrollera hälsostatusen

Anslut till klustret och se till att alla fem noderna är felfria (ersätt variablerna clusterName och thumb med dina egna värden):

# Connect to the cluster
$clusterName = "sftestupgrade.southcentralus.cloudapp.azure.com:19000"
$thumb = "BB796AA33BD9767E7DA27FE5182CF8FDEE714A70"
Connect-ServiceFabricCluster `
    -ConnectionEndpoint $clusterName `
    -KeepAliveIntervalInSec 10 `
    -X509Credential `
    -ServerCertThumbprint $thumb  `
    -FindType FindByThumbprint `
    -FindValue $thumb `
    -StoreLocation CurrentUser `
    -StoreName My
# Check cluster health
Get-ServiceFabricClusterHealth

Med det är vi redo att påbörja uppgraderingsproceduren.

Distribuera en ny icke-primär nodtyp med en uppgraderad skalningsuppsättning

För att kunna uppgradera (lodrätt skala) en nodtyp måste vi först distribuera en ny nodtyp som backas upp av en ny skalningsuppsättning och stödresurser. Den nya skalningsuppsättningen markeras som icke-primär (isPrimary: false), precis som den ursprungliga skalningsuppsättningen. Om du vill skala upp en primär nodtyp kan du läsa Skala upp en primär nodtyp för Service Fabric-klustret. De resurser som skapas i följande avsnitt blir i slutändan den nya nodtypen i klustret och de ursprungliga nodtypresurserna tas bort.

Uppdatera klustermallen med den uppgraderade skalningsuppsättningen

Här följer avsnitt för avsnitt-ändringar av den ursprungliga klusterdistributionsmallen för att lägga till en ny nodtyp och stödresurser.

De flesta nödvändiga ändringarna för det här steget har redan gjorts åt dig i Step1-AddPrimaryNodeType.json-mallfilen. En ytterligare ändring måste dock göras så att mallfilen fungerar för icke-primära nodtyper. I följande avsnitt förklaras dessa ändringar i detalj och utrop görs när du måste göra en ändring.

Kommentar

Se till att du använder namn som är unika från den ursprungliga nodtypen, skalningsuppsättningen, lastbalanseraren, offentliga IP-adressen och undernätet för den ursprungliga icke-primära nodtypen, eftersom dessa resurser tas bort i ett senare steg i processen.

Skapa ett nytt undernät i det befintliga virtuella nätverket

{
    "name": "[variables('subnet1Name')]",
    "properties": {
        "addressPrefix": "[variables('subnet1Prefix')]"
    }
}

Skapa en ny offentlig IP-adress med en unik domainNameLabel

{
    "apiVersion": "[variables('publicIPApiVersion')]",
    "type": "Microsoft.Network/publicIPAddresses",
    "name": "[concat(variables('lbIPName'),'-',variables('vmNodeType1Name'))]",
    "location": "[variables('computeLocation')]",
    "properties": {
        "dnsSettings": {
            "domainNameLabel": "[concat(variables('dnsName'),'-','nt1')]"
        },
        "publicIPAllocationMethod": "Dynamic"
    },
    "tags": {
        "resourceType": "Service Fabric",
        "clusterName": "[parameters('clusterName')]"
    }
}

Skapa en ny lastbalanserare för den offentliga IP-adressen

"dependsOn": [
    "[concat('Microsoft.Network/publicIPAddresses/',concat(variables('lbIPName'),'-',variables('vmNodeType1Name')))]"
]

Skapa en ny VM-skalningsuppsättning (med uppgraderade vm- och OS-SKU:er)

Referens för nodtyp

"nodeTypeRef": "[variables('vmNodeType1Name')]"

VM-SKU

"sku": {
    "name": "[parameters('vmNodeType1Size')]",
    "capacity": "[parameters('nt1InstanceCount')]",
    "tier": "Standard"
}

OS SKU

"imageReference": {
    "publisher": "[parameters('vmImagePublisher1')]",
    "offer": "[parameters('vmImageOffer1')]",
    "sku": "[parameters('vmImageSku1')]",
    "version": "[parameters('vmImageVersion1')]"
}

Se också till att du inkluderar eventuella ytterligare tillägg som krävs för din arbetsbelastning.

Lägga till en ny icke-primär nodtyp i klustret

Nu när den nya nodtypen (vmNodeType1Name) har sitt eget namn, undernät, IP, lastbalanserare och skalningsuppsättning kan den återanvända alla andra variabler från den ursprungliga nodtypen (till exempel nt0applicationEndPort, nt0applicationStartPortoch nt0fabricTcpGatewayPort).

I den befintliga mallfilen är parametern isPrimary inställd true på för guiden Skala upp ett Service Fabric-klusters primära nodtyp . Ändra isPrimary till false för din icke-primära nodtyp:

"name": "[variables('vmNodeType1Name')]",
"applicationPorts": {
    "endPort": "[variables('nt0applicationEndPort')]",
    "startPort": "[variables('nt0applicationStartPort')]"
},
"clientConnectionEndpointPort": "[variables('nt0fabricTcpGatewayPort')]",
"durabilityLevel": "Bronze",
"ephemeralPorts": {
    "endPort": "[variables('nt0ephemeralEndPort')]",
    "startPort": "[variables('nt0ephemeralStartPort')]"
},
"httpGatewayEndpointPort": "[variables('nt0fabricHttpGatewayPort')]",
"isPrimary": false,
"reverseProxyEndpointPort": "[variables('nt0reverseProxyEndpointPort')]",
"vmInstanceCount": "[parameters('nt1InstanceCount')]"

När du har implementerat alla ändringar i mall- och parameterfilerna fortsätter du till nästa avsnitt för att hämta dina Key Vault-referenser och distribuera uppdateringarna till klustret.

Hämta dina Key Vault-referenser

För att distribuera den uppdaterade konfigurationen behöver du flera referenser till klustercertifikatet som lagras i ditt Key Vault. Det enklaste sättet att hitta dessa värden är via Azure-portalen. Du behöver:

  • Key Vault-URL:en för ditt klustercertifikat. Från Key Vault i Azure-portalen väljer du Certifikat>Din önskade certifikathemlighetsidentifierare:>

    $certUrlValue="https://sftestupgradegroup.vault.azure.net/secrets/sftestupgradegroup20200309235308/dac0e7b7f9d4414984ccaa72bfb2ea39"
    
  • Tumavtrycket för klustercertifikatet. (Du har förmodligen redan detta om du är ansluten till det första klustret för att kontrollera dess hälsostatus.) Kopiera X.509 SHA-1 Tumavtryck (i hex) från samma certifikatblad (certifikat>som önskat certifikat) i Azure-portalen:

    $thumb = "BB796AA33BD9767E7DA27FE5182CF8FDEE714A70"
    
  • Resurs-ID:t för ditt Nyckelvalv. Från Key Vault i Azure-portalen väljer du Egenskaper>Resurs-ID:

    $sourceVaultValue = "/subscriptions/########-####-####-####-############/resourceGroups/sftestupgradegroup/providers/Microsoft.KeyVault/vaults/sftestupgradegroup"
    

Distribuera den uppdaterade mallen

Justera efter templateFilePath behov och kör följande kommando:

# Deploy the new node type and its resources
$templateFilePath = "C:\Step1-AddPrimaryNodeType.json"
New-AzResourceGroupDeployment `
    -ResourceGroupName $resourceGroupName `
    -TemplateFile $templateFilePath `
    -TemplateParameterFile $parameterFilePath `
    -CertificateThumbprint $thumb `
    -CertificateUrlValue $certUrlValue `
    -SourceVaultValue $sourceVaultValue `
    -Verbose

När distributionen är klar kontrollerar du klusterhälsan igen och ser till att alla noder på båda nodtyperna är felfria.

Get-ServiceFabricClusterHealth

Migrera arbetsbelastningar till den nya nodtypen

Vänta tills alla program har flyttats till den nya nodtypen och är felfria.

Inaktivera noderna i den ursprungliga skalningsuppsättningen för nodtyp

När alla startnoder har migrerats till den nya skalningsuppsättningen kan du inaktivera noderna i den ursprungliga skalningsuppsättningen.

# Disable the nodes in the original scale set.
$nodeType = "nt0vm"
$nodes = Get-ServiceFabricNode
Write-Host "Disabling nodes..."
foreach($node in $nodes)
{
  if ($node.NodeType -eq $nodeType)
  {
    $node.NodeName
    Disable-ServiceFabricNode -Intent RemoveNode -NodeName $node.NodeName -Force
  }
}

Använd Service Fabric Explorer för att övervaka förloppet för noder i den ursprungliga skalningsuppsättningen från Inaktivera till Inaktiverad status. Vänta tills alla noder har inaktiverats.

Stoppa data på inaktiverade noder

Nu kan du stoppa data på de inaktiverade noderna.

# Stop data on the disabled nodes.
foreach($node in $nodes)
{
  if ($node.NodeType -eq $nodeType)
  {
    $node.NodeName
    Start-ServiceFabricNodeTransition -Stop -OperationId (New-Guid) -NodeInstanceId $node.NodeInstanceId -NodeName $node.NodeName -StopDurationInSeconds 10000
  }
}

Ta bort den ursprungliga nodtypen och rensa dess resurser

Vi är redo att ta bort den ursprungliga nodtypen och dess associerade resurser för att slutföra den lodräta skalningsproceduren.

Ta bort den ursprungliga skalningsuppsättningen

Ta först bort nodtypens backningsskalningsuppsättning.

$scaleSetName = "nt0vm"
$scaleSetResourceType = "Microsoft.Compute/virtualMachineScaleSets"
Remove-AzResource -ResourceName $scaleSetName -ResourceType $scaleSetResourceType -ResourceGroupName $resourceGroupName -Force

Ta bort de ursprungliga IP- och lastbalanseringsresurserna

Nu kan du ta bort den ursprungliga IP-adressen och lastbalanserarens resurser. I det här steget uppdaterar du även DNS-namnet.

Kommentar

Det här steget är valfritt om du redan använder en offentlig IP-adress för Standard SKU och lastbalanserare. I det här fallet kan du ha flera skalningsuppsättningar/nodtyper under samma lastbalanserare. Kör följande kommandon och $lbname ändra värdet efter behov.

# Delete the original IP and load balancer resources
$lbName = "LB-sftestupgrade-nt0vm"
$lbResourceType = "Microsoft.Network/loadBalancers"
$ipResourceType = "Microsoft.Network/publicIPAddresses"
$oldPublicIpName = "PublicIP-LB-FE-nt0vm"
$newPublicIpName = "PublicIP-LB-FE-nt1vm"
$oldPublicIP = Get-AzPublicIpAddress -Name $oldPublicIpName  -ResourceGroupName $resourceGroupName
$nonPrimaryDNSName = $oldNonPrimaryPublicIP.DnsSettings.DomainNameLabel
$nonPrimaryDNSFqdn = $oldNonPrimaryPublicIP.DnsSettings.Fqdn
Remove-AzResource -ResourceName $lbName -ResourceType $lbResourceType -ResourceGroupName $resourceGroupName -Force
Remove-AzResource -ResourceName $oldPublicIpName -ResourceType $ipResourceType -ResourceGroupName $resourceGroupName -Force
$PublicIP = Get-AzPublicIpAddress -Name $newPublicIpName  -ResourceGroupName $resourceGroupName
$PublicIP.DnsSettings.DomainNameLabel = $nonPrimaryDNSName
$PublicIP.DnsSettings.Fqdn = $nonPrimaryDNSFqdn
Set-AzPublicIpAddress -PublicIpAddress $PublicIP

Ta bort nodtillstånd från den ursprungliga nodtypen

De ursprungliga nodtyperna visar nu fel för hälsotillståndet. Ta bort nodtillståndet från klustret.

# Remove state of the obsolete nodes from the cluster
$nodeType = "nt0vm"
$nodes = Get-ServiceFabricNode
Write-Host "Removing node state..."
foreach($node in $nodes)
{
  if ($node.NodeType -eq $nodeType)
  {
    $node.NodeName
    Remove-ServiceFabricNodeState -NodeName $node.NodeName -Force
  }
}

Service Fabric Explorer bör nu endast återspegla de fem noderna i den nya nodtypen (nt1vm), alla med hälsotillståndsvärdena OK. Vi kommer att åtgärda det härnäst genom att uppdatera mallen så att den återspeglar de senaste ändringarna och omdistribueringen.

Uppdatera distributionsmallen så att den återspeglar den nyligen uppskalade icke-primära nodtypen

De flesta nödvändiga ändringarna för det här steget har redan gjorts åt dig i Step3-CleanupOriginalPrimaryNodeType.json-mallfilen. En ytterligare ändring måste dock göras så att mallfilen fungerar för icke-primära nodtyper. I följande avsnitt förklaras dessa ändringar i detalj och utrop görs när du måste göra en ändring.

Uppdatera slutpunkten för klusterhantering

Uppdatera klustret managementEndpoint i distributionsmallen för att referera till den nya IP-adressen (genom att uppdatera vmNodeType0Name med vmNodeType1Name).

  "managementEndpoint": "[concat('https://',reference(concat(variables('lbIPName'),'-',variables('vmNodeType1Name'))).dnsSettings.fqdn,':',variables('nt0fabricHttpGatewayPort'))]",

Ta bort referensen för den ursprungliga nodtypen

Ta bort den ursprungliga nodtypsreferensen från Service Fabric-resursen i distributionsmallen.

I den befintliga mallfilen är parametern isPrimary inställd true på för guiden Skala upp ett Service Fabric-klusters primära nodtyp . Ändra isPrimary till false för din icke-primära nodtyp:

"name": "[variables('vmNodeType0Name')]",
"applicationPorts": {
    "endPort": "[variables('nt0applicationEndPort')]",
    "startPort": "[variables('nt0applicationStartPort')]"
},
"clientConnectionEndpointPort": "[variables('nt0fabricTcpGatewayPort')]",
"durabilityLevel": "Bronze",
"ephemeralPorts": {
    "endPort": "[variables('nt0ephemeralEndPort')]",
    "startPort": "[variables('nt0ephemeralStartPort')]"
},
"httpGatewayEndpointPort": "[variables('nt0fabricHttpGatewayPort')]",
"isPrimary": false,
"reverseProxyEndpointPort": "[variables('nt0reverseProxyEndpointPort')]",
"vmInstanceCount": "[parameters('nt0InstanceCount')]"

Konfigurera hälsoprinciper för att ignorera befintliga fel

Endast för Silver- och högre hållbarhetskluster uppdaterar du klusterresursen i mallen och konfigurerar hälsoprinciper för att ignorera fabric:/System programmets hälsa genom att lägga till applicationDeltaHealthPolicies under klusterresursegenskaper enligt nedan. Principen nedan ignorerar befintliga fel men tillåter inte nya hälsofel.

"upgradeDescription":  
{ 
 "forceRestart": false, 
 "upgradeReplicaSetCheckTimeout": "10675199.02:48:05.4775807", 
 "healthCheckWaitDuration": "00:05:00", 
 "healthCheckStableDuration": "00:05:00", 
 "healthCheckRetryTimeout": "00:45:00", 
 "upgradeTimeout": "12:00:00", 
 "upgradeDomainTimeout": "02:00:00", 
 "healthPolicy": { 
   "maxPercentUnhealthyNodes": 100, 
   "maxPercentUnhealthyApplications": 100 
 }, 
 "deltaHealthPolicy":  
 { 
   "maxPercentDeltaUnhealthyNodes": 0, 
   "maxPercentUpgradeDomainDeltaUnhealthyNodes": 0, 
   "maxPercentDeltaUnhealthyApplications": 0, 
   "applicationDeltaHealthPolicies":  
   { 
       "fabric:/System":  
       { 
           "defaultServiceTypeDeltaHealthPolicy":  
           { 
                   "maxPercentDeltaUnhealthyServices": 0 
           } 
       } 
   } 
 } 
}

Ta bort stödresurser för den ursprungliga nodtypen

Ta bort alla andra resurser som är relaterade till den ursprungliga nodtypen från ARM-mallen och parameterfilen. Ta bort följande:

    "vmImagePublisher": {
      "value": "MicrosoftWindowsServer"
    },
    "vmImageOffer": {
      "value": "WindowsServer"
    },
    "vmImageSku": {
      "value": "2019-Datacenter"
    },
    "vmImageVersion": {
      "value": "latest"
    },

Distribuera den färdiga mallen

Distribuera slutligen den ändrade Azure Resource Manager-mallen.

# Deploy the updated template file
$templateFilePath = "C:\Step3-CleanupOriginalPrimaryNodeType"
New-AzResourceGroupDeployment `
    -ResourceGroupName $resourceGroupName `
    -TemplateFile $templateFilePath `
    -TemplateParameterFile $parameterFilePath `
    -CertificateThumbprint $thumb `
    -CertificateUrlValue $certUrlValue `
    -SourceVaultValue $sourceVaultValue `
    -Verbose

Kommentar

Det här steget tar en stund, vanligtvis upp till två timmar. Uppgraderingen ändrar inställningarna till InfrastructureService. Därför krävs en omstart av noden. I det här fallet ignoreras forceRestart . Parametern upgradeReplicaSetCheckTimeout anger den maximala tid som Service Fabric väntar på att en partition ska vara i ett säkert tillstånd, om inte redan i ett säkert tillstånd. När säkerhetskontrollerna har passerat för alla partitioner på en nod fortsätter Service Fabric med uppgraderingen på den noden. Värdet för parametern upgradeTimeout kan minskas till 6 timmar, men för maximal säkerhet ska 12 timmar användas.

När distributionen har slutförts kontrollerar du i Azure-portalen att Service Fabric-resursstatusen är klar. Kontrollera att du kan nå den nya Service Fabric Explorer-slutpunkten, klustrets hälsotillstånd är OK och att alla distribuerade program fungerar korrekt.

Med det har du lodrätt skalat ett kluster som inte är en primär nodtyp!

Nästa steg