Bereitstellung von Anwendungen in Red Hat OpenShift-Clustern
Mit Red Hat® OpenShift® on IBM Cloud®-Clustern können Sie Apps aus einer fernen Datei oder einem fernen Repository (z. B. GitHub) mit einem einzigen Befehl bereitstellen. Zum Lieferumfang Ihrer Cluster gehören außerdem verschiedene integrierte Services, die Sie zum Betrieb Ihres Clusters verwenden können.
Apps in Red Hat OpenShift verschieben
Zum Erstellen einer App in Ihrem Red Hat OpenShift on IBM Cloud-Cluster können Sie die Red Hat OpenShift-Konsole oder die entsprechende CLI verwenden.
Werden Fehler angezeigt, wenn Sie Ihre App bereitstellen? Red Hat OpenShift hat andere Standardeinstellungen als Community-Kubernetes, z. B. strengere Sicherheitskontexteinschränkungen. Informieren Sie sich anhand der folgenden allgemeinen Szenarios, wo möglicherweise Änderungen an Ihren Apps erforderlich sind, damit sie in Red Hat OpenShift-Clustern bereitgestellt werden können.
Apps über Konsole bereitstellen
Sie können mit verschiedenen Methoden Apps in der Red Hat OpenShift-Konsole erstellen. Verwenden Sie hierzu die Perspektive Entwickler. Weitere Informationen finden Sie in der Dokumentation Red Hat OpenShift.
- Wählen Sie auf der Konsole Ihren Cluster aus.
- Klicken Sie auf Red Hat OpenShift-Webkonsole.
- Wählen Sie in der Perspektivenumschaltung die Option Entwickler aus. Die Red Hat OpenShift-Webkonsole wechselt in die Perspektive 'Entwickler' und das Menü enthält jetzt Elemente, wie +Hinzufügen, Topologie und Builds.
- Klicken Sie auf + Hinzufügen.
- Wählen Sie in der Menüleiste des Teilfensters Hinzufügen in der Dropdown-Liste das Projekt aus, in dem Sie die App erstellen wollen.
- Klicken Sie auf die Methode, die Sie verwenden möchten, um Ihre App hinzuzufügen, und befolgen Sie dann die Anweisungen. Klicken Sie zum Beispiel auf Von Git.
Apps über Befehlszeilenschnittstelle bereitstellen
Um eine App in Ihrem Red Hat OpenShift on IBM Cloud-Cluster zu erstellen, verwenden Sie den Befehl oc new-app. Sie können beispielsweise auf ein öffentliches GitHub- oder GitLab-Repository oder mit einer URL verweisen, die auf .git endet. Sie können aber auch auf ein
anderes lokales oder fernes Repository verweisen. Weitere Informationen finden Sie im Lernprogramm und in der Dokumentation Red Hat OpenShift.
oc new-app --name <app_name> https://github.com/<path_to_app_repo> [--context-dir=<subdirectory>]
- Was bewirkt der Befehl
new-app? - Der Befehl
new-appbewirkt, dass eine Buildkonfiguration und ein App-Image aus dem Quellcode, eine Bereitstellungskonfiguration zum Bereitstellen der Container in Pods Ihres Clusters sowie ein Service erstellt werden, mit dem die App im Cluster zugänglich gemacht wird. Weitere Informationen über den Erstellungsprozess und andere Quellen als Git finden Sie in der Dokumentation Red Hat OpenShift.
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
- Rufen Sie Ihren Red Hat OpenShift-Cluster auf.
- 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 oc 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 oc 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=.oc 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 ... -
Fügen Sie der App-Bereitstellung eine Affinitätsregel für das Label der Worker-Pool-ID hinzu.
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.
oc 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.
oc get pods -o wide ``` Beispielausgabe ```sh {: screen} NAME READY STATUS RESTARTS AGE IP NODE cf-py-d7b7d94db-vp8pq 1/1 Running 0 15d 172.30.xxx.xxx 10.176.48.78 ``` 2. 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-vp8pq` auf einem Workerknoten mit der IP-Adresse `10.xxx.xx.xxx`. 3. Listen Sie die Workerknoten im Worker-Pool auf, die Sie in Ihrer App-Bereitstellung angegeben haben. ```sh {: pre} ibmcloud oc worker ls --cluster CLUSTER_NAME_OR_ID --worker-pool WORKER_POOL_NAME_OR_ID ``` Beispielausgabe ```sh {: screen} 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_1504 ``` Wenn 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 oc worker get --cluster CLUSTER_NAME_OR_ID --worker WORKER_ID` ausführen. {: tip} 4. 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.
Bereitstellung einer App 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.
In den nachfolgenden Abschnitten erfahren Sie, wie Sie Workloads bereitstellen, für die die GPU erforderlich ist. Sie können jedoch auch Anwendungen bereitstellen, deren Workloads nicht sowohl auf der GPU als auch auf der CPU verarbeitet werden müssen.
Sie können auch mathematisch intensive Workloads wie das TensorFlow framework für maschinelles Lernen mit dieser Kubernetes Demo 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 wurde, die Ihnen die entsprechende RBAC-Rolle für Kubernetes erteilt, um mit Kubernetes-Ressourcen im Cluster arbeiten zu können.
Einschränkungen nur für private Cluster: Wenn Ihr Cluster keine öffentliche Netzkonnektivität hat, müssen Sie öffentliche Netzkonnektivität zulassen oder Images aus externen Registrys und Imagedatenströmen in icr.io spiegeln. Im folgenden Beispiel verwendet die GPU-App OLM Marketplace mit Bilddatenströmen. Dieses Beispiel funktioniert nicht, wenn Ihr Cluster nicht auf die NVIDIA-Registrierung ( nvcr.io ) zugreifen kann.
Sie müssen Version 1.3.1 oder höher des NVIDIA GPU-Operators verwenden. Wenn Sie den Node Feature Discovery-Operator installieren, wählen Sie den Aktualisierungskanal aus, der mit Ihrer Red Hat OpenShift-Clusterversion übereinstimmt. Installieren Sie die Operatoren nicht auf andere Weise, beispielsweise über ein Helm-Diagramm.
RHEL 9 Worker Nodes: Wenn Sie NVIDIA GPU-Treiber auf RHEL 9-Arbeitsknoten installieren, müssen Sie einen Workaround anwenden, um alle erforderlichen Extended Update Support (EUS)-Repositories zu aktivieren. Der NVIDIA GPU Operator aktiviert standardmäßig nicht alle erforderlichen EUS-Repositories, was dazu führt, dass die Treiberinstallation fehlschlägt. Weitere Informationen finden Sie unter Warum schlägt die Installation meines NVIDIA GPU-Treibers auf RHEL 9 Worker Nodes fehl?
Sollten bei der Installation des „ Node Feature Discovery Operator“ oder des „ NVIDIA GPU Operator“ Probleme auftreten, senden Sie bitte eine E-Mail an Wenden Sie sich an den Support unter NVIDIA, um Hilfe zu erhalten oder melden Sie ein Problem im NVIDIA GPU Operator-Repo
Workload implementieren
-
Erstellen Sie eine YAML-Datei. In diesem Beispiel verwaltet eine
JobYAML-Datei batchähnliche Workloads, indem sie einen kurzlebigen Pod erstellt, der so lange läuft, bis der Befehl abgeschlossen ist und erfolgreich beendet wird.Für GPU-Workloads müssen Sie das Feld
resources: limits: nvidia.com/gpuin der Job-YAML-Datei 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-Geräte-Plug-in passt die Standard-Ressourcenanforderung an das Limit an.
- Sie müssen den Schlüssel als
nvidia.com/gpu. - angeben Geben Sie die ganze Zahl der 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:
oc 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.oc 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.
oc describe pod nvidia-devicequery-ppkd4 ``` Beispielausgabe ```sh {: screen} 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 ... ``` - In den Feldern
-
Um sicherzustellen, dass der Job die GPU zum Berechnen der Workload verwendet hat, können Sie die entsprechenden Protokolle überprüfen.
oc 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-Workload bereitgestellt haben, möchten Sie vielleicht Ihren Cluster so einrichten, dass ein Tool ausgeführt werden kann, das auf GPU-Verarbeitung angewiesen ist, wie beispielsweise IBM Maximo Visual Inspection.
Bereitstellen einer Anwendung auf einem Intel AI Accelerator (Gaudi 3) Rechner
Diese Funktion steht nur für Konten auf der Whitelist zur Verfügung. Informationen zur Beantragung des Zugriffs finden Sie unter Beantragung des Zugriffs auf zulassungspflichtige Funktionen.
Führen Sie das folgende Beispiel aus, um das Container-Image von Intel Gaudi PyTorch bereitzustellen, das ein Gaudi-Gerät über das Feld resource.limits abruft. Bevor Sie beginnen, stellen Sie sicher, dass Ihr Cluster die folgenden
Anforderungen erfüllt.
- Versionen 4.18 und höher
- Nur VPC-Cluster
- Nur RHCOS-Arbeitsknoten
- Intel Gaudi Base Operator v1.20.1 und höher
Weitere Informationen und Beispiele finden Sie in den Habana-Dokumenten und im Schnellstart-Beispiel.
- Kopieren Sie die folgende Beispieljobkonfiguration und speichern Sie sie als Datei mit dem Namen
config.yamlapiVersion: batch/v1 kind: Job metadata: name: habanalabs-gaudi-demo spec: template: spec: hostIPC: true restartPolicy: OnFailure containers: - name: habana-ai-base-container image: vault.habana.ai/gaudi-docker/1.21.0/ubuntu22.04/habanalabs/pytorch-installer-2.6.0:latest workingDir: /root command: ["hl-smi"] securityContext: capabilities: add: ["SYS_NICE"] resources: limits: habana.ai/gaudi: 8 memory: 409Gi hugepages-2Mi: 9500Mi - Wenden Sie den Job in Ihrem Cluster an.
oc apply -f config.yaml - Warten Sie, bis die Pods gestartet sind, und überprüfen Sie dann, ob der Auftrag abgeschlossen ist.
Beispieloc get po -n defaultNAME READY STATUS RESTARTS AGE habanalabs-gaudi-demo-kmdcp 0/1 Completed 0 2m32s - Beschreiben Sie den Job-Pod für weitere Details.
oc describe po habanalabs-gaudi-demo-kmdcpName: habanalabs-gaudi-demo-kmdcp Namespace: default Priority: 0 Service Account: default Node: test-csrq76620trmo9r8j7u0-btsstagevpc-gaudi3s-00013059/10.180.0.83 Start Time: Tue, 27 May 2025 14:41:50 -0400 Labels: batch.kubernetes.io/controller-uid=c3b33c8a-5fef-4312-9d59-c8b13c03313a batch.kubernetes.io/job-name=habanalabs-gaudi-demo controller-uid=c3b33c8a-5fef-4312-9d59-c8b13c03313a job-name=habanalabs-gaudi-demo Annotations: cni.projectcalico.org/containerID: 7c883dfa9c681ee2c4128b1a5412d4dc181842d0de2a4b7b8019eefc06df37ca cni.projectcalico.org/podIP: cni.projectcalico.org/podIPs: Status: Succeeded IP: 172.17.151.97 IPs: IP: 172.17.151.97 Controlled By: Job/habanalabs-gaudi-demo Containers: habana-ai-base-container: Container ID: cri-o://d75288e9b467f3f820e05e770bbc3d9a2b11cbf8155a54a129fc083d5d507571 Image: vault.habana.ai/gaudi-docker/1.21.0/ubuntu22.04/habanalabs/pytorch-installer-2.6.0:latest Image ID: vault.habana.ai/gaudi-docker/1.21.0/ubuntu22.04/habanalabs/pytorch-installer-2.6.0@sha256:cd599626a8f4d1c3a7b354ccf4ef73e19196f09030d02261d4900bf3467a964c Port: <none> Host Port: <none> Command: hl-smi State: Terminated Reason: Completed Exit Code: 0 Started: Tue, 27 May 2025 14:41:53 -0400 Finished: Tue, 27 May 2025 14:41:54 -0400 Ready: False Restart Count: 0 Limits: habana.ai/gaudi: 8 hugepages-2Mi: 9500Mi memory: 409Gi Requests: habana.ai/gaudi: 8 hugepages-2Mi: 9500Mi memory: 409Gi Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-8vn42 (ro) Conditions: Type Status PodReadyToStartContainers False Initialized True Ready False ContainersReady False PodScheduled True Volumes: kube-api-access-8vn42: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: <nil> DownwardAPI: true ConfigMapName: openshift-service-ca.crt ConfigMapOptional: <nil> QoS Class: Burstable Node-Selectors: <none> Tolerations: node.kubernetes.io/memory-pressure:NoSchedule op=Exists node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 53s default-scheduler Successfully assigned default/habanalabs-gaudi-demo-kmdcp to test-csrq76620trmo9r8j7u0-btsstagevpc-gaudi3s-00013059 Normal AddedInterface 52s multus Add eth0 [172.17.151.97/32] from k8s-pod-network Normal Pulling 52s kubelet Pulling image "vault.habana.ai/gaudi-docker/1.21.0/ubuntu22.04/habanalabs/pytorch-installer-2.6.0:latest" Normal Pulled 50s kubelet Successfully pulled image "vault.habana.ai/gaudi-docker/1.21.0/ubuntu22.04/habanalabs/pytorch-installer-2.6.0:latest" in 2.146s (2.146s including waiting). Image size: 5188441181 bytes. Normal Created 50s kubelet Created container: habana-ai-base-container Normal Started 50s kubelet Started container habana-ai-base-container - Rufen Sie die Pod-Protokolle auf, um die Details des Gaudi-Geräts zu sehen.
Beispielausgabeoc logs habanalabs-gaudi-demo-kmdcp+-----------------------------------------------------------------------------+ | HL-SMI Version: hl-1.21.0-fw-59.2.1.0 | | Driver Version: 1.20.1-366eb9c | | Nic Driver Version: 1.20.1-213b09b | |-------------------------------+----------------------+----------------------+ | AIP Name Persistence-M| Bus-Id Disp.A | Volatile Uncor-Events| | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | AIP-Util Compute M. | |===============================+======================+======================| | 0 HL-325L N/A | 0000:e9:00.0 N/A | 0 | | N/A 36C P0 228W / 900W | 672MiB / 131072MiB | 0% 0% | |-------------------------------+----------------------+----------------------+ | 1 HL-325L N/A | 0000:c1:00.0 N/A | 0 | | N/A 37C P0 226W / 900W | 672MiB / 131072MiB | 0% 0% | |-------------------------------+----------------------+----------------------+ | 2 HL-325L N/A | 0000:b7:00.0 N/A | 0 | | N/A 36C P0 225W / 900W | 672MiB / 131072MiB | 0% 0% | |-------------------------------+----------------------+----------------------+ | 3 HL-325L N/A | 0000:ad:00.0 N/A | 0 | | N/A 40C P0 228W / 900W | 672MiB / 131072MiB | 0% 0% | |-------------------------------+----------------------+----------------------+ | 4 HL-325L N/A | 0000:a3:00.0 N/A | 0 | | N/A 36C P0 228W / 900W | 672MiB / 131072MiB | 0% 0% | |-------------------------------+----------------------+----------------------+ | 5 HL-325L N/A | 0000:df:00.0 N/A | 0 | | N/A 39C P0 229W / 900W | 672MiB / 131072MiB | 0% 0% | |-------------------------------+----------------------+----------------------+ | 6 HL-325L N/A | 0000:d5:00.0 N/A | 0 | | N/A 36C P0 231W / 900W | 672MiB / 131072MiB | 0% 0% | |-------------------------------+----------------------+----------------------+ | 7 HL-325L N/A | 0000:cb:00.0 N/A | 0 | | N/A 38C P0 227W / 900W | 672MiB / 131072MiB | 0% 0% | |-------------------------------+----------------------+----------------------+ | Compute Processes: AIP Memory | | AIP PID Type Process name Usage | |=============================================================================| | 0 N/A N/A N/A N/A | | 1 N/A N/A N/A N/A | | 2 N/A N/A N/A N/A | | 3 N/A N/A N/A N/A | | 4 N/A N/A N/A N/A | | 5 N/A N/A N/A N/A | | 6 N/A N/A N/A N/A | | 7 N/A N/A N/A N/A | +=============================================================================+
Bereitstellen einer Anwendung auf einem AMD MI300x Rechner
Red Hat CoreOS 4.18 und später VPC
-
Um die erforderlichen Operatoren zu installieren, müssen Sie ausgehenden Datenverkehr zu Red Hat Marketplace und OperatorHub zulassen.
-
Installieren Sie die folgenden Operatoren in Ihrem Cluster:
-
Nach der Installation der Operatoren folgen Sie der AMD-Dokumentation zur Konfiguration der Treiber. Hinweis: Das Entfernen des Kernelmoduls
amdgpuaus der Erlaubnisliste ist nicht erforderlich.
Weitere Informationen und Beispiele finden Sie in den AMD-Dokumenten und im Schnellstart-Beispiel.
- Kopieren Sie die folgende Beispiel-Pod-Konfiguration und speichern Sie sie in einer Datei mit dem Namen
config.yamlapiVersion: v1 kind: Pod metadata: name: amd-smi spec: containers: - image: docker.io/rocm/rocm-terminal:latest name: amd-smi command: ["/bin/bash"] args: ["-c","amd-smi version && amd-smi monitor -ptum"] resources: limits: amd.com/gpu: 8 requests: amd.com/gpu: 8 restartPolicy: Never - Wenden Sie den Pod in Ihrem Cluster an.
oc apply -f config.yaml - Warten Sie, bis die Pods gestartet sind, und überprüfen Sie dann, ob der Auftrag abgeschlossen ist.
Beispieloc get po -n defaultNAME READY STATUS RESTARTS AGE amd-smi 0/1 Completed 0 19m - Beschreiben Sie den Job-Pod für weitere Details.
oc describe po amd-smiName: amd-smi Namespace: default Priority: 0 Node: test-d18ofps20v1lr6in6ta0-btsstagevpc-gx3d208-00001687/10.240.1.4 Start Time: Mon, 07 Jul 2025 13:32:18 -0500 Labels: <none> Annotations: cni.projectcalico.org/containerID: 5b5d39f8ebe5ea14250af02031084961285f8b210eea14d2c22704784d957de3 cni.projectcalico.org/podIP: cni.projectcalico.org/podIPs: Status: Succeeded IP: 172.17.55.73 IPs: IP: 172.17.55.73 Containers: amd-smi: Container ID: cri-o://3260f5a2788cc189adbe53d3d49c1bdccc7001df27f0c747d6fa86a3068c9eda Image: docker.io/rocm/rocm-terminal:latest Image ID: docker.io/rocm/rocm-terminal@sha256:72b323c5d56c511ea75f7353d0fee04e637390dd4874d414020284627a658014 Port: <none> Host Port: <none> Command: /bin/bash Args: -c amd-smi version && amd-smi monitor -ptum State: Terminated Reason: Completed Exit Code: 0 Started: Mon, 07 Jul 2025 13:32:20 -0500 Finished: Mon, 07 Jul 2025 13:32:20 -0500 Ready: False Restart Count: 0 Limits: amd.com/gpu: 8 Requests: amd.com/gpu: 8 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-tshnq (ro) Conditions: Type Status PodReadyToStartContainers False Initialized True Ready False ContainersReady False PodScheduled True Volumes: kube-api-access-tshnq: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: <nil> DownwardAPI: true ConfigMapName: openshift-service-ca.crt ConfigMapOptional: <nil> QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 19m default-scheduler Successfully assigned default/amd-smi to test-d18ofps20v1lr6in6ta0-btsstagevpc-gx3d208-00001687 Normal AddedInterface 19m multus Add eth0 [172.17.55.73/32] from k8s-pod-network Normal Pulling 19m kubelet Pulling image "docker.io/rocm/rocm-terminal:latest" Normal Pulled 19m kubelet Successfully pulled image "docker.io/rocm/rocm-terminal:latest" in 782ms (782ms including waiting). Image size: 3016399213 bytes. Normal Created 19m kubelet Created container: amd-smi Normal Started 19m kubelet Started container amd-smi - Holen Sie sich die Pod-Protokolle, um die Details der AMD-GPU zu sehen.
Beispielausgabeoc logs amd-smiAMDSMI Tool: 25.3.0+ede62f2 | AMDSMI Library version: 25.3.0 | ROCm version: 6.4.0 | amdgpu version: 6.10.5 | amd_hsmp version: N/A WARNING: User is missing the following required groups: render. Please add user to these groups. GPU POWER GPU_T MEM_T GFX_CLK GFX% MEM% MEM_CLOCK 0 141 W 40 °C 36 °C 140 MHz 0 % 0 % 900 MHz 1 144 W 42 °C 33 °C 138 MHz 0 % 0 % 900 MHz 2 140 W 38 °C 34 °C 142 MHz 0 % 0 % 900 MHz 3 142 W 39 °C 34 °C 140 MHz 0 % 0 % 900 MHz 4 140 W 38 °C 35 °C 138 MHz 0 % 0 % 900 MHz 5 142 W 36 °C 30 °C 138 MHz 0 % 0 % 900 MHz 6 137 W 40 °C 35 °C 138 MHz 0 % 0 % 900 MHz 7 137 W 38 °C 32 °C 142 MHz 0 % 0 % 900 MHz