关闭 VM 会将所有 VM 状态返回为未知

本文关键字:VM 返回 未知 状态 关闭 | 更新日期: 2023-09-27 18:35:16

使用以下方法关闭和查询角色实例时。 关闭 VM 时,将返回所有其他角色实例,状态为就绪状态未知。 大约几分钟后,我可以再次查询并获取实际状态。 如何使用 Azure 管理 API 实时获取实际状态。 或者这是 VM 配置方式的问题? 它们配置了相同的存储位置和相同的虚拟网络

显示的代码基于 Visual Studio 2015 中部署和管理虚拟机的模板。

关闭 VM 的调用:

var shutdownParams = new VirtualMachineShutdownParameters();
if (deallocate)//deallocate is true in this instance
    shutdownParams.PostShutdownAction = PostShutdownAction.StoppedDeallocated; // Fully deallocate resources and stop billing
else
    shutdownParams.PostShutdownAction = PostShutdownAction.Stopped; // Just put the machine in stopped state, keeping resources allocated
await _computeManagementClient.VirtualMachines.ShutdownAsync(_parameters.CloudServiceName, _parameters.CloudServiceName, vmName, shutdownParams);
对所有

角色实例的查询调用 XXX_VirtualMachine 是一个保存名称和实例状态的类:

internal List<XXX_VirtualMachine> GetAllVirtualMachines()
{
    List<XXX_VirtualMachine> vmList = new List<XXX_VirtualMachine>();
    try
    {
        DeploymentGetResponse deployment;
        deployment = _computeManagementClient.Deployments.GetByName(_parameters.CloudServiceName, _parameters.CloudServiceName);
        for (int i = 0; i < deployment.RoleInstances.Count; i++)
        {
            vmList.Add(new XXX_VirtualMachine(deployment.RoleInstances[i].InstanceName, deployment.RoleInstances[i]));
        }
    }
    catch (Exception e)
    {
        System.Windows.Forms.MessageBox.Show(e.Message);
    }
    return vmList;
}

关闭 VM 会将所有 VM 状态返回为未知

所以我终于开始试一试了!(对延迟表示歉意,人们一直期待工作的东西 - 不体贴的傻瓜!

首先,这不是一个真正的答案! 只是对问题的探索,你可能已经知道了所有这些,但也许阅读它的人会看到我错过的东西。

我已经在单个云服务中创建了三个虚拟机,瞧!它完全符合您在关闭一个虚拟机时的预测。

首先,两个门户似乎都给出了可靠的答案,即使.Net请求报告RoleStatusUnknown也是如此。

查看从请求中产生的 Xml 到

https://management.core.windows.net/{subscriptionid}/services/hostedservices/vm01-u3rzv2q6/deploymentslots/Production

我们得到

<RoleInstance>
  <RoleName>vm01</RoleName>
  <InstanceName>vm01</InstanceName>
  <InstanceStatus>RoleStateUnknown</InstanceStatus>
  <InstanceSize>Basic_A1</InstanceSize>
  <InstanceStateDetails />
  <PowerState>Started</PowerState>

然后我启动了Powershell,看看它是否在做同样的事情,这是(并不意外,因为它调用相同的REST点)。 随着Get-AzureVm回归

ServiceName   Name Status          
-----------   ---- ------          
vm01-u3rzv2q6 vm01 CreatingVM      
vm01-u3rzv2q6 vm02 RoleStateUnknown
vm01-u3rzv2q6 vm03 RoleStateUnknown

在适当的时候,这又是可见的。

想知道时机是什么,然后我运行了这个

while ($true) { (get-azurevm -ServiceName vm01-u3rzv2q6 -Name vm01).InstanceStatus ; get-azurevm ; (date).DateTime } 
ReadyRole
vm01-u3rzv2q6 vm01 ReadyRole
vm01-u3rzv2q6 vm02 ReadyRole
vm01-u3rzv2q6 vm03 ReadyRole
07 March 2016 04:31:01
07 March 2016 04:31:36
StoppedDeallocated
vm01-u3rzv2q6 vm01 Stoppe...
vm01-u3rzv2q6 vm02 RoleSt...
vm01-u3rzv2q6 vm03 RoleSt...
07 March 2016 04:31:49
07 March 2016 04:33:44
StoppedDeallocated
vm01-u3rzv2q6 vm01 Stoppe...
vm01-u3rzv2q6 vm02 ReadyRole
vm01-u3rzv2q6 vm03 ReadyRole
07 March 2016 04:33:52

因此,似乎机器关闭了,然后一个进程必须开始更新云服务,这需要它查询其状态的能力,看起来正好两分钟。

API 中的某个位置必须有一个正确报告的位置,因为门户没有此问题。

我花了一段时间在一条死胡同里寻找虚拟机的"实例视图",但经典部署似乎不存在。

我的下一个想法是将一个简单的休息客户端放在一起,该客户端需要管理证书,看看是否可以对URI进行黑客攻击以提供更有趣的东西。(它必须在某个地方!

可能有用的是,PowerState不受此问题的影响。因此,当您遇到RoleStateUnknown错误时,您可能会对此进行二次检查,它远非完美,但根据您要执行的操作,它可能会起作用。

如果做不到这一点,我会说这显然是 Azure 中的一个错误,并且肯定会为此拨打支持电话。