关闭VM会将所有VM状态恢复为未知状态

时间:2016-02-17 21:48:21

标签: c# azure azure-virtual-machine azure-sdk-.net

使用以下方法关闭和查询角色实例时。当我关闭VM时,将返回状态为ready state unknown的所有其他角色实例。大约几分钟后,我可以再次查询并获得实际状态。如何使用Azure Management 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;
}

1 个答案:

答案 0 :(得分:1)

所以我终于开始给这个踢了! (对于延迟道歉,人们一直期待着工作 - 不要傻瓜!)

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

我在一个Cloud Service中创建了三个虚拟机,并且看得出来!当你关闭一个时,它完全按照你的预测。

首先,即使.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中的某个地方必须有一个正确报告的位置,因为门户网站没有这个问题。

我花了一段时间沿着一条死胡同寻找一个&#39; InstanceView&#39;对于VM,但似乎并不存在经典部署。

我的下一个想法是将一个简单的休息客户端放在一起,该客户端获取管理证书,并查看是否可以对某些URI进行黑客攻击以提供更有趣的内容。 (它必须在某处!)

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

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