Scheijgrond.com

Ik Google mijzelf

Windows Containers

.Net Core applicaties zijn multi-platform, dus is het mogelijk om ze zowel onder Linux als onder Windows te starten. Het opzetten van een testomgeving met Kubernetes en Linux containers hebben we inmiddels onder de knie. Nu nog windows containers. Hier liepen we tegen een aantal problemen aan.

Hyper-V weigert

Een van de eerste problemen waar ik tegenaan liep was dat Hyper-V niet meer goed werkte waardoor docker problemen had met de windows containers. Alles wat ik met Hyper-V wilde doen zorgde voor een foutmelding:

“Hyper-V encountered an error trying to access an object on computer ‘localhost’ because the object was not found. The object might have been deleted. Verify that the Virtual Machine Management service on the computer is running. If the service is running, try to perform the task again by using Run as Administrator.”

Uiteindelijk via Shaun Cassells een oplossing gevonden.

#Als admin uitvoeren in powershell
MOFCOMP %SYSTEMROOT%\System32\WindowsVirtualization.V2.mof

Geen internet in de container

Toen Hyper-V eindelijk werkte wilde ik met een docker build een container gaan bouwen. 1 van de stappen in het proces was het downloaden van een script/package o.i.d. Hiervoor moest de container verbinding maken met het internet. Dat resulteerde in Host not found meldingen e.d. Dit heb ik uiteindelijk opgelost door te zorgen dat er een netwerk interface welke zowel DHCP verzorgde als verbinding had (ConnectionState = Connected) als laagste in de lijst van IP interfaces te hebben staan.

Hiervoor heb ik een tweetal commando's gebruikt.

 #Allereerst bepalen welke netwerk interfaces er zijn
 Get-NetIPInterface -AddressFamily IPv4 | Sort-Object -Property InterfaceMetric -Descending

 # Resultaat voorbeeld
 ifIndex InterfaceAlias                  AddressFamily NlMtu(Bytes) InterfaceMetric Dhcp     ConnectionState PolicyStore
------- --------------                  ------------- ------------ --------------- ----     --------------- -----------
82      vEthernet (nat)                 IPv4                  1500            5000 Disabled Connected       ActiveStore
2       Bluetooth Network Connection    IPv4                  1500              65 Enabled  Disconnected    ActiveStore
22      Local Area Connection* 2        IPv4                  1500              25 Enabled  Disconnected    ActiveStore
30      Local Area Connection* 1        IPv4                  1500              25 Enabled  Disconnected    ActiveStore
8       Ethernet                        IPv4                  1500              20 Enabled  Disconnected    ActiveStore
74      vEthernet (WSL)                 IPv4                  1500              15 Disabled Connected       ActiveStore
62      vEthernet (Default Switch)      IPv4                  1500              15 Disabled Connected       ActiveStore
63      vEthernet (DockerNAT)           IPv4                  1500              10 Enabled  Connected       ActiveStore

#De interface met de laagste interfacemetric moet DCHP en Connected zijn.
Set-NetIPInterface -InterfaceAlias 'vEthernet (DockerNAT)' -InterfaceMetric 10

Met dank aan ImproveAndRepeat

Windows versies

Linux containers lijken een stuk minder gevoelig voor het host OS dan dat Windows containers dat zijn. Als de build gelukt was en vervolgens gestart op de host volgde er regelmatig een melding dat de host niet compatible was. Hierom was het van belang om de juiste versie van een windows container te kiezen die past bij het Host OS.

Microsoft beschrijft hier hoe een server voorbereid moet worden op containers.

Er is een uitgebreide pagina waar dit staat beschreven. De korte veilige samenvatting is kijk welke versie er staat bij winver en kies een windowscore of nanoserver met dezelfde versie. Kleine kanttekening Windows server 2019 (Winver 1809) ondersteund niet het zetten van de path variable wat nodig was voor een node applicatie waardoor weer een alternatieve oplossing gevonden moest worden.

Bonus voor langzame docker builds

Op een gegeven moment tijdens het testen werd de boel een beetje traag met die docker build acties. Dit kan versneld worden door bepaalde folders niet te kopieren naar het docker image. Dit wordt geregeld met een .dockerignore bestand. Hierin kunnen dan folders zoals .VSCODE en .git en NodeModules

/.vscode/*
/__mocks__/*
/node_modules/*
/.git/*