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 웹 콘솔을 클릭하십시오.
  3. 퍼스펙티브 전환기에서 개발자를 선택하십시오. Red Hat OpenShift 웹 콘솔은 개발자 퍼스펙티브로 전환하고 메뉴는 이제 +추가, 토폴로지빌드와 같은 항목을 제공합니다.
  4. +추가를 클릭하십시오.
  5. 추가 분할창 메뉴 표시줄의 드롭 다운 목록에서 앱을 작성할 프로젝트를 선택하십시오.
  6. 앱을 추가하는 데 사용할 메소드를 클릭하고 지시사항을 따르십시오. 예를 들어, Git에서를 클릭하십시오.

CLI를 통해 앱 배치

Red Hat OpenShift on IBM Cloud 클러스터에서 앱을 만들려면 oc new-app 명령을 사용합니다. 예를 들면 공용 GitHub 저장소, URL이 .git으로 끝나는 공용 GitLab 저장소, 또는 다른 로컬 저장소나 원격 저장소를 참조할 수 있습니다. 자세한 내용은 튜토리얼을 사용해 보고 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)을 배치하려면 대신 이 레이블을 기록해 두십시오. 예를 들어, 특정 사설 VLAN에만 앱 팟(Pod)을 배치하려면 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의 affinity 섹션에서 ibm-cloud.kubernetes.io/worker-pool-idkey이고 <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 모두에서 워크로드를 처리할 필요가 없는 앱도 배포할 수 있습니다.

또한 다음과 같이 수학적으로 집약적인 워크로드도 TensorFlow 머신 러닝 프레임워크와 같은 수학적 집약적인 워크로드를 사용해 볼 수도 있습니다( Kubernetes 데모 ).

전제조건

시작하기 전에

  • GPU 특성을 사용하는 클러스터 또는 작업자 풀을 작성하십시오. 베어메탈 머신의 설정을 완료하는 데는 1일 이상의 영업일이 소요될 수 있다는 점에 유의하십시오. 사용 가능한 특징 목록은 다음 링크를 참조하십시오.

  • 클러스터에 있는 Kubernetes 리소스에 대해 작업할 수 있도록 적절한 Kubernetes RBAC 역할을 부여하는 서비스 액세스 역할이 지정되어 있는지 확인하십시오.

사설 전용 클러스터 제한사항: 클러스터에 공용 네트워크 연결이 없는 경우 공용 네트워크 연결을 허용하거나 외부 레지스트리 및 이미지 스트림에서 icr.io 로 이미지를 미러링해야 합니다. 다음 예제에서 GPU앱은 이미지 스트림과 함께 OLM 마켓플레이스를 사용합니다. 이 예제는 클러스터가 NVIDIA 레지스트리( nvcr.io )에 액세스할 수 없는 경우 작동하지 않습니다.

NVIDIA GPU 오퍼레이터 버전 1.3.1 이상을 사용해야 합니다. Node Feature Discovery 오퍼레이터를 설치할 때는 자신의 Red Hat OpenShift 클러스터 버전과 일치하는 업데이트 채널을 선택하십시오. Helm 차트와 같은 다른 방법을 통해 연산자를 설치하지 마십시오.

RHEL 9 워커 노드: RHEL 9 작업자 노드에 NVIDIA GPU 드라이버를 설치하는 경우, 해결 방법을 적용하여 필요한 모든 EUS(확장 업데이트 지원) 리포지토리를 사용하도록 설정해야 합니다. NVIDIA GPU 오퍼레이터는 기본적으로 필요한 모든 EUS 리포지토리를 활성화하지 않아 드라이버 설치에 실패할 수 있습니다. 자세한 내용은 RHEL 9 워커 노드에서 NVIDIA GPU 드라이버 설치가 실패하는 이유를 참조하세요.

Node Feature Discovery Operator 또는 NVIDIA GPU Operator를 설치하는 데 문제가 발생하면, 도움이 필요하시면 NVIDIA 고객지원팀에 문의해 주세요 으로 문의하거나 NVIDIA GPU Operator 저장소

워크로드 배치

  1. YAML 파일을 작성하십시오. 이 예제에서는 Job YAML이 명령어가 완료되고 정상적으로 종료될 때까지 실행되는 단기 포드를 생성하여 배치형 워크로드를 관리합니다.

    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 컴포넌트 이해하기
    컴포넌트 설명
    메타데이터 및 레이블 이름 작업의 이름과 레이블을 입력하고 파일의 메타데이터와 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 레이블을 기준으로 포드를 필터링하여 작업 포드를 확인하세요. STATUSCompleted인지 확인하십시오.

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

    출력 예

    NAME                  READY     STATUS      RESTARTS   AGE
    nvidia-devicequery-ppkd4      0/1       Completed   0          36s
    
  4. GPU 디바이스 플러그인이 팟(Pod)을 스케줄한 방법을 알 수 있도록 팟(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.

인텔 AI 가속기(Gaudi 3) 머신에 앱 배포하기

이 기능은 허용 목록에 등록된 계정에서만 이용할 수 있습니다. 액세스 권한을 요청하려면 허용 목록에 있는 기능에 대한 액세스 요청하기를 참조하세요.

다음 예제를 완료하여 resource.limits 필드를 사용하여 가우디 디바이스를 검색하는 인텔 가우디의 PyTorch 컨테이너 이미지를 배포합니다. 시작하기 전에 클러스터가 다음 요구 사항을 충족하는지 확인하십시오.

  • 4.18 버전 및 이후 버전
  • VPC 클러스터만 해당
  • RHCOS 워커 노드만 해당
  • 인텔 가우디 베이스 운영자 v1.20.1 이상

자세한 정보와 예제는 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. 파드가 시작될 때까지 기다린 다음 작업이 완료되었는지 확인합니다.
    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. 포드 로그를 가져와서 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. 다음 예제 파드 구성을 복사하여 다음과 같은 파일로 저장합니다 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. 클러스터에 해당 포드를 적용하십시오.
    oc apply -f config.yaml
    
  3. 파드가 시작될 때까지 기다린 다음 작업이 완료되었는지 확인합니다.
    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. 포드 로그를 가져와서 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