로컬 SSD

이 페이지에서는 Kubernetes에서의 로컬 SSD 지원 개요와 Google Kubernetes Engine에서 로컬 SSD를 사용하는 방법을 제공합니다.

개요

로컬 SSD는 클러스터에 있는 모든 노드에 고성능 임시 저장소를 제공합니다. 로컬 SSD는 표준 디스크보다 높은 처리량과 낮은 지연 시간을 제공합니다. 로컬 캐싱 및 처리는 로컬 SSD에 적합한 작업 부하입니다.

클러스터의 머신 유형 제한 및 프로젝트의 할당량 내에서 로컬 SSD로 노드 풀을 만들 수 있습니다.

제한사항

로컬 SSD를 사용할 때는 다음 제한사항에 유의해야 합니다.

  • 로컬 SSD는 노드의 호스트 가상 머신 인스턴스에 물리적으로 연결되기 때문에 여기에 저장된 모든 데이터는 해당 노드에서만 존재합니다. 디스크에 저장된 데이터가 로컬로 존재하므로, 이 데이터를 사용할 수 없더라도 애플리케이션이 이에 대해 탄력적이어야 합니다.
  • 로컬 SSD에 저장된 데이터는 임시 데이터입니다. 로컬 SSD에 데이터를 기록하는 포드의 경우, 해당 포드가 이 노드를 사용하지 않도록 다시 예약되면 디스크에 저장된 데이터에 액세스하지 못할 수 있습니다. 또한 노드가 종료되거나, 업그레이드되거나, 복구되면, 데이터가 지워집니다.
  • 기존 노드 풀에는 로컬 SSD를 추가할 수 없습니다.

로컬 SSD로 클러스터 만들기

Google Cloud Platform 콘솔 또는 gcloud 명령줄 도구를 사용해서 로컬 SSD로 클러스터를 만들 수 있습니다.

gcloud

gcloud를 사용해서 로컬 SSD로 클러스터 또는 노드 풀을 만들려면 --local-ssd count 플래그를 지정합니다.

기본 풀이 로컬 SSD 디스크를 사용하는 클러스터를 만들려면 다음 명령어를 실행하세요.

gcloud container clusters create [CLUSTER_NAME] \
    --num-nodes 2 --local-ssd-count [NUMBER_OF_DISKS]

여기서 [NUMBER_OF_DISKS]는 절대값 숫자로 된 원하는 디스크 수입니다.

기존 클러스터에 로컬 SSD 디스크로 노드 풀을 만들려면 다음을 사용하세요.

gcloud beta container node-pools create [POOL_NAME] --cluster [CLUSTER_NAME] \
    --num-nodes 1 --local-ssd-count [NUMBER_OF_DISKS]

--local-ssd-count는 노드별로 생성할 로컬 SSD 수를 지정합니다. 최대 개수는 머신 유형 및 지역에 따라 달라집니다(로컬 SSD 참조). 노드가 생성되면 로컬 SSD가 자동으로 포맷되고 호스트 OS에서 /mnt/disks/ 하위 디렉토리에 마운트됩니다. 각 로컬 SSD는 'ssd#' 디렉토리에 마운트됩니다.

콘솔

GCP 콘솔의 GKE 메뉴에서 로컬 SSD로 클러스터 또는 노드 풀을 만들 수 있습니다.

기본 풀이 로컬 SSD 디스크를 사용하는 클러스터를 만들려면 다음 단계를 수행하세요.

  1. GCP 콘솔에서 Google Kubernetes Engine 메뉴로 이동합니다.

    Google Kubernetes Engine 메뉴로 이동

  2. 클러스터 만들기를 클릭합니다.

  3. 노드 풀 아래에서 고급 수정을 클릭합니다.

  4. 노드 수에 2를 입력합니다.

  5. 로컬 SSD 디스크에서 원하는 SSD 수를 절대값 숫자로 입력합니다.

  6. 저장을 클릭한 후에 만들기를 클릭합니다.

