无法 RDP 到 Azure 中 Service Fabric 群集的虚拟机规模集实例

Cannot RDP to an instance of virtual machine scale set of a Service Fabric cluster in Azure

我已经使用众所周知的 azure-quickstart-templates/service-fabric-secure-cluster-5-node-1-nodetype 模板创建了一个 Service Fabric 集群。

在部署期间,我已将 adminUsernameadminPassword 字符串指定为 ARM template parameters。我刚刚用了2长串随机字符,记录下来以备后用。

部署成功,例如我可以打开带有著名绿色圆圈的 SF cluster explorer 网页。

当我尝试连接到 VMSS 的其中一个节点时,为了检查我的 SF 应用程序日志,RDP 连接被拒绝:

我使用加载程序 public IP 地址进行 RDP 连接,并已验证有一个 LB 规则:

当我输入我在 ARM 模板部署期间指定的 adminUsernameadminPassword 字符串时,RDP 连接在我的域前面加上公司笔记本。

所以我尝试在 adminUsername 前面添加 LB public ip 地址后跟反斜杠,但这也不起作用。

我也试过 .\adminUsername(我公司笔记本的域是错误的)和 \adminUsernament1vm_1\adminUsername(还是连接不上):

如何通过 RDP 连接到我的 SF 集群的 VMSS 实例?

我还为我的问题创建了 Github issue #7684

更新:

无法与 mac OS 的 Microsoft 远程桌面连接:

更新 2:

抱歉过于简化了我的问题描述 -

我实际上并没有将RDP凭据写到纸上,而是生成并将它们保存在Key Vault中,然后将它们作为管道变量输出(我知道,不太安全......)并将它们传递给SF模板:

所以这不是我写错凭据的问题。并且这个 YAML 文件被 5 个管道使用,以填充 5 个不同的 RG(使用 CosmosDb、Key Vault、SF)——都存在上述 RDP 连接问题。

更新 3:

因为我的SF集群有3个节点,我试过用nt1vm_0\username,nt1vm_1\username , nt1vm_2\username 甚至 nt1vm\username 作为 RDP 对话框中的用户名,可惜这不起作用:

这是我自己的答案,也许它也会对其他人有所帮助 -

好像是SF Cluster(我们用Service Fabric version 7.1.417.9590)ARM模板部署的bug。

我们注意到,如果您 "Reimage" VMSS 中的所有实例,RDP 就会工作:

在没有重新映像的情况下,RDP 连接被拒绝,就好像凭据有误。

在我们的 Azure 管道中,RDP 凭据由 Key Vault ARM 模板中的以下代码生成(大写字母和数字以满足密码复杂性要求 + 基于部署名称的唯一字符串):

"variables": {
    "RdpUsername": "[concat('ABC123', uniqueString(deployment().name, 'RdpUsername'))]",
    "RdpPassword": "[concat('ABC123', uniqueString(deployment().name, 'RdpPassword'))]"
},
"outputs": {
    "RdpUsername": {
        "type": "string",
        "value": "[variables('RdpUsername')]"
    },
    "RdpPassword": {
        "type": "string",
        "value": "[variables('RdpPassword')]"
    },
    "keyvaultId": {
        "type": "string",
        "value": "[resourceId('Microsoft.KeyVault/vaults', variables('keyvaultName'))]"
    }
},

uniqueString 基于部署名称,因此随着每个管道部署而改变(这就是为什么下面的屏幕截图中有不同的秘密版本):

然后将上述秘密传递给部署 SF 集群的管道任务:

- task: AzureResourceManagerTemplateDeployment@3
  displayName: 'Deploy SF cluster'
  inputs:
    deploymentScope: 'Resource Group'
    subscriptionId: '${{ parameters.SubscriptionId }}'
    azureResourceManagerConnection: '${{ parameters.ArmConnection }}'
    action: 'Create Or Update Resource Group'
    resourceGroupName: '${{ parameters.ResourceGroupName }}'
    location: '${{ parameters.ResourceLocation }}'
    templateLocation: 'Linked artifact'
    csmFile: '$(Build.SourcesDirectory)/pipelines/templates/sfcluster.json'
    csmParametersFile: '$(Build.SourcesDirectory)/pipelines/templates/sfcluster-params.json'
    overrideParameters: '-rdpUsername $(RdpUsername) -rdpPassword $(RdpPassword) -certificateThumbprint $(Thumbprint) -sourceVaultResourceId $(KeyvaultId) -certificateUrlValue $(SecretId)' 
    deploymentMode: 'Incremental'

因为似乎存在错误,RDP 连接仍然需要旧的 RDP 凭据对。

所以我们的解决方法是根据 RG 名称将 RDP 凭据更改为更稳定的字符串:

"variables": {
    "RdpUsername": "[concat('Ccg1', uniqueString(resourceGroup().name, 'RdpUsername'))]",
    "RdpPassword": "[concat('Ccg2', uniqueString(resourceGroup().name, 'RdpPassword'))]"
},

现在 RDP 连接可用(使用用户名 nt1vm_0\RdpUsername 等):

尝试在规模集上执行 password reset 以查看凭据是否已被更改。

Login-AzAccount
Get-AzSubscription
Set-AzContext -SubscriptionId 'yourSubscriptionID'

$nodeTypeName = 'nt1vm'
$resourceGroup = 'sfclustertutorialgroup'
$publicConfig = @{'UserName' = 'newuser'}
$privateConfig = @{'Password' = 'PasSwo0rd$#!'}
$extName = 'VMAccessAgent'
$publisher = 'Microsoft.Compute'
$node = Get-AzVmss -ResourceGroupName $resourceGroup -VMScaleSetName $nodeTypeName
$node = Add-AzVmssExtension -VirtualMachineScaleSet $node -Name $extName -Publisher $publisher -Setting $publicConfig -ProtectedSetting $privateConfig -Type $extName -TypeHandlerVersion '2.0' -AutoUpgradeMinorVersion $true

Update-AzVmss -ResourceGroupName $resourceGroup -Name $nodeTypeName -VirtualMachineScaleSet $node