gpt4 book ai didi

c# - 关闭虚拟机会将所有虚拟机状态返回为未知

转载 作者:可可西里 更新时间:2023-11-01 08:13:10 24 4
gpt4 key购买 nike

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

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

关闭虚拟机的调用:

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;
}

最佳答案

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

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

我在一个云服务中创建了三个虚拟机,您瞧!当你关闭它时,它的表现完全符合你的预期。

首先,即使 .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 中的某个位置必须有一个正确报告的位置,因为门户不存在此问题。

我花了一段时间在死胡同里寻找虚拟机的“InstanceView”,但经典部署似乎不存在这种情况。

我的下一个想法是组装一个简单的 REST 客户端,它需要一个管理证书,看看是否可以对 URI 进行一些修改以提供更有趣的东西。 (它一定在某个地方!)

可能有用的是,PowerState 不受此问题的影响。因此,当出现 RoleStateUnknown 错误时,您可能会进行二次检查,它远非完美,但取决于您想要做什么,它可能会起作用。

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

关于c# - 关闭虚拟机会将所有虚拟机状态返回为未知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35468461/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com