기존 클러스터에 로컬 SSD 디스크로 노드 풀을 만들려면 다음을 사용하세요.

  1. GCP 콘솔에서 Google Kubernetes Engine 메뉴로 이동합니다.

    Google Kubernetes Engine 메뉴로 이동

  2. 원하는 클러스터를 선택합니다.

  3. 수정을 클릭합니다.

  4. 노드 풀 아래에서 노드 풀 추가를 클릭합니다.

  5. 크기에 1을 입력합니다.

  6. 로컬 SSD 디스크(노드별)에서 원하는 SSD 수를 절대값 숫자로 입력합니다.

  7. 저장을 클릭합니다.

로컬 SSD 사용

다음 섹션에서는 GKE에 로컬 SSD를 사용하는 방법을 설명합니다.

두 가지 방법 중 하나로 로컬 SSD에 액세스할 수 있습니다.

  • Hostpath 볼륨은 다음 경우에 권장됩니다.

    • DaemonSets를 사용하는 작업 부하
    • 전용 노드 풀을 사용하는 작업 부하. DaemonSet의 모든 인스턴스에서 동일한 경로로 모든 로컬 SSD에 액세스해야 합니다.
  • 로컬 PersistentVolumes는 Kubernetes 1.10부터 베타로 제공되며 다음 경우에 권장됩니다.

    • StatefulSets 및 volumeClaimTemplates를 사용하는 작업 부하
    • 노드 풀을 공유하는 작업 부하. 각 로컬 SSD는 PVC(PersistentVolumeClaim)를 통해 예약할 수 있으며, 특정 호스트 경로가 포드 사양에서 직접 인코딩되지 않습니다.
    • 동일한 로컬 SSD에 대해 데이터 비중이 필요한 포드. 포드는 항상 해당 로컬 PersistentVolume과 동일한 노드로 예약됩니다.

hostPath 볼륨 사용 예

3개의 로컬 SSD로 노드 풀을 만들 경우 호스트 OS가 디스크를 /mnt/disks/ssd0, /mnt/disks/ssd1, /mnt/disks/ssd2에 마운트합니다. Kubernetes 컨테이너는 객체의 구성 파일에 정의된 hostPath 매개변수를 사용하여 디스크에 액세스합니다.

이 예제 포드 구성 파일은 로컬 SSD /mnt/disks/ssd0을 참조합니다.

apiVersion: v1
kind: Pod
metadata:
  name: "test-ssd"
spec:
  containers:
  - name: "shell"
    image: "ubuntu:14.04"
    command: ["/bin/sh", "-c"]
    args: ["echo 'hello world' > /test-ssd/test.txt && sleep 1 && cat /test-ssd/test.txt"]
    volumeMounts:
    - mountPath: "/test-ssd/"
      name: "test-ssd"
  volumes:
  - name: "test-ssd"
    hostPath:
      path: "/mnt/disks/ssd0"
  nodeSelector:
    cloud.google.com/gke-local-ssd: "true"

로컬 PersistentVolumes 사용 예

Kubernetes 버전 1.10부터는 로컬 SSD를 PersistentVolumes로 지정할 수 있습니다.

PersistentVolume을 수동으로 만들거나 로컬 볼륨 정적 프로비저닝 도구를 실행하여 로컬 SSD에서 PersistentVolumes를 만들 수 있습니다.

주의사항

현재까지 클러스터 자동 확장동적 프로비저닝은 이 기능으로 지원되지 않습니다.

GKE 클러스터를 업그레이드하거나 노드를 복구하면 Compute Engine 인스턴스가 삭제되어, 로컬 SSD에 있는 모든 데이터도 삭제됩니다.

