在 Red Hat OpenShift 叢集中部署應用程式

使用 Red Hat® OpenShift® on IBM Cloud® 叢集,可以使用單一指令從遠端檔案或儲存庫(如 GitHub)部署應用程式。 此外,叢集隨附可用來協助操作叢集的各種內建服務。

將您的應用程式移至 Red Hat OpenShift

若要在 Red Hat OpenShift on IBM Cloud 群集中建立應用程式,您可以使用 Red Hat OpenShift 主控台或 CLI。

在部署應用程式時看到錯誤?Red Hat OpenShift 的預設設定與社群 Kubernetes 不同,例如更嚴格的安全上下文限制。 請詳閱《 您可能需要修改應用程式的常見情境 》,以便您能將其部署至 Red Hat OpenShift 叢集上。

透過主控台部署應用程式

您可以使用開發人員視角,透過 Red Hat OpenShift 主控台中的各種方法建立應用程式。 如需詳細資訊,請參閱 Red Hat OpenShift 文件

  1. 主控台,選擇您的群集。
  2. 按一下 Red Hat OpenShift Web 主控台
  3. 從視景切換器中,選取 開發人員。 Red Hat OpenShift Web 主控台會切換至「開發人員」視景,且功能表現在提供 + 新增拓蹼建置等項目。
  4. 點擊「+新增」。
  5. 新增 窗格功能表列中,從下拉清單中選取您要在其中建立應用程式的 專案
  6. 按一下您要用來新增應用程式的方法,然後遵循指示。 例如,按一下 從 Git

透過 CLI 部署應用程式

若要在 Red Hat OpenShift on IBM Cloud 群集中建立應用程式,請使用 oc new-app 指令。 舉例來說,您可能會引用一個公開的 GitHub repo、一個以 .git 結尾的 URL 的公開 GitLab repo,或是其他本機或遠端 repo。 如需更多資訊,請 試用教學 並檢閱 Red Hat OpenShift 文件

oc new-app --name <app_name> https://github.com/<path_to_app_repo> [--context-dir=<subdirectory>]
new-app 指令的作用是什麼?
new-app 指令從原始碼建立建置配置和應用程式映像檔,建立用於將容器部署到叢集裡 Pod 的部署配置,以及建立用於公開叢集裡應用程式的服務。 如需建置程序及 Git以外其他來源的相關資訊,請參閱 Red Hat OpenShift 文件

使用標籤將應用程式部署至特定工作者節點

當您部署應用程式時,應用程式 Pod 會任意地部署至叢集裡的各種工作者節點。 有時,您可能希望限制應用程式 Pod 部署到的工作節點。 例如,您可能希望應用程式 Pod 僅部署到特定工作者節點儲存區中的工作者節點,因為這些工作者節點位於裸機機器上。 若要指定應用程式 Pod 必須部署至其中的工作者節點,請將親緣性規則新增至應用程式部署。

開始之前

若要將應用程式部署至特定的工作節點,

  1. 取得您要將應用程式 Pod 部署至其中的工作者節點儲存區的 ID。

    ibmcloud oc worker-pool ls --cluster CLUSTER_NAME_OR_ID
    
  2. 列出工作者節點儲存區中的工作者節點,並記下其中一個專用 IP 位址。

    ibmcloud oc worker ls --cluster CLUSTER_NAME_OR_ID --worker-pool WORKER_POOL_NAME_OR_ID
    
  3. 說明工作者節點。 在標籤輸出中,請注意工作者節點儲存區 ID 標籤 ibm-cloud.kubernetes.io/worker-pool-id

    本主題中的步驟使用工作者節點儲存區 ID,僅將應用程式 Pod 部署至該工作者節點儲存區內的工作者節點。 若要使用不同的標籤將應用程式 Pod 部署至特定工作者節點,則就要注意此標籤。 例如,若只要將應用程式 Pod 部署至特定專用 VLAN 上的工作者節點,請使用 privateVLAN= 標籤。

    oc describe node <worker_node_private_IP>
    

    輸出範例

    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
    ...
    
  4. 在應用程式部署中,針對工作執行池 ID 標籤 新增一則親和性規則

    範例 YAML

    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>
    ...
    

    在範例 YAML 的「親和性」區段中,ibm-cloud.kubernetes.io/worker-pool-id 代表 key,而 <worker_pool_ID> 則代表 value

  5. 套用已更新的部署配置檔。

    oc apply -f with-node-affinity.yaml
    
  6. 驗證應用程式 Pod 已部署至正確的工作者節點。

    1. 列出叢集裡的 Pod。
        oc get pods -o wide
        ```
        輸出範例
        ```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. 在輸出中,識別應用程式的 Pod。 記下 Pod 所在工作者節點的 **NODE** 專用 IP 位址。
    
        在前一個範例輸出中,應用程式 Pod `cf-py-d7b7d94db-vp8pq` 位於具有 IP 位址 `10.xxx.xx.xxx` 的工作者節點上。
    
    3. 列出您在應用程式部署內所指定工作者節點儲存區中的工作者節點。
    
    ```sh {: pre}
        ibmcloud oc worker ls --cluster CLUSTER_NAME_OR_ID --worker-pool WORKER_POOL_NAME_OR_ID
        ```
        輸出範例
    
        ```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
        ```
        如果您已根據另一個因素建立應用程式親緣性規則,請改為取得該值。 例如,若要驗證應用程式 Pod 是否已部署至特定 VLAN 上的工作節點,請執行 `ibmcloud oc worker get --cluster CLUSTER_NAME_OR_ID --worker WORKER_ID`,以查看該工作節點所處的 VLAN。
        {: tip}
    
    4. 在輸出中,驗證具有您在前一個步驟中所識別之專用 IP 位址的工作者節點已部署在此工作者節點儲存區。
    
    

