이 페이지에서는 Google Kubernetes Engine(GKE)에서 보조 부팅 디스크를 사용하여 워크로드 시작 지연 시간을 개선하는 방법을 보여줍니다. 보조 부팅 디스크를 사용하면 새 노드에서 데이터 또는 컨테이너 이미지를 미리 로드할 수 있습니다. 이를 통해 워크로드는 빠른 콜드 스타트를 달성하고 프로비저닝된 리소스의 전반적인 사용률을 개선할 수 있습니다.
개요
버전 1.28.3-gke.1067000부터는 보조 부팅 디스크로 노드 풀을 구성할 수 있습니다. 노드를 프로비저닝하고 머신러닝 모델 또는 컨테이너 이미지와 같은 데이터와 함께 미리 로드하도록 GKE에 지시할 수 있습니다. 보조 디스크에서 미리 로드된 데이터 또는 컨테이너 이미지를 사용하면 워크로드에서 다음과 같은 이점이 있습니다.
- 빠른 자동 확장
- 대용량 이미지를 가져올 때 지연 시간 감소
- 유지보수 이벤트 및 시스템 오류와 같은 중단으로부터 더 빠르게 복구
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우
gcloud components update
를 실행하여 최신 버전을 가져옵니다.
Container File System API를 사용 설정합니다.
클러스터에서 노드에 로드할 디스크 이미지에 대한 액세스 권한이 있는지 확인하세요.
요구사항
보조 부팅 디스크를 사용할 때는 다음 요구사항이 적용됩니다.
- 이 기능은 GKE 버전 1.28.3-gke.106700 이상에서 사용할 수 있습니다.
디스크 이미지를 수정할 때는 새 노드 풀을 만들어야 합니다. 기존 노드에서는 디스크 이미지를 업데이트할 수 없습니다.
보조 부팅 디스크 기능을 사용하려면 이미지 스트리밍을 구성해야 합니다.
보조 부팅 디스크 구성
다음 섹션에서는 보조 부팅 디스크를 구성하는 방법을 설명합니다.
데이터 미리 로드
보조 부팅 디스크로 GKE 클러스터 및 노드 풀을 만들기 전에 빌드 중 데이터가 준비되었을 때, CI/CD 파이프라인에서 자동화하는 디스크 이미지를 준비하는 것이 이상적입니다.
데이터가 포함된 디스크 이미지 준비
다음 단계를 완료하여 커스텀 디스크 이미지를 데이터 소스로 만듭니다.
보조 부팅 디스크로 GKE 클러스터 및 노드 풀 만들기
gcloud CLI를 사용하여 보조 부팅 디스크를 구성할 수 있습니다.
--enable-image-streaming
플래그를 사용하여 이미지 스트리밍이 사용 설정된 GKE Standard 클러스터를 만듭니다.gcloud container clusters create CLUSTER_NAME \ --location LOCATION \ --cluster-version=CLUSTER_VERSION \ --enable-image-streaming
다음을 바꿉니다.
- CLUSTER_NAME: 클러스터 이름
- LOCATION: 클러스터 위치
- CLUSTER-VERSION: 사용할 GKE 버전입니다.
1.28.3-gke.106700
이상이어야 합니다.
--secondary-boot-disk=disk-image
플래그를 사용하여 보조 부팅 디스크가 있는 노드 풀을 만듭니다.gcloud beta container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location LOCATION \ --enable-image-streaming \ --secondary-boot-disk=disk-image=global/images/DATA_DISK IMAGE
DISK_IMAGE_NAME을 디스크 이미지 이름으로 바꿉니다.
GKE는 각 노드에 미리 로드된 데이터가 있는 보조 디스크가 있는 노드 풀을 만듭니다. 그러면 보조 부팅 디스크가 노드에 연결되고 마운트됩니다.
원하는 경우 hostPath 볼륨 마운트를 사용하여 포드 컨테이너에 보조 디스크 이미지를 마운트할 수 있습니다. 다음 매니페스트를 사용하여 포드 리소스를 정의하고 hostPath 볼륨 마운트를 사용하여 컨테이너의 데이터 디스크를 미리 로드합니다.
apiVersion: v1 kind: Pod metadata: name: pod-name spec: containers: ... volumeMounts: - mountPath: /usr/local/data_path_sbd name: data_path_sbd ... volumes: - name: data_path_sbd hostPath: path: /mnt/disks/gke-secondary-disks/gke-DISK_IMAGE_NAME-disk
DISK_IMAGE_NAME을 디스크 이미지 이름으로 바꿉니다.
컨테이너 이미지 미리 로드
이 가이드에서는 gke-disk-image-builder
를 사용하여 VM 인스턴스를 만들고 디스크에서 컨테이너 이미지를 가져옵니다. gke-disk-image-builder
는 해당 디스크에서 디스크 이미지를 만듭니다. 컨테이너 이미지 빌드 단계 바로 직후에 디스크 이미지를 준비하는 것이 좋습니다. CI/CD 파이프라인에서 자동화하는 것이 이상적입니다.
gke-disk-image-builder
의 실행 로그를 저장할 Cloud Storage 버킷을 만듭니다.미리 로드된 컨테이너 이미지로 디스크 이미지를 만듭니다.
go run ./cli \ --project-name=PROJECT_ID \ --image-name=DISK_IMAGE_NAME \ --zone=LOCATION \ --gcs-path=gs://LOG_BUCKET_NAME \ --disk-size-gb=10 \ --container-image=docker.io/library/python:latest \ --container-image=docker.io/library/nginx:latest
다음을 바꿉니다.
- PROJECT_ID: Google Cloud 프로젝트 이름
- DISK_IMAGE_NAME: 디스크의 이미지 이름. 예를 들면
nginx-python-image
입니다. - LOCATION: 클러스터 위치
LOG_BUCKET_NAME: 실행 로그를 저장할 Cloud Storage 버킷의 이름입니다. 예를 들면
gke-secondary-disk-image-logs/
입니다.
이미지 스트리밍이 사용 설정된 GKE Standard 클러스터를 만듭니다.
gcloud container clusters create CLUSTER_NAME \ --location=LOCATION \ --cluster-version=CLUSTER_VERSION \ --enable-image-streaming
보조 부팅 디스크로 노드 풀을 만듭니다.
gcloud beta container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ \ --enable-image-streaming \ --secondary-boot-disk=disk-image=global/images/DISK_IMAGE_NAME,mode=CONTAINER_IMAGE_CACHE
포드 템플릿에
nodeSelector
를 추가합니다.nodeSelector: cloud.google.com/gke-nodepool: NODE_POOL_NAME
보조 부팅 디스크 캐시가 사용 중인지 확인합니다.
kubectl get events --all-namespaces
출력은 다음과 비슷합니다.
75s Normal SecondaryDiskCachin node/gke-pd-cache-demo-default-pool-75e78709-zjfm Image gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary disk cache
캐시된 컨테이너 이미지에 대해 예상되는 이미지 가져오기 지연 시간은 이미지 크기에 관계없이 몇 초 이하여야 합니다. 다음 명령어를 실행하여 이미지 가져오기 지연 시간을 확인할 수 있습니다.
kubectl describe pod POD_NAME
POD_NAME
을 포드의 이름으로 바꿉니다.출력은 다음과 비슷합니다.
… Normal Pulled 15m kubelet Successfully pulled image "docker.io/library/nginx:latest" in 0.879149587s …
다음 단계
- 이미지 스트리밍을 사용하여 컨테이너 이미지 가져오기를 통해 워크로드에 필요한 이미지 데이터를 스트리밍하여 컨테이너 이미지 가져오기
- NCCL Fast Socket을 사용하여 워크로드 효율성 개선을 참조하여 NVIDIA Collective Communications Library(NCCL) Fast Socket 플러그인을 사용하는 방법 알아보기