2016-02-17 21 views
13

Podczas korzystania z poniższych metod zamykanie i wykonywanie zapytań o instancje ról. Po zamknięciu maszyny wirtualnej zwracane są wszystkie inne instancje ról ze stanem stanu gotowości nieznany. Po około kilku minutach mogę ponownie zapytać i uzyskać aktualny status. Jak uzyskać aktualny stan w czasie rzeczywistym za pomocą interfejsów API zarządzania Azure. Czy jest to problem z konfiguracją maszyn wirtualnych? Są skonfigurowane w tym samym miejscu składowania oraz samej sieci wirtualnejWyłączanie maszyny wirtualnej zwraca wszystkie stany maszyny wirtualnej jako nieznane.

Kod pokazany został oparty off szablonu do wdrożenia i zarządzania maszynami wirtualnymi w Visual Studio 2015

wezwanie do wyłączenia 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); 

wezwanie do kwerendy dla wszystkich wystąpień ról XXX_VirtualMachine to klasa, która posiada imię i instancji status:

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

To pytanie mnie intryguje, ale nie mam zbyt wiele czasu, aby to zbadać! Czy możesz umieścić razem małą aplikację konsolową, która pokazuje, co widzisz (coś, co mogę wpaść do VS i obejrzeć, kiedy mam godzinę) - Nie mogę obiecać, że coś znajdę! ale nigdy nie wiesz, –

+0

Mogę umieścić aplikację razem, ale nie mogę udzielić Ci dostępu do moich maszyn Azure i certyfikatu zarządzania. Mogę utworzyć powłokę, w której podajesz nazwę usługi w chmurze i ścieżkę do certyfikatu do przetestowania, jeśli masz konto platformy Azure. Moje przeprosiny, ale mój zespół ds. Ryzyka związanego z bezpieczeństwem, byłyby mnie pełne, gdybym to zrobił. – Sorceri

+0

W porządku, mam konta i środowiska testowe, na których mogę je uruchomić, ale nie czas na połączenie kodu. Miałem nadzieję, że ktoś to wymyśli! Ale skoro tego nie zrobię, rzucę to! –

Odpowiedz

1

Więc w końcu udało mi się rzucić to! (przeprosiny za opóźnienie, ludzie ciągle oczekują tego od pracy - bezmyślni głupcy!)

Po pierwsze, to nie jest odpowiedź! tylko zgłębianie problemu i prawdopodobnie już to wszystko wiesz, ale może ktoś czytający go zobaczy coś, co przeoczyłem.

Stworzyłem trzy wirtualne maszyny wirtualne w jednej usłudze chmurowej i pozdrawiam! Robił dokładnie to, co przewidziałeś, kiedy go zamknąłeś.

Po pierwsze, oba portale wydają się udzielać wiarygodnych odpowiedzi, nawet jeśli zgłoszenie .Net zgłasza RoleStatusUnknown.

Patrząc na XML, który wychodzi z prośbą o

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

otrzymujemy

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

I potem wystrzelił w górę PowerShell aby sprawdzić, czy robi to samo, co było (nie nieoczekiwane, ponieważ wywołuje ten sam punkt REST). z numerem Get-AzureVm wracającym

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

We właściwym czasie, który ponownie jest widoczny.

Zastanawiasz się jaki był czas, ja wtedy prowadził ten

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 

Wygląda więc na to, że urządzenie wyłączy się, a następnie proces musi rozpocząć aktualizację usługi cloud, która zaczyna swoją zdolność sprawdzanie stanu na , co wydaje się, dokładnie dwie minuty.

Gdzieś w API nie musi być miejsce, które jest zgłaszane poprawnie ponieważ portale nie mają tego problemu.

Spędziłem trochę czasu w dół w ślepy zaułek szuka „InstanceView” dla VM, ale wydaje się, że nie istnieje dla klasycznych wdrożeń.

Moja następna myśl jest stworzenie prostego klienta odpoczynek że trwa certyfikat zarządzania i sprawdzić, czy URI można włamał się trochę dać coś bardziej interesującego. (musi gdzieś tam być!)

Co może być przydatne, jest to, że ten problem nie dotyczy rozwiązania PowerState. Dzięki temu możesz mieć dodatkowe sprawdzenie, gdy masz błąd RoleStateUnknown, który jest daleki od ideału, ale w zależności od tego, co chcesz zrobić, może zadziałać.

W przypadku braku tego, powiedziałbym, że jest to wyraźnie błąd na Azure i zdecydowanie mógł mieć wywołanie wsparcia dla niego.

+0

Dziękujemy za poświęcenie czasu i potwierdzenie problemu. Przyznano Ci punkty za wysiłek, jaki włożyłeś. – Sorceri

Powiązane problemy