Kubernetes-native Apps in Clustern bereitstellen
Bereitstellung von containerisierten Anwendungen in IBM Cloud® Kubernetes Service unter Verwendung von Kubernetes Techniken. Führen Sie rollierende Updates und Rollbacks ohne Ausfallzeiten für Ihre Benutzer durch.
Weitere Informationen zur Erstellung von Konfigurationsdateien finden Sie im Handbuch Best Practices für die Konfiguration.
Kubernetes-Dashboard starten
Greifen Sie auf das Kubernetes Dashboard zu, um Cluster- und Worker-Node-Informationen über die IBM Cloud Konsole oder CLI anzuzeigen.
Bevor Sie beginnen, vergewissern Sie sich, dass Sie die richtige Zugangsrolle haben. Melden Sie sich an Ihrem Konto an. If applicable, target the appropriate resource group. Legen Sie den Kontext für den Cluster fest.
Kubernetes-Dashboard über die IBM Cloud-Konsole starten
- Melden Sie sich bei der IBM Cloud -Konsole an.
- Wählen Sie in der Menüleiste das Konto aus, das Sie verwenden möchten.
- Klicken Sie im Menü  auf "Container > Cluster ".
- Klicken Sie auf der Seite Cluster auf den Cluster, auf den Sie zugreifen möchten.
- Klicken Sie auf der Seite mit den Clusterdetails auf die Schaltfläche Kubernetes-Dashboard.
Kubernetes-Dashboard über die Befehlszeilenschnittstelle starten
Die CLI-Methode ermöglicht Automatisierung und CI/CD-Integration. Installieren Sie die CLI, bevor Sie beginnen.
-
Holen Sie sich Ihren Kubernetes Ausweis.
kubectl config view -o jsonpath='{.users[0].user.auth-provider.config.id-token}' -
Kopieren Sie den ID-Token-Wert aus der Ausgabe.
-
Starten Sie den Proxy.
kubectl proxyBeispielausgabe
Starting to serve on 127.0.0.1:8001 -
Melden Sie sich beim Dashboard an.
-
Rufen Sie in Ihrem Browser die folgende Website auf: URL:
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/ -
Wählen Sie auf der Anmeldeseite die Authentifizierungsmethode Token aus.
-
Fügen Sie den Wert des ID-Tokens in das Feld Token ein und klicken Sie auf SIGN IN.
-
Verwenden Sie CTRL+C, um den Befehl proxy zu beenden. Führen Sie kubectl proxy erneut aus, um das Dashboard neu zu starten.
Apps über das Kubernetes-Dashboard bereitstellen
Stellen Sie Anwendungen über das Dashboard bereit, indem Sie Konfigurationsdetails eingeben oder eine YAML-Datei hochladen.
Bevor Sie beginnen, öffnen Sie das Dashboard und vergewissern Sie sich, dass Sie eine Dienstzugriffsrolle haben. Melden Sie sich an Ihrem Konto an. If applicable, target the appropriate resource group. Legen Sie den Kontext für den Cluster fest.
So stellen Sie Ihre Anwendung bereit
-
Klicken Sie auf + Erstellen.
-
Wählen Sie eine Verteilungsmethode:
- Wählen Sie Anwendungsdetails angeben und geben Sie die Details ein.
- Wählen Sie YAML- oder JSON-Datei hochladen, um die Konfigurationsdatei Ihrer Anwendung hochzuladen.
-
Klicken Sie auf Bereitstellungen, um zu überprüfen, ob Ihre Anwendung erfolgreich bereitgestellt wurde.
Apps über die CLI (Befehlszeilenschnittstelle) bereitstellen
Die CLI-Methode bietet eine präzise Steuerung und ermöglicht eine Automatisierung. Sie erstellen Konfigurationsdateien, in denen die Ressourcen Ihrer Anwendung definiert sind und die versionskontrolliert werden können.
Bevor Sie beginnen, installieren Sie die CLI und vergewissern Sie sich, dass Sie über eine Dienstzugangsrolle verfügen. Melden Sie sich an Ihrem Konto an. If applicable, target the appropriate resource group. Legen Sie den Kontext für den Cluster fest.
So stellen Sie Ihre Anwendung bereit
-
Erstellen Sie eine Konfigurationsdatei, die je nach Bedarf Bereitstellungs-, Dienst- und Ingress-Ressourcen enthält. Erfahren Sie mehr über das Sichern der persönlichen Daten bei der Arbeit mit Kubernetes-Ressourcen.
-
Wenden Sie die Konfigurationsdatei an.
kubectl apply -f config.yaml -
Überprüfen Sie, ob Sie auf Ihre Anwendung zugreifen können.
Apps für bestimmte Workerknoten mithilfe von Bezeichnungen bereitstellen
Wenn Sie eine App bereitstellen, werden die App-Pods ohne Unterschied für verschiedene Workerknoten in Ihrem Cluster bereitgestellt. Manchmal möchten Sie vielleicht die Workerknoten einschränken, auf denen die App-Pods bereitgestellt werden sollen. Beispiel: Sie möchten, dass App-Pods nur für Workerknoten in einem bestimmten Worker-Pool bereitgestellt werden, weil sich diese Workerknoten auf Bare-Metal-Maschinen befinden. Fügen Sie Ihrer App-Bereitstellung eine Affinitätsregel hinzu, um die Workerknoten anzugeben, für die die App-Pods bereitgestellt werden müssen.
Vorbereitende Schritte
- Melden Sie sich an Ihrem Konto an. If applicable, target the appropriate resource group. Legen Sie den Kontext für den Cluster fest.
- Optional: Legen Sie eine Bezeichnung für den Worker-Pool fest, der für die Ausführung der App verwendet werden soll.
Gehen Sie wie folgt vor, um Apps auf bestimmten Workerknoten bereitzustellen
-
Rufen Sie die ID des Worker-Pools ab, in dem die App-Pods bereitgestellt werden sollen.
ibmcloud ks worker-pool ls --cluster <cluster_name_or_ID> -
Listen Sie die Workerknoten auf, die sich in dem Worker-Pool befinden, und notieren Sie sich eine der privaten IP-Adressen.
ibmcloud ks worker ls --cluster <cluster_name_or_ID> --worker-pool <worker_pool_name_or_ID> -
Beschreiben Sie den Workerknoten. Notieren Sie sich in der Ausgabe für Labels die Bezeichnung der Worker-Pool-ID:
ibm-cloud.kubernetes.io/worker-pool-id.In den Schritten dieses Abschnitts wird eine Worker-Pool-ID zum Bereitstellen von App-Pods für Workerknoten in diesem Worker-Pool verwendet. Zum Bereitstellen von App-Pods für bestimmte Workerknoten durch Verwendung einer anderen Bezeichnung (Label), notieren Sie sich dementsprechend diese andere Bezeichnung. Beispiel: Zum Bereitstellen von App-Pods nur für Workerknoten in einem bestimmten privaten VLAN, verwenden Sie die Bezeichnung
privateVLAN=.kubectl describe node <worker_node_private_IP>Beispielausgabe
NAME: 10.xxx.xx.xxx Roles: <none> Labels: arch=amd64 beta.kubernetes.io/arch=amd64 beta.kubernetes.io/instance-type=b3c.4x16.encrypted beta.kubernetes.io/os=linux failure-domain.beta.kubernetes.io/region=us-south failure-domain.beta.kubernetes.io/zone=dal10 ibm-cloud.kubernetes.io/encrypted-docker-data=true ibm-cloud.kubernetes.io/ha-worker=true ibm-cloud.kubernetes.io/iaas-provider=softlayer ibm-cloud.kubernetes.io/machine-type=b3c.4x16.encrypted ibm-cloud.kubernetes.io/sgx-enabled=false ibm-cloud.kubernetes.io/worker-pool-id=00a11aa1a11aa11a1111a1111aaa11aa-11a11a ibm-cloud.kubernetes.io/worker-version=1.35_1534 kubernetes.io/hostname=10.xxx.xx.xxx privateVLAN=1234567 publicVLAN=7654321 Annotations: node.alpha.kubernetes.io/ttl=0 ... -
Hinzufügen einer Affinitätsregel für das Worker-Pool-ID-Label für die App-Bereitstellung.
YAML-Beispieldatei
apiVersion: apps/v1 kind: Deployment metadata: name: with-node-affinity spec: template: spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: ibm-cloud.kubernetes.io/worker-pool-id operator: In values: - <worker_pool_ID> ...Im Abschnitt Affinität der YAML-Beispieldatei steht
ibm-cloud.kubernetes.io/worker-pool-idfürkeyund<worker_pool_ID>fürvalue. -
Wenden Sie die aktualisierte Bereitstellungskonfigurationsdatei an.
kubectl apply -f with-node-affinity.yaml -
Stellen Sie sicher, dass die App-Pods auf den richtigen Workerknoten bereitgestellt wurden.
-
Listen Sie die Pods in Ihrem Cluster auf.
kubectl get pods -o wideBeispielausgabe
NAME READY STATUS RESTARTS AGE IP NODE cf-py-d7b7d94db-vp8pq 1/1 Running 0 15d 172.30.xxx.xxx 10.176.48.78 -
Geben Sie in der Ausgabe einen Pod für Ihre App an. Notieren Sie sich die private IP-Adresse (NODE) des Workerknotens, auf dem sich der Pod befindet.
In der vorherigen Beispielausgabe befindet sich der App-Pod
cf-py-d7b7d94db-vp8pqauf einem Workerknoten mit der IP-Adresse10.xxx.xx.xxx. -
Listen Sie die Workerknoten im Worker-Pool auf, die Sie in Ihrer App-Bereitstellung angegeben haben.
ibmcloud ks worker ls --cluster <cluster_name_or_ID> --worker-pool <worker_pool_name_or_ID>Beispielausgabe
ID Public IP Private IP Machine Type State Status Zone Version kube-dal10-crb20b637238bb471f8b4b8b881bbb4962-w7 169.xx.xxx.xxx 10.176.48.78 b3c.4x16 normal Ready dal10 1.8.6_1504 kube-dal10-crb20b637238bb471f8b4b8b881bbb4962-w8 169.xx.xxx.xxx 10.176.48.83 b3c.4x16 normal Ready dal10 1.8.6_1504 kube-dal12-crb20b637238bb471f8b4b8b881bbb4962-w9 169.xx.xxx.xxx 10.176.48.69 b3c.4x16 normal Ready dal12 1.8.6_1504Wenn Sie eine App-Affinitätsregel basierend auf einem anderen Faktor erstellt haben, rufen Sie stattdessen diesen Wert ab. Um beispielsweise zu bestätigen, dass der App-Pod auf einem Workerknoten in einem bestimmten VLAN bereitgestellt wurde, zeigen Sie das VLAN an, in dem sich der Workerknoten befindet, indem Sie
ibmcloud ks worker get --cluster <cluster_name_or_ID> --worker <worker_ID>ausführen. -
Vergewissern Sie sich in der Ausgabe, dass der Workerknoten mit der privaten IP-Adresse, die Sie im vorherigen Schritt angegeben haben, in diesem Worker-Pool bereitgestellt ist.
-
Bereitstellen einer Anwendung auf einem NVIDIA GPU-Rechner
Wenn Sie einen GPU-Maschinentyp haben, können Sie die Verarbeitungszeit beschleunigen, die für rechenintensive Workloads wie KI, maschinelles Lernen, Inferenzen usw. erforderlich ist.
Wichtige Treiberänderungen ab Kubernetes Version 1.36: IBM Cloud Kubernetes Service installiert nicht mehr NVIDIA GPU-Treiber auf Worker Nodes mit GPUs ab Kubernetes Version 1.36. Wenn Sie GPU-Workloads auf Clustern der Version 1.36 oder höher ausführen möchten, müssen Sie die Installation und den Lebenszyklus der GPU-Treiber auf Ihren eigenen Worker Nodes verwalten. Für Cluster mit der Version 1.35 oder früher sind die von IBM bereitgestellten GPU-Treiber weiterhin verfügbar. Eine Anleitung zur Migration finden Sie unter Migration auf selbstverwaltete NVIDIA GPU-Treiber.
In den nachfolgenden Abschnitten erfahren Sie, wie Sie Workloads bereitstellen, für die die GPU erforderlich ist. Sie können jedoch auch Anwendungen bereitstellen, die ihre Arbeitslasten nicht sowohl auf der GPU als auch auf der CPU verarbeiten müssen.
Mit dieser Kubernetes Demo können Sie auch mathematisch intensive Workloads wie das TensorFlow Machine-Learning-Framework ausprobieren.
Voraussetzungen
Vorbereitende Schritte
-
Erstellen Sie einen Cluster oder Worker-Pool, der einen GPU-Typ verwendet. Beachten Sie, dass das Einrichten einer Bare-Metal-Maschine mehr als einen Geschäftstag in Anspruch nehmen kann. Eine Liste der verfügbaren Versionen finden Sie unter den folgenden Links.
-
Stellen Sie sicher, dass Ihnen eine Servicezugriffsrolle zugeordnet ist, die Ihnen die entsprechende RBAC-Rolle für Kubernetes erteilt, um mit Kubernetes-Ressourcen im Cluster arbeiten zu können.
Für Kubernetes Version 1.36 und höher: Sie müssen den NVIDIA GPU-Treiber-Stack selbst installieren und verwalten. IBM Cloud Kubernetes Service bietet keine vorinstallierten GPU-Treiber mehr auf Worker Nodes. Folgen Sie der Installationsanleitung NVIDIA GPU Operator, um die erforderlichen Komponenten zu installieren:
- NVIDIA Kernel-Treiber
- Container-Laufzeitkomponenten (z. B. nvidia-container-toolkit)
- Kubernetes Geräte-Plugin
Solange der Treiber nicht installiert ist, bleiben Pods, die GPUs anfordern, im Zustand Pending. Sie werden automatisch auf Running umgestellt, sobald ein kompatibler Treiber auf dem Knoten verfügbar ist.
Für Kubernetes Version 1.35 und früher: IBM-vorausgesetzte GPU-Treiber werden automatisch auf GPU-Worker-Nodes installiert. Eine zusätzliche Treiberinstallation ist nicht erforderlich.
Workload implementieren
-
Erstellen Sie eine YAML-Datei. In diesem Beispiel verwaltet eine
JobYAML batch-ähnliche Workloads, indem sie einen kurzlebigen Pod erstellt, der so lange läuft, bis der Befehl abgeschlossen und erfolgreich beendet ist.Für GPU-Workloads müssen Sie das Feld
resources: limits: nvidia.com/gpuin der YAML des Auftrags angeben.apiVersion: batch/v1 kind: Job metadata: name: nvidia-devicequery labels: name: nvidia-devicequery spec: template: metadata: labels: name: nvidia-devicequery spec: containers: - name: nvidia-devicequery image: nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda11.7.1-ubuntu20.04 imagePullPolicy: IfNotPresent resources: limits: nvidia.com/gpu: 2 restartPolicy: NeverVerstehen Ihrer YAML-Komponenten Komponente Beschreibung Namen für Metadaten und Bezeichnung Geben Sie einen Namen und eine Bezeichnung für den Job ein und verwenden Sie denselben Namen sowohl in den Metadaten der Datei als auch in den spec template-Metadaten. Beispiel:nvidia-devicequery.containers.imageGeben Sie ein Image an, von dem der Container eine Instanz ausführt. In diesem Beispiel wird der Wert für die Verwendung des CUDA-Einheitenabfrageimage DockerHub festgelegt: nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda11.7.1-ubuntu20.04.containers.imagePullPolicyUm nur ein neues Image zu extrahieren, wenn das Image sich nicht aktuell auf dem Workerknoten befindet, geben Sie IfNotPresentan.resources.limitsFür GPU-Maschinen müssen Sie eine Ressourcengrenze angeben. Das Kubernetes Device Plug-in stellt die Standard-Ressourcenanforderung so ein, dass sie dem Limit entspricht.
- Sie müssen den Schlüssel als
nvidia.com/gpuangeben. - Geben Sie die ganze Anzahl der von Ihnen angeforderten GPUs ein, z. B.
2. Beachten Sie, dass Container-Pods keine GPUs gemeinsam nutzen und GPUs nicht überlastet werden können. Wenn Sie zum Beispiel nur über eine Maschine des Typsmg1c.16x128verfügen, stehen Ihnen nur zwei GPUs auf dieser Maschine zur Verfügung und es kann maximal der Wert2angegeben werden.
- Sie müssen den Schlüssel als
-
Wenden Sie die YAML-Datei an. Zum Beispiel:
kubectl apply -f nvidia-devicequery.yaml -
Überprüfen Sie den Job-Pod, indem Sie Ihre Pods nach dem Label
nvidia-devicequeryfiltern. Stellen Sie sicher, dass der STATUS den Wert Completed aufweist.kubectl get pod -A -l 'name in (nvidia-devicequery)'Beispielausgabe
NAME READY STATUS RESTARTS AGE nvidia-devicequery-ppkd4 0/1 Completed 0 36s -
Beschreiben Sie den Pod, um zu sehen, wie das GPU-Einheiten-Plug-in den Pod terminiert hat.
-
In den Feldern
LimitsundRequestsentspricht die von Ihnen angegebene Ressourcengrenze der Anforderung, die das Einheiten-Plug-in automatisch festgelegt hat. -
Überprüfen Sie in den Ereignissen, dass der Pod dem GPU-Workerknoten zugewiesen ist.
kubectl describe pod nvidia-devicequery-ppkd4Beispielausgabe
NAME: nvidia-devicequery-ppkd4 Namespace: default ... Limits: nvidia.com/gpu: 1 Requests: nvidia.com/gpu: 1 ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 1m default-scheduler Successfully assigned nvidia-devicequery-ppkd4 to 10.xxx.xx.xxx ...
-
-
Um sicherzustellen, dass der Job die GPU zum Berechnen der Workload verwendet hat, können Sie die entsprechenden Protokolle überprüfen.
kubectl logs nvidia-devicequery-ppkd4Beispielausgabe
/cuda-samples/sample Starting... CUDA Device Query (Runtime API) version (CUDART static linking) Detected 1 CUDA Capable device(s) Device 0: "Tesla P100-PCIE-16GB" CUDA Driver Version / Runtime Version 11.4 / 11.7 CUDA Capability Major/Minor version number: 6.0 Total amount of global memory: 16281 MBytes (17071734784 bytes) (056) Multiprocessors, (064) CUDA Cores/MP: 3584 CUDA Cores GPU Max Clock rate: 1329 MHz (1.33 GHz) Memory Clock rate: 715 Mhz Memory Bus Width: 4096-bit L2 Cache Size: 4194304 bytes Maximum Texture Dimension Size (x,y,z) 1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384) Maximum Layered 1D Texture Size, (num) layers 1D=(32768), 2048 layers Maximum Layered 2D Texture Size, (num) layers 2D=(32768, 32768), 2048 layers Total amount of constant memory: 65536 bytes Total amount of shared memory per block: 49152 bytes Total shared memory per multiprocessor: 65536 bytes Total number of registers available per block: 65536 Warp size: 32 Maximum number of threads per multiprocessor: 2048 Maximum number of threads per block: 1024 Max dimension size of a thread block (x,y,z): (1024, 1024, 64) Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535) Maximum memory pitch: 2147483647 bytes Texture alignment: 512 bytes Concurrent copy and kernel execution: Yes with 2 copy engine(s) Run time limit on kernels: No Integrated GPU sharing Host Memory: No Support host page-locked memory mapping: Yes Alignment requirement for Surfaces: Yes Device has ECC support: Enabled Device supports Unified Addressing (UVA): Yes Device supports Managed Memory: Yes Device supports Compute Preemption: Yes Supports Cooperative Kernel Launch: Yes Supports MultiDevice Co-op Kernel Launch: Yes Device PCI Domain ID / Bus ID / location ID: 0 / 175 / 0 Compute Mode: < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) > deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 11.4, CUDA Runtime Version = 11.7, NumDevs = 1 Result = PASSIn diesem Beispiel sehen Sie, dass eine GPU zur Ausführung des Jobs verwendet wurde, da die GPU im Workerknoten terminiert wurde. Wenn der Grenzwert auf 2 gesetzt ist, werden nur 2 GPUs angezeigt.
Nachdem Sie nun eine Test-GPU-Arbeitslast bereitgestellt haben, möchten Sie Ihren Cluster vielleicht so einrichten, dass er ein Tool ausführt, das auf GPU-Verarbeitung angewiesen ist, wie z. B. IBM Maximo Visual Inspection.
Umstellung auf selbstverwaltete NVIDIA GPU-Treiber
Ausführliche Anleitungen zur Migration von IBM-bereitgestellten GPU-Treibern zu selbstverwalteten Treibern beim Upgrade auf Kubernetes Version 1.36 finden Sie unter Migration zu selbstverwalteten NVIDIA GPU-Treibern für Kubernetes 1.36.