Einleitung

Ich bin schon viele Jahre als Trainer bzw. Dozent tätig — anfänglich an der Volkshochschule, danach bei meinem Arbeitgeber. In der Volkshochschule hatte ich viele Kurse mit Client-Betriebssystemen wie Windows XP oder Windows 2000 gegeben. Die VHS stellte den Kursteilnehmern genauso wie mir einen entsprechenden PC bereit, und anschließend haben wir uns anhand des Kursbuchs durch die einzelnen Menüs geklickt. Meine ersten Serverkurse waren dann mit Windows 2000 Server. Hier stellte mir die Volkshochschule nichts mehr bereit. Damals habe ich alle um einen Tisch versammelt, und wir haben gemeinsam an einem PC die entsprechenden Basics gelernt — etwa wie man ADS einrichtet oder DNS und DHCP konfiguriert. Ich weiß noch, dass der PC damals einen AMD Athlon X2 enthielt und die Windows-Server-Umgebung via KVM auf Linux virtualisiert wurde. Warum ich das damals so getan habe? Es war wie in vielen solcher Projekte einfach der Spieltrieb: Neben dem Bereitstellen einer Infrastruktur sollte der eigene Wissensaufbau nicht zu kurz kommen.

Der Anfang

Als ich dann weitere Kurse mit Windows Server 2008 (R2) gegeben habe, sah ich mich gezwungen, eine andere Lösung zu schaffen. Mein erster Aufbau einer Schulungsumgebung mit Windows Server 2008 lief auf einem HP ProLiant MicroServer — ich bin mir fast sicher, dass es damals noch ein Generation 7 mit einem AMD Turion II war. Für alle Schulungsteilnehmer gab es eine eigene Windows-Server-VM, aber keine Netzwerktrennung … was allerdings für die meisten Übungen auch nicht nötig war. Über die Jahre wurde aus dem Generation 7 ein Generation 8 MicroServer und schließlich ein Intel NUC mit i5 und 32 GB RAM. Die Ansprüche stiegen, und ich glaube, zum Schluss habe ich dann auch mit unterschiedlichen VLANs und somit eigenen Netzen pro Teilnehmer gearbeitet.

Eine professionelle Umgebung muss her

Seit einiger Zeit gebe ich in unregelmäßigen Abständen Schulungen im Bereich Citrix. Als ich die erste halten sollte, habe ich mir intensiv Gedanken gemacht, wie die Ausgangssituation für die Teilnehmer sein sollte. Der Bedarf an Ressourcen ist in solchen Schulungsumgebungen um einiges höher als in klassischen Windows-Server-Schulungen: Es müssen viele Use Cases Raum finden, etwa das Aufbauen von Hochverfügbarkeit. Natürlich hatte ich auch selbst Citrix-Schulungen besucht und dabei die andere Seite kennengelernt. Citrix arbeitet mit Microsoft Azure zusammen und stellt jedem Schulungsteilnehmer eine recht „dicke“ VM (64 GB, 8 Kerne) als Hyper-V-Instanz zur Verfügung. Damit diese Ressource nicht unnötig Geld kostet, muss sie vor dem Bearbeiten einer Aufgabe erst einmal eingeschaltet werden — das dauert im Schnitt 15 Minuten. Jede Aufgabe ist vorkonfiguriert, und um Ressourcen zu sparen, sind nur die nötigen VMs innerhalb der Hyper-V-VM eingeschaltet. Wer einmal so eine Schulung besucht hat, weiß, dass die Umgebung sehr träge ist und teilweise extrem lange Wartezeiten mit sich bringt. Schade finde ich auch, dass die Umgebungen immer schon vordefiniert sind: Es ist also nicht möglich, eine Farm von Grund auf zu erstellen und durchzuarbeiten. Für mich stand sehr schnell fest, dass ich genau diesen Anspruch an meine Schulungsumgebung habe — jeder Teilnehmer soll eine eigene Farm von Grund auf erstellen können.

Gewisse Rahmenparameter möchte ich den Teilnehmern natürlich schon mitgeben: Zum einen soll eine Domäne „lab.local“ vorhanden sein, zum anderen möchte ich eine separate SQL-Server-Express-Instanz bereits vorinstalliert haben. Folgende VMs werden pro Schulungsteilnehmer bereitgestellt:

  • DC01 – Domain Controller ( DNS, DHCP )
  • MS01 – Management Server ( SQL Server Express, Lizenz Server )
  • XC01 – 1. Delivery Controller
  • XC02 – 2. Delivery Controller
  • SF01 – 1. StoreFront
  • SF02 – 2. StoreFront
  • PS01 – 1. Provisioning Server
  • PS02 – 2. Provisioning Server
  • NS01 – NetScaler Freemium
  • RD01 – Router

