클러스터에 Kubernetes 기반 앱 배치
IBM Cloud® Kubernetes Service에서 Kubernetes 기술을 사용하여 컨테이너에 앱을 배치하고 해당 앱이 작동되어 실행 중인지 확인할 수 있습니다. 예를 들어, 사용자를 위해 작동 중단 시간 없이 롤링 업데이트 및 롤백을 수행할 수 있습니다.
애플리케이션의 구성 파일을 만드는 방법에 대한 자세한 내용은 구성 모범 사례를 참조하세요.
Kubernetes 대시보드 실행
로컬 시스템의 Kubernetes 대시보드를 열어서 클러스터 및 해당 작업자 노드에 대한 정보를 봅니다. IBM Cloud 콘솔에서 단추를 한 번만 클릭하여 대시보드에 액세스할 수 있습니다. CLI를 사용하여 대시보드에 액세스하거나 CI/CD 파이프라인의 경우와 같은 자동화 프로세스의 단계를 사용할 수 있습니다.
클러스터에 너무 많은 리소스와 사용자가 있어서 Kubernetes 대시보드가 조금 느립니까? 클러스터 관리자는 kubernetes-dashboard
을 실행하여 kubectl -n kube-system scale deploy kubernetes-dashboard --replicas=3
배치를 스케일링할 수 있습니다.
개별 앱 팟에 대한 로그를 확인하려면 kubectl logs <pod name>
을(를) 실행할 수 있습니다. Kubernetes 대시보드에 대한 액세스가 중단될 수 있으므로 Kubernetes 대시보드를 사용하여 팟(Pod)에 대한 로그를 스트리밍하지 마십시오.
시작하기 전에
- Kubernetes 리소스 관련 작업을 수행할 수 있도록 적절한 Kubernetes RBAC 역할을 부여하는 서비스 액세스 역할이 지정되어 있는지 확인하십시오.
- 콘솔에서 Kubernetes 대시보드를 시작하려면 플랫폼 액세스 역할이 지정되어 있어야 합니다. 서비스 액세스 역할만 지정되고 플랫폼 액세스 역할은 지정되어 있지 않은 경우 CLI에서 Kubernetes 대시보드를 시작하십시오.
- 계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.
기본 포트를 사용하거나 자체 포트를 설정하여 클러스터에 대한 Kubernetes 대시보드를 실행할 수 있습니다.
IBM Cloud 콘솔에서 Kubernetes 대시보드 실행
- IBM Cloud 콘솔에 로그인하십시오.
- 메뉴 표시줄에서 사용할 계정을 선택하십시오.
- 메뉴에서
클릭하고, 컨테이너 > 클러스터를 클릭합니다.
- 클러스터 페이지에서 액세스하려는 클러스터를 클릭하십시오.
- 클러스터 세부사항 페이지에서 Kubernetes 대시보드 단추를 클릭하십시오.
CLI에서 Kubernetes 대시보드 실행
시작하기 전에 CLI를 설치하십시오.
-
Kubernetes 인증 정보를 가져오십시오.
kubectl config view -o jsonpath='{.users[0].user.auth-provider.config.id-token}'
-
출력에 표시되는 id-token 값을 복사하십시오.
-
기본 포트 번호로 프록시를 설정하십시오.
kubectl proxy
출력 예
Starting to serve on 127.0.0.1:8001
-
대시보드에 로그인하십시오.
-
브라우저에서 다음 URL로 이동하십시오.
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
-
사인온 페이지에서 토큰 인증 방법을 선택하십시오.
-
그런 다음 이전에 복사한 id-token 값을 토큰 필드에 붙여넣고 로그인을 클릭하십시오.
-
Kubernetes 대시보드에서 작업이 완료되면 CTRL+C
를 사용하여 proxy
명령을 종료하십시오. 종료한 후에는 Kubernetes 대시보드를 더 이상 사용할 수 없습니다. proxy
명령을 실행하여 Kubernetes 대시보드를 다시 시작하십시오.
그런 다음 대시보드에서 구성 파일을 실행할 수 있습니다.
Kubernetes 대시보드를 사용하여 앱 배치
Kubernetes 대시보드를 사용하여 클러스터에 앱을 배치하는 경우, 배치 리소스가 자동으로 클러스터에서 팟(Pod)을 작성하고 업데이트 및 관리합니다. 대시보드 사용에 대한 자세한 내용은 Kubernetes 문서를 참조하세요.
클러스터에 너무 많은 리소스와 사용자가 있어서 Kubernetes 대시보드가 조금 느립니까? 클러스터 관리자는 kubernetes-dashboard
을 실행하여 kubectl -n kube-system scale deploy kubernetes-dashboard --replicas=3
배치를 스케일링할 수 있습니다.
시작하기 전에
- 필수 CLI를 설치하십시오.
- 계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.
- Kubernetes 리소스 관련 작업을 수행할 수 있도록 적절한 Kubernetes RBAC 역할을 부여하는 서비스 액세스 역할이 지정되어 있는지 확인하십시오.
- 콘솔에서 Kubernetes 대시보드를 시작하려면 플랫폼 액세스 역할이 지정되어 있어야 합니다. 서비스 액세스 역할만 지정되고 플랫폼 액세스 역할은 지정되어 있지 않은 경우 CLI에서 Kubernetes 대시보드를 시작하십시오.
앱을 배치하려는 경우
-
Kubernetes 대시보드를 열고 + 작성을 클릭하십시오.
-
다음 두 방법 중 하나로 앱 세부사항을 입력하십시오.
- 앱 세부 정보 지정을 선택하고 세부 정보를 입력합니다.
- 앱 구성 파일을 업로드하려면 YAML 또는 JSON 파일 업로드를 선택합니다.
구성 파일에 대해 도움이 필요하십니까? 이 YAML 파일 예를 확인하십시오. 이 예에서는 미국 남부 지역의 ibmliberty 이미지로부터 컨테이너가 배치됩니다. Kubernetes 리소스에 대해 작업할 때 개인 정보 보호에 대해 자세히 알아보십시오.
-
다음 방법 중 하나를 사용하여 앱이 배치되었는지 확인하십시오.
- Kubernetes 대시보드에서 배치를 클릭하십시오. 성공한 배치의 목록이 표시됩니다.
- 앱이 공용으로 사용 가능한 경우에는 IBM Cloud® Kubernetes Service 대시보드의 클러스터 개요 페이지로 이동하십시오. 클러스터 요약 섹션에 있는 하위 도메인을 복사한 후 브라우저에 붙여넣어 앱을 보십시오.
CLI로 앱 배치
클러스터가 작성된 후에 Kubernetes CLI를 사용하여 해당 클러스터에 앱을 배치할 수 있습니다.
시작하기 전에
- 필수 CLI를 설치하십시오.
- 계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.
- 네임스페이스에서 Kubernetes 리소스 관련 작업을 수행할 수 있도록 적절한 Kubernetes RBAC 역할을 부여하는 서비스 액세스 역할이 지정되어 있는지 확인하십시오.
앱을 배치하려는 경우
-
Kubernetes 모범 사례에 따라 구성 파일을 만듭니다. 일반적으로, 구성 파일에는 Kubernetes에서 작성 중인 각각의 리소스에 대한 구성 세부사항이 포함되어 있습니다. 스크립트에는 하나 이상의 다음 섹션이 포함될 수 있습니다.
-
배포: 배포: 파드 및 레플리카 세트 생성을 정의합니다. 팟(Pod)에는 개별 컨테이너화된 앱이 포함되며, 복제본 세트는 팟(Pod)의 다중 인스턴스를 제어합니다.
-
서비스: 워커 노드 또는 로드 밸런서 공용 IP 주소 또는 공용 인그레스 경로를 사용하여 파드에 대한 프런트엔드 액세스를 제공합니다.
-
인그레스: 앱에 공개적으로 액세스할 수 있는 경로를 제공하는 로드 밸런서 유형을 지정합니다.
Kubernetes 리소스에 대해 작업할 때 개인 정보 보호에 대해 자세히 알아보십시오.
-
-
클러스터의 컨텍스트에서 구성 파일을 실행하십시오.
kubectl apply -f config.yaml
-
노드 포트 서비스, 로드 밸런서 서비스 또는 Ingress를 사용하여 앱을 공용으로 사용 가능하게 한 경우 앱에 액세스할 수 있는지 확인하십시오.
레이블을 사용하여 특정 작업자 노드에 앱 배치
앱을 배치할 때 앱 팟(Pod)은 클러스터의 여러 작업자 노드에 무작위로 배치됩니다. 일부 경우에는 사용자가 앱 팟(Pod)이 배치되는 작업자 노드를 제한하려고 할 수 있습니다. 예를 들면, 특정 작업자 풀의 작업자 노드는 베어메탈 머신에 있으므로 이러한 작업자 노드에만 앱 팟(Pod)을 배치하려 할 수 있습니다. 앱 팟(Pod)이 배치되어야 하는 작업자 노드를 지정하려면 앱 배치에 친화성 규칙을 추가하십시오.
시작하기 전에
- 계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.
- 선택사항: 앱을 실행할 작업자 풀의 레이블을 설정하십시오.
특정 작업자 노드에 앱을 배치하려면 다음을 수행하십시오.
-
앱 팟(Pod)이 배치될 작업자 풀의 ID를 가져오십시오.
ibmcloud ks worker-pool ls --cluster <cluster_name_or_ID>
-
작업자 풀에 있는 작업자 노드를 나열하고 사설 IP 주소 중 하나를 기록하십시오.
ibmcloud ks worker ls --cluster <cluster_name_or_ID> --worker-pool <worker_pool_name_or_ID>
-
작업자 노드에 대해 설명하십시오. 레이블 출력에서 작업자 풀 ID 레이블(
ibm-cloud.kubernetes.io/worker-pool-id
)을 기록해 두십시오.이 주제의 단계는 작업자 풀 ID를 사용하여 해당 작업자 풀 내의 작업자 노드에만 앱 팟(Pod)을 배치합니다. 다른 레이블을 사용하여 특정 작업자 노드에 앱 팟(Pod)을 배치하려면 대신 이 레이블을 기록해 두십시오. 예를 들어, 특정 사설 VLAN에만 앱 팟(Pod)을 배치하려면
privateVLAN=
레이블을 사용하십시오.kubectl 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.32_1534 kubernetes.io/hostname=10.xxx.xx.xxx privateVLAN=1234567 publicVLAN=7654321 Annotations: node.alpha.kubernetes.io/ttl=0 ...
-
앱 배포에 작업자 풀 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-id
는key
이고<worker_pool_ID>
는value
입니다. -
업데이트된 배치 구성 파일을 적용하십시오.
kubectl apply -f with-node-affinity.yaml
-
앱 팟(Pod)이 올바른 작업자 노드에 배치되었는지 확인하십시오.
-
클러스터 내의 팟(Pod)을 나열하십시오.
kubectl get pods -o wide
출력 예
NAME READY STATUS RESTARTS AGE IP NODE cf-py-d7b7d94db-vp8pq 1/1 Running 0 15d 172.30.xxx.xxx 10.176.48.78
-
출력에서 앱의 팟(Pod)을 식별하십시오. 해당 팟(Pod)이 있는 작업자 노드의 NODE 사설 IP 주소를 기록해 두십시오.
이전 예제 출력에서 앱 팟(Pod)
cf-py-d7b7d94db-vp8pq
는 IP 주소10.xxx.xx.xxx
의 작업자 노드에 있습니다. -
앱 배치에서 지정한 작업자 풀의 작업자 노드를 나열하십시오.
ibmcloud ks worker ls --cluster <cluster_name_or_ID> --worker-pool <worker_pool_name_or_ID>
출력 예
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 ks worker get --cluster <cluster_name_or_ID> --worker <worker_ID>
를 실행하여 작업자 노드가 있는 VLAN을 보십시오. -
출력에서, 이전 단계에서 식별한 사설 IP 주소의 작업자 노드가 이 작업자 풀에 배치되었는지 확인하십시오.
-
NVIDIA GPU 머신에 앱 배포하기
GPU 머신 유형이 있는 경우 AI, 머신 러닝, 추론 등과 같은 컴퓨팅 집약적 워크로드에 필요한 처리 시간을 가속화할 수 있습니다.
IBM Cloud Kubernetes Service에서 필수 GPU 드라이버가 자동으로 설치됩니다.
다음 단계에서는 GPU가 필요한 워크로드를 배치하는 방법에 대해 알아봅니다. 그러나 워크로드를 GPU와 CPU 모두에서 처리할 필요가 없는 앱도 배포할 수 있습니다.
이 Kubernetes 데모를 사용하여 TensorFlow 기계 학습 프레임워크와 같은 수학적으로 집약적인 워크로드를 시도할 수도 있습니다.
전제조건
시작하기 전에
-
GPU 특성을 사용하는 클러스터 또는 작업자 풀을 작성하십시오. 베어메탈 머신의 설정을 완료하는 데는 1일 이상의 영업일이 소요될 수 있다는 점에 유의하십시오. 사용 가능한 특징 목록은 다음 링크를 참조하십시오.
-
클러스터에서 Kubernetes 리소스 관련 작업을 수행할 수 있도록 적절한 Kubernetes RBAC 역할을 부여하는 서비스 액세스 역할이 지정되어 있는지 확인하십시오.
워크로드 배치
-
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
로 지정해야 합니다. - 예를 들어
2
과 같이 요청하는 GPU의 전체 수를 입력합니다. 컨테이너 팟(Pod)은 GPU를 공유하지 않으며 GPU가 초과 커미트될 수 없습니다. 예를 들어, 1개의mg1c.16x128
머신만 있는 경우 해당 머신에는 2개의 GPU만 있으며 최대2
를 지정할 수 있습니다.
- 키를
-
YAML 파일을 적용하십시오. 예를 들어, 다음과 같습니다.
kubectl apply -f nvidia-devicequery.yaml
-
nvidia-devicequery
레이블로 파드를 필터링하여 작업 파드를 확인합니다. STATUS가 Completed인지 확인하십시오.kubectl get pod -A -l 'name in (nvidia-devicequery)'
출력 예
NAME READY STATUS RESTARTS AGE nvidia-devicequery-ppkd4 0/1 Completed 0 36s
-
GPU 디바이스 플러그인이 팟(Pod)을 스케줄한 방법을 알 수 있도록 팟(Pod)에 대해 설명하십시오.
-
Limits
및Requests
필드에서 사용자가 지정한 리소스 한계가 디바이스 플러그인에서 자동으로 설정한 요청과 일치하는지 확인하십시오. -
이벤트에서 팟(Pod)이 GPU 작업자 노드에 지정되었는지 확인하십시오.
kubectl describe pod nvidia-devicequery-ppkd4
출력 예
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 ...
-
-
로그를 확인하여 작업이 GPU를 사용하여 해당 워크로드를 계산했는지 확인할 수 있습니다.
kubectl 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.