无法 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 集群。
在部署期间,我已将 adminUsername 和 adminPassword 字符串指定为 ARM template parameters。我刚刚用了2长串随机字符,记录下来以备后用。
部署成功,例如我可以打开带有著名绿色圆圈的 SF cluster explorer 网页。
当我尝试连接到 VMSS 的其中一个节点时,为了检查我的 SF 应用程序日志,RDP 连接被拒绝:
我使用加载程序 public IP 地址进行 RDP 连接,并已验证有一个 LB 规则:
当我输入我在 ARM 模板部署期间指定的 adminUsername 和 adminPassword 字符串时,RDP 连接在我的域前面加上公司笔记本。
所以我尝试在 adminUsername 前面添加 LB public ip 地址后跟反斜杠,但这也不起作用。
我也试过 .\adminUsername(我公司笔记本的域是错误的)和 \adminUsername 和 nt1vm_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
我已经使用众所周知的 azure-quickstart-templates/service-fabric-secure-cluster-5-node-1-nodetype 模板创建了一个 Service Fabric 集群。
在部署期间,我已将 adminUsername 和 adminPassword 字符串指定为 ARM template parameters。我刚刚用了2长串随机字符,记录下来以备后用。
部署成功,例如我可以打开带有著名绿色圆圈的 SF cluster explorer 网页。
当我尝试连接到 VMSS 的其中一个节点时,为了检查我的 SF 应用程序日志,RDP 连接被拒绝:
我使用加载程序 public IP 地址进行 RDP 连接,并已验证有一个 LB 规则:
当我输入我在 ARM 模板部署期间指定的 adminUsername 和 adminPassword 字符串时,RDP 连接在我的域前面加上公司笔记本。
所以我尝试在 adminUsername 前面添加 LB public ip 地址后跟反斜杠,但这也不起作用。
我也试过 .\adminUsername(我公司笔记本的域是错误的)和 \adminUsername 和 nt1vm_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