Ihr seht schon: Die Anzahl der VMs eskaliert hier ziemlich schnell, und das führt dazu, dass genügend Hardware-Ressourcen vorhanden sein müssen. Man könnte natürlich auf einen Management Server verzichten und alles über den DC regeln. Allerdings hatte ich diesen in einigen Schulungen sogar als Core-Variante laufen, um Ressourcen zu sparen — und damit war er als Management Server nicht geeignet.

Die ersten Schulungen

Meine erste Citrix-Schulung lief auf einem Dell PowerEdge R710 mit 2 × 6-Core-CPUs und 256 GB RAM. Das Storage war eine Kombination aus 4 × 256 GB SSD und 4 × 600 GB SAS-HDD als vSAN-Konstrukt. Die Performance innerhalb der Schulungsumgebung war bei fünf Teilnehmern leider nicht ideal: Gerade der Rollout via MCS oder PVS zwingt den Host bei CPU und Storage in die Knie. Das Feedback der Teilnehmer war durchweg negativ — aber: Lessons learned. Bei der nächsten Schulung habe ich einen weiteren Host dazugestellt, der mit einem Citrix Hypervisor ausgestattet war. Die Server habe ich mit einem Juniper EX3300 via 2 × 10 GBit verbunden. Die Trennung zwischen Control/Access Layer und Resource Layer hatte tatsächlich einen positiven Effekt und sollte die Basis meiner zukünftigen Lösungen darstellen. Die Schulungsteilnehmer waren zufrieden, und das gab mir die Bestätigung, dass ich mit dieser Lösung auf dem richtigen Weg bin. Auch im Storagebereich habe ich einen anderen Ansatz verfolgt: Jeder Teilnehmer bekam eine eigene SSD, und maximal zwei Teilnehmer teilten sich die 4 × 600 GB SAS-HDD. So konnte jeder Teilnehmer die Ressourcen einer SSD bzw. HDD fast vollständig nutzen. Der neue Citrix-Hypervisor-Host war ein Dell R230 mit E5-2450L-CPU und 96 GB RAM, als Festplatten 2 × 900 GB SAS-HDD im RAID 0. Dank 10 GBit im Backend war es so problemlos möglich, VMs via MCS auszurollen oder eine PVS-vDisk zu streamen.

Der Rückschlag

Nach einigen Schulungen und mit einsetzender Pandemie war ich gezwungen, meine Schulungsumgebung umzubauen. Bisher hatte ich sie immer wieder zu Hause abgebaut und am Schulungsort aufgebaut; in Zukunft soll der Zugriff von überall möglich sein. Für den Zugriff von extern nutze ich meine eigene Laborumgebung, die auf einem separaten Hypervisor läuft. Die Teilnehmer bekommen via NetScaler und Citrix den Remote Desktop Client als Published Application. Leider habe ich in der Zwischenzeit meine Hardware überarbeitet und auf energiesparende CPUs umgestellt. Das hatte den Effekt, dass die eingesetzten 6-Core-CPUs häufiger zu 100 % ausgelastet waren — 50 VMs mit mindestens 2 vCPUs sind eben eine extreme Überbuchung der Hardware. Für die nächste Schulung wird es also wieder eine 8-Core-CPU sein. Auch hatte ich darauf verzichtet, die Hosts mit 2 × 10 GBit anzubinden. Ich musste allerdings feststellen, dass 2 × 1 GBit mit Round Robin nicht wirklich optimal ist, wenn sechs Teilnehmer gleichzeitig ein vDisk-Image abziehen oder streamen. Auch hier wird es in Zukunft wieder 10 GBit geben.

Details zur Schulungsumgebung

Die Schulungsumgebung sollte für jeden Teilnehmer identisch sein. Mir war wichtig, dass niemand umdenken muss, wenn wir von Hostnamen oder IP-Adressen sprechen — also musste jeder Teilnehmer die gleichen Einstellungen verwenden können. Hierzu habe ich auf VMware-Ebene für jede Umgebung eine eigene Portgruppe erstellt.
Diese Portgruppe wurde mit einem VLAN-Tag versehen, der auch auf Switchebene gesetzt wurde. Damit hatte jeder Teilnehmer auf dem Citrix Hypervisor seine eigenen VMs und konnte innerhalb seiner Farm auch neue VMs ausrollen.

Die nächste Aufgabe: Wir brauchen einen Weg via RDP in die Schulungsumgebung hinein — und umgekehrt einen Weg hinaus. Aus der Schulungsumgebung soll man ins Internet zugreifen und das Management des Citrix Hypervisors erreichen können. Hierzu setze ich auf VyOS. Dieser schlanke, auf Debian basierende Router ermöglicht mir durch ein klassisches NAT, auf der einen Seite immer dasselbe Labornetz und auf der anderen Seite Management bzw. WAN zu betreiben. Meine VyOS-Konfiguration habe ich euch unten veröffentlicht. Wichtig: Wenn ihr die VM später duplizieren wollt, müsst ihr vorher die hw-id bei den Interfaces entfernen. Ansonsten legt VyOS immer wieder neue Interfaces an, weil es die Konfiguration beim Start nicht zuordnen kann. <br />