在 NVIDIA GPU 伺服器上部署應用程式

如果您具有 GPU 機型,則可以加快運算密集工作負載 (例如 AI、機器學習、推理等) 所需的處理時間。

在下列步驟中,您將學習如何部署需要 GPU 的工作負載。 不過,您也可以部署無需在 GPU 和 CPU 之間處理工作負載的應用程式。

您也可以使用 此 Kubernetes 演示 嘗試數學密集型工作負載,例如 TensorFlow 機器學習框架。

必要條件

開始之前

  • 建立使用 GPU 特性的 叢集 或工作者節點儲存區。 請記住,設定裸機機器可能需要多個營業日才能完成。 如需可用特性的清單,請參閱下列鏈結。

  • 請確認您已被指派一個 服務存取角色, 該角色會授予相應的「Kubernetes」RBAC 角色,以便您能夠在叢集中管理 Kubernetes 資源。

僅限專用叢集限制: 如果您的叢集沒有公用網路連線功能,則必須容許公用網路連線功能或將映像檔從外部登錄及映像檔串流鏡映至 icr.io。 在下列範例中,GPU 應用程式使用 OLM Marketplace 搭配映像檔串流。 如果您的群集無法存取 NVIDIA 註冊表 ( nvcr.io ),則本範例就無法運作。

您必須使用 NVIDIA GPU 操作員版本 1.3.1 或更新版本。 當您安裝 Node Feature Discovery 操作員時,請選擇與您的 Red Hat OpenShift 集群版本相符的更新通道。 不要透過其他方法安裝操作員,例如 Helm 圖表。

RHEL 9 工作站節點:如果您要在 RHEL 9 工作節點上安裝 NVIDIA GPU 驅動程式,您必須套用變通方案來啟用所有必要的 Extended Update Support (EUS) 套件庫。 NVIDIA GPU Operator 預設無法啟用所有必要的 EUS 儲存庫,這會導致驅動程式安裝失敗。 如需詳細資訊,請參閱 為何我的 NVIDIA GPU 驅動程式在 RHEL 9 工作節點上安裝失敗?

若您在安裝「Node」功能探索操作員或「NVIDIA」GPU 操作員時遇到問題,請聯絡 NVIDIA 技術支援以獲取協助,或在「NVIDIA」GPU 操作員儲存庫中提交問題。

