보조 부팅 디스크를 사용하여 데이터 또는 컨테이너 이미지 미리 로드


이 페이지에서는 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를 사용 설정합니다.

    Container File System API 사용 설정

  • 클러스터에서 노드에 로드할 디스크 이미지에 대한 액세스 권한이 있는지 확인하세요.

요구사항

보조 부팅 디스크를 사용할 때는 다음 요구사항이 적용됩니다.

  1. 이 기능은 GKE 버전 1.28.3-gke.106700 이상에서 사용할 수 있습니다.
  2. 디스크 이미지를 수정할 때는 새 노드 풀을 만들어야 합니다. 기존 노드에서는 디스크 이미지를 업데이트할 수 없습니다.

  3. 보조 부팅 디스크 기능을 사용하려면 이미지 스트리밍을 구성해야 합니다.

보조 부팅 디스크 구성

다음 섹션에서는 보조 부팅 디스크를 구성하는 방법을 설명합니다.

데이터 미리 로드

보조 부팅 디스크로 GKE 클러스터 및 노드 풀을 만들기 전에 빌드 중 데이터가 준비되었을 때, CI/CD 파이프라인에서 자동화하는 디스크 이미지를 준비하는 것이 이상적입니다.

데이터가 포함된 디스크 이미지 준비

다음 단계를 완료하여 커스텀 디스크 이미지를 데이터 소스로 만듭니다.

  1. 빈 디스크가 있는 VM을 만듭니다.
  2. VM에 SSH를 통해 연결합니다.
    1. 빈 디스크를 마운트합니다.
    2. 빈 디스크에 데이터를 다운로드합니다.
  3. VM에서 커스텀 이미지를 만듭니다.

보조 부팅 디스크로 GKE 클러스터 및 노드 풀 만들기

gcloud CLI를 사용하여 보조 부팅 디스크를 구성할 수 있습니다.

  1. --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 이상이어야 합니다.
  2. --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는 각 노드에 미리 로드된 데이터가 있는 보조 디스크가 있는 노드 풀을 만듭니다. 그러면 보조 부팅 디스크가 노드에 연결되고 마운트됩니다.

  3. 원하는 경우 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 파이프라인에서 자동화하는 것이 이상적입니다.

  1. gke-disk-image-builder의 실행 로그를 저장할 Cloud Storage 버킷을 만듭니다.
  2. 미리 로드된 컨테이너 이미지로 디스크 이미지를 만듭니다.

    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/입니다.

  3. 이미지 스트리밍이 사용 설정된 GKE Standard 클러스터를 만듭니다.

    gcloud container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --cluster-version=CLUSTER_VERSION \
        --enable-image-streaming
    
  4. 보조 부팅 디스크로 노드 풀을 만듭니다.

    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
    
  5. 포드 템플릿에 nodeSelector를 추가합니다.

    nodeSelector:
        cloud.google.com/gke-nodepool: NODE_POOL_NAME
    
  6. 보조 부팅 디스크 캐시가 사용 중인지 확인합니다.

    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
    …
    

다음 단계