delete interface ethernet eth0 hw-id
delete interface ethernet eth1 hw-id
vyos@vyos# show
interfaces {
ethernet eth0 {
address dhcp
hw-id 00:0c:29:55:27:65
}
ethernet eth1 {
address 192.168.1.1/24
hw-id 00:0c:29:55:27:6f
}
loopback lo {
}
}
nat {
destination {
rule 10 {
description "RDP to MS01"
inbound-interface eth0
protocol tcp
translation {
address 192.168.1.11
port 3389
}
}
}
source {
rule 10 {
outbound-interface eth0
source {
address 192.168.1.0/24
}
translation {
address masquerade
}
}

Mit dem Router habt ihr sozusagen das Kernstück, das euch den Weg ebnet, die ganzen VMs beliebig oft zu duplizieren, ohne dass es zu Problemen kommt. Da ich die Infrastruktur auf VMware betreibe, habe ich ein kleines PowerCLI-Skript geschrieben, das mir das Duplizieren eines ganzen Labs für einen Schulungsteilnehmer erleichtert. Voraussetzung ist, dass ihr die Schulungsumgebungen in Ordner einteilt.

Das Skript ist sehr rudimentär, und ein PowerShell/PowerCLI-Spezialist weiß es bestimmt noch zu optimieren. Ich kopiere darin nicht nur die VM, sondern passe auch das Netzwerkinterface auf die entsprechende Portgruppe an. Damit sind die VMs direkt einsatzbereit.

Connect-VIServer -Server 10.66.99.80 -User Administrator@vsphere.local -Password Passwort1!


$srcvms = get-vm -location "LAB10" | select -expandproperty Name

Foreach ($srcvm in $srcvms) {

	$srvcvms_strip = $srcvm -replace "-LAB10"

	new-vm -name "$srvcvms_strip-LAB15" -vm $srcvm -vmhost 10.66.99.4 -datastore "RZ1-DS01-R5" -Location "LAB15"	

	get-vm "$srvcvms_strip-LAB15" | get-networkadapter | where {$_.NetworkName -eq "LAB10"} | Set-NetworkAdapter -NetworkName "LAB15" -confirm:$false
} 

Ich möchte noch ein paar Worte zum Thema Storage verlieren. Um gerade beim Installieren der Anwendungen nicht so viel Zeit zu verlieren, setze ich gerne SSDs ein, idealerweise eine eigene je Teilnehmer. Leider sind SSDs nach ein bis zwei Schulungen bei der Performance ziemlich am Ende, weil dann alle Blöcke einmal beschrieben wurden und erst gelöscht werden müssen, bevor sie neu beschrieben werden können. Das merkt man deutlich beim Duplizieren der VMs. In der letzten Schulung habe ich darauf verzichtet, jedem Teilnehmer eine eigene SSD bereitzustellen, und stattdessen aus 4 × 512 GB und 4 × 250 GB SSD jeweils ein RAID 5 gebaut. Das hat den Performance-Einbruch etwas gemindert; zudem waren die 512-GB-SSDs neu. Für die Management-Umgebung sind teilweise auch drehende Platten okay, während ich für den Citrix Hypervisor immer auf SSDs gehen würde. Das Sizing mit knapp 1 TB im RAID 0 war absolut ausreichend und liefert selbst beim gleichzeitigen Rollout von sechs Schulungsumgebungen via MCS noch gute Werte.

Fazit

Ich bin mit meiner Schulungsumgebung noch nicht am Ende. Bei jeder Schulung, die ich gebe, wird sie weiterentwickelt bzw. umgebaut. Das führt natürlich auch mal dazu, dass es nicht so optimal läuft wie geplant — allerdings lerne ich immer wieder etwas dazu. In letzter Zeit spiele ich zum Beispiel viel mit Windows Deployment Services und MDT. Aktuell entsteht mein Basis-Lab nämlich immer aus einem VMware-Template, das ich entsprechend klone. Viele sind hier schon weiter und lassen sich per MDT ganze Umgebungen zusammenbauen. Die Komplexität von MDT ist allerdings nicht zu unterschätzen: Bisher habe ich es geschafft, ein Windows-10-Image auszurollen. Es machte auch von alleine Windows Updates, aber die geplante Software-Installation lief leider nicht durch. Jedenfalls wird das bestimmt der nächste Schritt sein — neben dem Dauerthema, die Performance weiter zu optimieren.