部署工作量

  1. 建立 YAML 檔案。 在此範例中,Job 的 YAML 檔案透過建立一個短暫存在的 Pod 來管理類似批次的工作負載,該 Pod 會持續執行直至指令完成並成功終止。

    對於 GPU 工作負載,您必須在工作 YAML 檔案中指定 resources: limits: nvidia.com/gpu 欄位。

    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: Never
    
    了解您的 YAML 組件
    元件 說明
    meta 資料及標籤名稱 請輸入工作名稱與標籤,並在檔案的元資料以及「spec template」的元資料中使用相同的名稱。 例如,nvidia-devicequery
    containers.image 提供容器是其執行中實例的映像檔。 在此範例中,該值設為使用 DockerHub CUDA 裝置查詢映像檔:nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda11.7.1-ubuntu20.04
    containers.imagePullPolicy 若要僅在工作節點上尚未存在該映像時才拉取新映像,請指定 IfNotPresent``。
    resources.limits

    對於 GPU 機器,您必須指定資源限制。 Kubernetes 裝置外掛程式會將預設資源請求設定為符合該限制。

    • 您必須將金鑰指定為 nvidia.com/gpu
    • 輸入您要求的 GPU 總數,例如 2。 請注意,容器 Pod 不共用 GPU,且 GPU 不能過度確定。 例如,如果您只有 1 部 mg1c.16x128 機器,則在該機器中您只有 2 個 GPU,且最多可以指定 2
  2. 套用 YAML 檔案。 例如:

    oc apply -f nvidia-devicequery.yaml
    
  3. 請透過篩選具有「nvidia-devicequery」標籤的 Pod,來檢查該工作 Pod。 驗證 STATUSCompleted

    oc get pod -A -l 'name in (nvidia-devicequery)'
    

    輸出範例

    NAME                  READY     STATUS      RESTARTS   AGE
    nvidia-devicequery-ppkd4      0/1       Completed   0          36s
    
  4. 說明 Pod,以查看 GPU 裝置外掛程式如何排定 Pod。

    • LimitsRequests 欄位中,查看您所指定的資源限制符合裝置外掛程式自動設定的要求。
    • 在事件中,驗證已將 Pod 指派給 GPU 工作者節點。
        oc describe pod nvidia-devicequery-ppkd4
        ```
        輸出範例
        ```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
        ...
        ```
    
  5. 若要驗證工作已使用 GPU 來運算其工作負載,您可以檢查日誌。

    oc logs nvidia-devicequery-ppkd4
    

    輸出範例

    /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 = PASS
    

    在此範例中,您看到使用 GPU 來執行工作,因為 GPU 已在工作者節點中排程。 如果限制設為 2,則只會顯示 2 個 GPU。

現在您已部署測試 GPU 工作負載,您可能想要設定叢集以執行依賴於 GPU 處理的工具,例如 IBM Maximo Visual Inspection

在 Intel AI Accelerator (Gaudi 3) 機器上部署應用程式

此功能僅限白名單帳戶使用。 若要申請存取權限,請參閱 申請存取允許清單上的功能

完成下列範例,以部署 Intel Gaudi 的 PyTorch 容器影像,該影像可使用 resource.limits 欄位擷取 Gaudi 裝置。 開始之前,請確認您的叢集符合以下要求。

如需更多資訊和範例,請參閱 Habana 文件快速入門範例

  1. 複製以下工作組態範例,並將其儲存為一個名為 config.yaml
    apiVersion: 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
    
  2. 在您的叢集中執行此工作。
    oc apply -f config.yaml
    
  3. 等待 Pod 啟動,然後驗證工作是否完成。
    oc get po -n default
    
    範例
    NAME                          READY   STATUS      RESTARTS   AGE
    habanalabs-gaudi-demo-kmdcp   0/1     Completed   0          2m32s
    
  4. 描述工作吊艙以獲得更多詳細資訊。
    oc describe po habanalabs-gaudi-demo-kmdcp
    
    Name:             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
    
  5. 取得 pod 記錄,查看 Gaudi 裝置的詳細資訊。
    oc 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        |
    +=============================================================================+
    

在 AMD MI300x 機器上部署應用程式

Red Hat CoreOS 4.18 以及之後的 VPC

如需更多資訊和範例,請參閱 AMD 文件快速入門範例

  1. 複製下列 Pod 設定範例,並將其儲存為一個名為 config.yaml
    apiVersion: 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
    
  2. 在您的叢集中部署該 Pod。
    oc apply -f config.yaml
    
  3. 等待 Pod 啟動,然後驗證工作是否完成。
    oc get po -n default
    
    範例
    NAME       READY   STATUS      RESTARTS   AGE
    amd-smi    0/1     Completed   0          19m
    
  4. 描述工作吊艙以獲得更多詳細資訊。
    oc describe po amd-smi
    
    Name:         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
    
  5. 取得 pod 日誌以查看 AMD GPU 詳細資訊。
    oc logs amd-smi
    
    輸出範例
    AMDSMI 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