영구 데이터에 로컬 SSD를 사용하는 클러스터 또는 노드 풀에 대해서는 노드 자동 업그레이드 또는 노드 자동 복구를 사용 설정하지 않아야 합니다. 애플리케이션 데이터를 먼저 백업한 후 데이터를 새 클러스터 또는 노드 풀로 복원해야 합니다.

수동으로 PersistentVolume 만들기

클러스터의 각 노드에서 각 로컬 SSD에 대해 PersistentVolume을 수동으로 만들 수 있습니다.

PersistentVolume 객체에서 nodeAffinity 필드를 사용하여 특정 노드의 로컬 SSD를 참조합니다. 예를 들어 다음은 gke-test-cluster-default-pool-926ddf80-f166 노드의 /mnt/disks/ssd0에 마운트된 로컬 SSD에 대한 PersistentVolume 사양입니다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: "example-local-pv"
spec:
  capacity:
    storage: 375Gi
  accessModes:
  - "ReadWriteOnce"
  persistentVolumeReclaimPolicy: "Retain"
  storageClassName: "local-storage"
  local:
    path: "/mnt/disks/ssd0"
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: "kubernetes.io/hostname"
          operator: "In"
          values: "gke-test-cluster-default-pool-926ddf80-f166"

PersistentVolume을 삭제한 경우 디스크에서 데이터를 수동으로 지워야 합니다.

로컬 볼륨 정적 프로비저닝 도구 실행

로컬 볼륨 정적 프로비저닝 도구를 사용하여 로컬 SSD에 대해 PersistentVolumes를 자동으로 만들 수 있습니다. 프로비저닝 도구는 각 노드에서 로컬 SSD를 관리하고, 이를 위한 PersistentVolumes를 생성 및 삭제하고, PersistentVolume이 해제되었을 때 로컬 SSD에서 데이터를 삭제하는 DaemonSet입니다.

로컬 볼륨 정적 프로비저닝 도구를 실행하려면 다음을 수행하세요.

  1. external-storage repo에서 provisioner_generated_gce_ssd_count.yaml 사양을 다운로드하고 사양의 namespace 필드를 필요에 따라 수정합니다.

    사양에는 다음이 포함됩니다.

    • 프로비저닝 도구의 ServiceAccount
    • 다음 권한을 위한 ClusterRole 및 ClusterRoleBindings:
      • PersistentVolume 객체 만들기 및 삭제
      • 노드 객체 가져오기
    • GKE를 위한 프로비저닝 도구 설정이 포함된 ConfigMap
    • 프로비저닝 도구를 실행하기 위한 DaemonSet
  2. IAM 계정을 Kubernetes 클러스터 관리자 역할에 연결합니다. 이 작업은 ClusterRole 만들기 권한을 얻기 위해 필요합니다.

  3. 프로비저닝 도구를 배포합니다.

    kubectl apply -f provisioner_generated_gce_ssd_count.yaml

프로비저닝 도구가 성공적으로 실행된 후 클러스터의 각 로컬 SSD에 대해 PersistentVolume 객체가 생성됩니다.

지연된 볼륨 결합 사용 설정

예약 성능 향상을 위해서는 volumeBindingMode: WaitForFirstConsumer로 StorageClass를 만드는 것이 좋습니다. 이 클래스는 포드 예약 전까지 PVC(PersistentVolumeClaim) 결합을 지연하여, 포드를 실행할 수 있는 적절한 노드에서 로컬 SSD가 선택되도록 합니다. 이러한 향상된 예약 동작에 따라 로컬 SSD를 사용할 수 있는 노드와 함께 포드 CPU, 메모리 요청, 노드 어피니티, 포드 어피니티, 안티 어피니티, 여러 PVC 요청을 고려할 수 있습니다.

local_class.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: "local-scsi"
provisioner: "kubernetes.io/no-provisioner"
volumeBindingMode: "WaitForFirstConsumer"

지연된 결합으로 StorageClass를 만들려면 다음 명령어를 실행하세요.

kubectl apply -f local_class.yaml

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Kubernetes Engine