Wenn Sie eine Anwendung auf Basis von Legacy-Windows-Komponenten (beispielsweise .NET Framework) erstellen und Windows-Container auf vSphere bereitstellen möchten, führen Sie dieses Verfahren durch, um ein benutzerdefiniertes Windows-Maschinen-Image zu erstellen. Das Verfahren ist in die folgenden Abschnitte unterteilt:
HinweisAuf Tanzu Kubernetes Grid v1.6 ausgeführte Windows-Arbeitslastcluster können nicht auf v2.1 aktualisiert werden. Eine Problemumgehung finden Sie in den Versionshinweisen zu TKG v2.1.
Zur Erstellung eines benutzerdefinierten Maschinen-Image benötigen Sie Folgendes:
apt
anstelle von snap
, um Docker über eine CLI zu installieren.kubectl
in Installieren der Tanzu CLI und anderer Tools für die Verwendung mit eigenständigen Verwaltungsclustern.Importieren Sie das Ubuntu- oder Photon-OVA-Image in vCenter, um es als Vorlage für Ihr benutzerdefiniertes Image zu verwenden, indem Sie die folgenden Schritte ausführen:
Importieren Sie die ISO-Images von Windows Server 2019 und VMware Tools in Ihren Datenspeicher, indem Sie die folgenden Schritte durchführen:
iso
oder erstellen Sie ihn gegebenenfalls, indem Sie auf Neuer Ordner (New Folder) klicken.iso
hoch.Erstellen Sie eine YAML-Datei namens builder.yaml
mit der folgenden Konfiguration:
apiVersion: v1
kind: Namespace
metadata:
name: imagebuilder
---
apiVersion: v1
kind: Service
metadata:
name: imagebuilder-wrs
namespace: imagebuilder
spec:
selector:
app: image-builder-resource-kit
type: NodePort
ports:
- port: 3000
targetPort: 3000
nodePort: 30008
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: image-builder-resource-kit
namespace: imagebuilder
spec:
selector:
matchLabels:
app: image-builder-resource-kit
template:
metadata:
labels:
app: image-builder-resource-kit
spec:
nodeSelector:
kubernetes.io/os: linux
containers:
- name: windows-imagebuilder-resourcekit
image: projects.registry.vmware.com/tkg/windows-resource-bundle:v1.24.10_vmware.1-tkg.2
imagePullPolicy: Always
ports:
- containerPort: 3000
Verbinden Sie die Kubernetes-CLI mit Ihrem Verwaltungscluster, indem Sie Folgendes ausführen:
kubectl config use-context MY-MGMT-CLUSTER-admin@MY-MGMT-CLUSTER
Dabei gilt: MY-MGMT-CLUSTER
ist der Name des Verwaltungsclusters.
Wenden Sie die Konfigurationsdatei builder.yaml
an.
kubectl apply -f ./builder.yaml
Hiermit wird ein Container bereitgestellt, mit dem die Maschine die benötigten Dateien während der Image-Erstellung aus einem HTTP-Speicherort abrufen kann. Die Ausgabe entspricht:
namespace/imagebuilder created
service/imagebuilder-wrs created
deployment.apps/image-builder-resource-kit created
Um sicherzustellen, dass der Container ausgeführt wird, führen Sie Folgendes aus:
kubectl get pods -n imagebuilder
Die Ausgabe entspricht:
NAME READY STATUS RESTARTS AGE
image-builder-resource-kit-756ccdc4ff-rcxpq 1/1 Running 0 4m16s
Rufen Sie eine IP-Adresse der Steuerungsebene für den Verwaltungscluster ab:
Listen Sie die Knoten des Clusters mit der Ausgabe wide
auf:
kubectl get nodes -o wide
Notieren Sie in der Ausgabe den Wert INTERNAL-IP
des Knotens mit ROLE
, die als control-plane
aufgeführt ist.
Erstellen Sie eine JSON-Datei in einem leeren Ordner namens windows.json
mit der folgenden Konfiguration:
{
"additional_executables_destination_path": "C:\\ProgramData\\Temp",
"additional_executables_list": "http://CONTROLPLANE-IP:30008/files/antrea-windows/antrea-windows-advanced.zip,http://CONTROLPLANE-IP:30008/files/kubernetes/kube-proxy.exe",
"additional_executables": "true",
"additional_prepull_images": "mcr.microsoft.com/windows/servercore:ltsc2019",
"build_version": "windows-2019-kube-v1.24.10",
"cloudbase_init_url": "http://CONTROLPLANE-IP:30008/files/cloudbase_init/CloudbaseInitSetup_1_1_4_x64.msi",
"cluster": "VSPHERE-CLUSTER-NAME",
"containerd_sha256_windows": "d29f5276584e869a5933db668fd6f17b7417c48ac04dd1c2a2c7f412f948f89c",
"containerd_url": "http://CONTROLPLANE-IP:30008/files/containerd/cri-containerd-v1.6.6+vmware.3.windows-amd64.tar",
"containerd_version": "v1.6.6",
"convert_to_template": "true",
"create_snapshot": "false",
"datacenter": "DATACENTER-NAME",
"datastore": "DATASTORE-NAME",
"disable_hypervisor": "false",
"disk_size": "40960",
"goss_inspect_mode": "true",
"goss_url": "http://CONTROLPLANE-IP:30008/files/goss/goss-alpha-windows-amd64.exe",
"insecure_connection": "true",
"kubernetes_base_url": "http://CONTROLPLANE-IP:30008/files/kubernetes/",
"kubernetes_semver": "v1.24.10+vmware.1",
"kubernetes_series": "v1.24.10",
"linked_clone": "false",
"load_additional_components": "true",
"netbios_host_name_compatibility": "false",
"network": "NETWORK",
"nssm_url": "http://CONTROLPLANE-IP:30008/files/nssm/nssm.exe",
"os_iso_path": "OS-ISO-PATH",
"password": "VCENTER-PASSWORD",
"pause_image": "mcr.microsoft.com/oss/kubernetes/pause:3.6",
"prepull": "false",
"resource_pool": "",
"runtime": "containerd",
"template": "",
"unattend_timezone": "WINDOWS-TIMEZONE",
"username": "VCENTER-USERNAME",
"vcenter_server": "VCENTER-IP",
"vmtools_iso_path": "VMTOOLS-ISO-PATH",
"windows_updates_categories": "CriticalUpdates SecurityUpdates UpdateRollups",
"windows_updates_kbs": "",
"wins_url": "http://CONTROLPLANE-IP:30008/files/wins/wins.exe",
"wins_version": "v0.4.11"
}
Dabei gilt:
WINDOWS-TIMEZONE
ist die Windows-Zeitzone für Ihre Umgebung. Beispiel: GMT Standard Time
.VSPHERE-CLUSTER-NAME
ist der Name des vSphere-Clusters. Beispiel: VSAN-Cluster
.VCENTER-PASSWORD
ist das vCenter-Kennwort.VCENTER-USERNAME
ist der vCenter-Benutzername.DATASTORE-NAME
ist der Name des Datenspeichers, der in vCenter angezeigt wird. Beispiel: vsanDatastore
.DATACENTER-NAME
ist der Name des Datencenters, der in vCenter angezeigt wird. Beispiel: VSAN-DC
.VMTOOLS-ISO-PATH
ist der Pfad der ISO-Datei von VMware Tools mit folgender Struktur: [DATASTORE-NAME] iso/VMware-tools-windows-11.2.5-17337674.iso
.NETWORK
ist der Name eines Netzwerks oder einer Portgruppe, der in vCenter unter Menü > Netzwerk > Netzwerke (Menu > Networking > Networks) angezeigt wird. Beispiel: VM Network
.OS-ISO-PATH
ist der Pfad der ISO-Datei von Windows Server 2019 mit folgender Struktur: [DATASTORE-NAME] iso/en-us_windows_server_2019_updated_aug_2022_x64_dvd_a6431a28.iso
.VCENTER-IP
ist die IP-Adresse oder der FQDN des vCenter Servers.CONTROLPLANE-IP
ist die IP-Adresse des Verwaltungsclusters, die oben abgerufen wurde.CONTAINERD-URL
und CONTAINERD-SHA
sind die oben abgerufenen Werte für containerd.path
und containerd.sha256
.Stellen Sie eine Abfrage an das Windows-Ressourcenpaket auf dem nodePort
-Endpoint der Steuerungsebene ab und überprüfen Sie den vorhandenen Dateipfad:
curl http://CONTROLPLANE-IP:30008
Fügen Sie die XML-Datei mit den Windows-Einstellungen hinzu, indem Sie die folgenden Schritte durchführen:
autounattend.xml
in VMware {code} Sample Exchange.<ProductKey>...</ProductKey>
.autounattend.xml
.windows.json
.Erstellen Sie im Ordner mit den Dateien windows.json
und autounattend.xml
das benutzerdefinierte Image, indem Sie folgenden Befehl ausführen:
docker run -it --rm --mount type=bind,source=$(pwd)/windows.json,target=/windows.json --mount type=bind,source=$(pwd)/autounattend.xml,target=/home/imagebuilder/packer/ova/windows/windows-2019/autounattend.xml -e PACKER_VAR_FILES="/windows.json" -e IB_OVFTOOL=1 -e IB_OVFTOOL_ARGS='--skipManifestCheck' -e PACKER_FLAGS='-force -on-error=ask' -t projects.registry.vmware.com/tkg/image-builder:v0.1.13_vmware.2 build-node-ova-vsphere-windows-2019
Wenn ein Fehler auftritt oder der Build nicht mehr reagiert, beheben Sie mithilfe der Packer-Protokolle auf Ihrer Workstation Probleme in der Konfigurationsdatei windows.json
. Zusätzlich können Sie -e PACKER_LOG=1
zur obigen Befehlszeile hinzufügen, um ausführlichere Protokolle in Ihrer Konsole zu erhalten.
Um sicherzustellen, dass das Windows-Image verwendet werden kann, wählen Sie zunächst Ihren Host oder Cluster in vCenter, dann die Registerkarte VMs und anschließend VM-Vorlagen (VM Templates) aus, um das Windows-Image anzuzeigen.
Mit diesem Verfahren erstellen Sie eine Konfigurationsdatei für Ihren Windows-Arbeitslastcluster, verweisen in der Konfigurationsdatei auf das Windows-Image und verwenden dann die Tanzu CLI zum Erstellen des Arbeitslastclusters.
Kopieren Sie die Konfigurationsdatei des Verwaltungsclusters und speichern Sie sie unter einem neuen Namen, indem Sie das Verfahren unter vSphere mit Konfigurationsdateien für eigenständige Verwaltungscluster durchführen.
Ändern oder fügen Sie in der neuen Konfigurationsdatei Folgendes hinzu:
IS_WINDOWS_WORKLOAD_CLUSTER: "true"
Stellen Sie einen Arbeitslastcluster gemäß der Beschreibung unter Erstellen von Arbeitslastclustern bereit.