리전 영구 디스크 및 Hyperdisk Balanced High Availability 볼륨 프로비저닝

이 페이지에서는 Hyperdisk Balanced High Availability 볼륨리전 영구 디스크의 동적 프로비저닝을 사용 설정하는 방법과 Google Kubernetes Engine(GKE)에서 수동으로 프로비저닝하는 방법을 설명합니다. 머신 유형 호환성은 리전 디스크 제한사항Hyperdisk의 머신 시리즈 지원을 참조하세요. 일반적으로 3세대 머신 시리즈 이상에는 Hyperdisk Balanced High Availability 볼륨을 사용하고 2세대 머신 시리즈 이하에는 리전 영구 디스크를 사용해야 합니다. 머신 시리즈 세대에 대한 자세한 내용은 Compute Engine 용어를 참조하세요.

리전 영구 디스크로 고가용성 애플리케이션에 대해 엔드 투 엔드 솔루션을 만들려면 스테이트풀(Stateful) HA 연산자로 스테이트풀(Stateful) 앱 가용성 증가를 참조하세요. 이 기능은 Hyperdisk Balanced High Availability 볼륨을 지원하지 않습니다.

하이퍼디스크 균형 고가용성

이 예에서는 Hyperdisk Balanced High Availability 볼륨을 필요에 따라 동적으로 프로비저닝하거나 클러스터 관리자가 사전에 수동으로 프로비저닝하는 방법을 보여줍니다.

동적 프로비저닝

  1. balanced-ha-storage.yaml 파일에 다음 매니페스트를 저장합니다.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: balanced-ha-storage
    provisioner: pd.csi.storage.gke.io
    volumeBindingMode: WaitForFirstConsumer
    # Allow volume expansion.
    allowVolumeExpansion: true
    parameters:
      type: hyperdisk-balanced-high-availability
      # Provisioned throughput in MiB/s.
      provisioned-throughput-on-create: "250Mi"
      # Provisioned IOPS (input/output operations per second).
      provisioned-iops-on-create: "7000"
    allowedTopologies:
    - matchLabelExpressions:
      - key: topology.gke.io/zone
        values:
        - ZONE1
        - ZONE2
    

    다음을 바꿉니다.

    • ZONE1, ZONE2: 동적으로 프로비저닝된 볼륨이 복제될 리전 내 영역입니다.
  2. StorageClass를 만듭니다.

    kubectl create -f hdb-ha-example-class.yaml
    
  3. 다음 PersistentVolumeClaim 매니페스트를 pvc-example.yaml 파일에 저장합니다.

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
      - ACCESS_MODE
      storageClassName: balanced-ha-storage
      resources:
        requests:
          storage: 20Gi
    

    다음을 바꿉니다.

    • ACCESS_MODE: Hyperdisk Balanced High Availability는 ReadWriteOnce, ReadWriteMany, ReadWriteOncePod를 지원합니다. 각 액세스 모드의 차이점과 사용 사례는 영구 볼륨 액세스 모드를 참조하세요.
    • ReadWriteMany를 사용하려면 PersistentVolumeClaimvolumeMode: Block도 추가해야 합니다. 이 설정은 여러 포드가 동시에 스토리지에 쓰는 경우 발생할 수 있는 데이터 손상을 방지합니다. volumeMode: Block 설정은 Kubernetes의 파일 시스템 관리를 우회하는 원시 블록 기기로 디스크를 노출합니다. 다음은 그 예시입니다.
      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: podpvc
      spec:
        accessModes:
        - ReadWriteMany
        volumeMode: Block
        storageClassName: balanced-ha-storage
        resources:
          requests:
            storage: 20Gi
      ```
    
  4. 이전에 만든 StorageClass를 참조하는 PersistentVolumeClaim을 적용합니다.

    kubectl apply -f pvc-example.yaml
    

수동 프로비저닝

  1. Compute Engine 문서에 따라 Hyperdisk Balanced High Availability 볼륨을 수동으로 만듭니다.

  2. 다음 PersistentVolume 매니페스트를 pv-example.yaml 파일에 저장합니다. 이 매니페스트는 방금 만든 Hyperdisk Balanced High Availability 볼륨을 참조합니다.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-demo
    spec:
      capacity:
        storage: 500Gi
      accessModes:
        - ACCESS_MODE
      # ClaimRef links this PersistentVolume to a PersistentVolumeClaim.
      claimRef:
        namespace: default
        name: podpvc
      csi:
        driver: pd.csi.storage.gke.io
        # The unique identifier of the Compute Engine disk resource that backs this volume.
        volumeHandle: projects/PROJECT_ID/regions/REGION/disks/gce-disk-1
      # Node affinity to ensure the Pod is scheduled in a zone where the volume is replicated.
      nodeAffinity:
        required:
          nodeSelectorTerms:
            - matchExpressions:
              - key: topology.gke.io/zone
                operator: In
                values:
                - ZONE1
                - ZONE2
    

    다음을 바꿉니다.

    • PROJECT_ID: 만든 볼륨의 프로젝트 ID입니다.
    • REGION: 만든 디스크의 리전입니다. 최신 리전별 가용성은 Compute Engine 문서를 참조하세요.
    • ZONE1, ZONE2: 만든 볼륨이 복제되는 리전 내 영역입니다.
    • ACCESS_MODE: Hyperdisk Balanced High Availability는 ReadWriteOnce, ReadWriteMany, ReadWriteOncePod를 지원합니다. 각 액세스 모드의 차이점과 사용 사례는 영구 볼륨 액세스 모드를 참조하세요.
  3. 이전에 만든 Hyperdisk Balanced High Availability 볼륨을 참조하는 영구 볼륨을 만듭니다.

    kubectl apply -f pv-example.yaml
    
  4. 다음 PersistentVolumeClaim 매니페스트를 pvc-example.yaml 파일에 저장합니다.

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
      - ACCESS_MODE
      storageClassName: balanced-ha-storage
      resources:
        requests:
          storage: 20Gi
    

    다음을 바꿉니다.

    • ACCESS_MODE: Hyperdisk Balanced High Availability는 ReadWriteOnce, ReadWriteMany, ReadWriteOncePod를 지원합니다. 이전 단계의 PersistentVolume에 지정된 액세스 모드와 동일해야 합니다. 각 액세스 모드의 차이점과 사용 사례는 영구 볼륨 액세스 모드를 참조하세요.
  5. 이전에 만든 PersistentVolume을 참조하는 PersistentVolumeClaim을 적용합니다.

    kubectl apply -f pvc-example.yaml
    

블록 모드에서 멀티 작성자 볼륨 사용

블록 모드에서 볼륨을 사용하려면 사용하는 포드에서 volumeMounts 대신 volumeBlock를 지정해야 합니다. 이전에 소개한 PersistenVolumeClaim을 사용하는 포드의 예는 다음과 같습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        # Use volumeDevices instead of volumeMounts to consume the volume as a raw block device.
        volumeDevices:
        # The "mountPath" field specifies the path where the block device is accessible in the container.
        - mountPath: /dev/my-device
          name: mypvc
      volumes:
      - name: mypvc
        persistentVolumeClaim:
          claimName: podpvc
          readOnly: false

리전 영구 디스크

영역 영구 디스크와 마찬가지로 리전 영구 디스크를 필요에 따라 동적으로 프로비저닝하거나 클러스터 관리자가 사전에 수동으로 프로비저닝할 수 있지만 동적 프로비저닝이 권장됩니다. pd-standard 유형의 리전 영구 디스크를 사용하려면 PersistentVolumeClaim의 spec.resources.requests.storage 속성을 최소 200GiB로 설정합니다. 사용 사례에 더 작은 볼륨이 필요한 경우 pd-balanced 또는 pd-ssd를 대신 사용하는 것이 좋습니다.

동적 프로비저닝

리전 영구 디스크의 동적 프로비저닝을 사용 설정하려면 replication-type 매개변수로 StorageClass를 만들고 allowedTopologies에 영역 제약조건을 지정합니다.

예를 들어 다음 매니페스트는 표준 영구 디스크를 사용하고 europe-west1-beurope-west1-c 영역에 데이터를 복제하는 regionalpd-storageclass라는 이름의 StorageClass를 설명합니다.

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: regionalpd-storageclass
provisioner: pd.csi.storage.gke.io
parameters:
  type: pd-balanced
  # Specifies that the disk should be a regional persistent disk.
  replication-type: regional-pd
volumeBindingMode: WaitForFirstConsumer
# Constrains which zones the regional persistent disk can be provisioned in.
allowedTopologies:
- matchLabelExpressions:
  - key: topology.gke.io/zone
    values:
    - europe-west1-b
    - europe-west1-c

리전 클러스터를 사용하는 경우 allowedTopologies를 지정되지 않은 상태로 둘 수 있습니다. 이렇게 하면 이 StorageClass를 사용하는 PersistentVolumeClaim을 소비하는 pod를 만들 때 리전 영구 디스크가 두 영역으로 프로비저닝됩니다. 한 영역은 pod가 예약된 영역과 동일합니다. 다른 한 영역은 클러스터에서 사용할 수 있는 영역에서 무작위로 선택됩니다.

영역 클러스터를 사용할 때 allowedTopologies를 설정해야 합니다.

StorageClass가 생성되면 다음으로 storageClassName 필드를 사용하여 PersistentVolumeClaim 객체를 만들고 StorageClass를 참조합니다. 예를 들어 다음 매니페스트는 regional-pvc라는 이름의 PersistentVolumeClaim을 만들고 regionalpd-storageclass를 참조합니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: regional-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Gi
  storageClassName: regionalpd-storageclass

StorageClassvolumeBindingMode: WaitForFirstConsumer로 구성되어 있으므로 PersistentVolumeClaim을 사용하는 pod가 생성될 때까지 PersistentVolume이 프로비저닝되지 않습니다.

다음 매니페스트는 이전에 만든 PersistentVolumeClaim을 사용하는 pod의 예시입니다.

kind: Pod
apiVersion: v1
metadata:
  name: task-pv-pod
spec:
  volumes:
    - name: task-pv-storage
      # This Pod uses the PVC that's associated with the
      # "regionalpd-storageclass" StorageClass.
      persistentVolumeClaim:
        claimName: regional-pvc
  containers:
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      # The volume is mounted into the container at the "/usr/share/nginx/html" path.
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: task-pv-storage

수동 프로비저닝

먼저 gcloud compute disks create 명령어를 사용하여 리전 영구 디스크를 만듭니다. 다음 예시에서는 europe-west1-beurope-west1-c 영역에 복제된 gce-disk-1이라는 디스크를 만듭니다.

gcloud compute disks create gce-disk-1 \
   --size 500Gi \
   --region europe-west1 \
   --replica-zones europe-west1-b,europe-west1-c

그런 후 바로 전에 만든 리전 영구 디스크를 참조하는 PersistentVolume을 만들 수 있습니다. 기존 Persistent Disk를 PersistentVolume으로 사용의 객체 외에도 리전 영구 디스크의 PersistentVolumenode-affinity도 지정해야 합니다. StorageClass를 사용하는 경우 영구 디스크 CSI 드라이버를 지정해야 합니다.

다음은 표준 영구 디스크를 사용하고 europe-west1-beurope-west1-c 영역에 데이터를 복제하는 StorageClass 매니페스트의 예시입니다.

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: regionalpd-storageclass
provisioner: pd.csi.storage.gke.io
parameters:
  type: pd-balanced
  # Specifies that the disk should be a regional persistent disk.
  replication-type: regional-pd
volumeBindingMode: WaitForFirstConsumer
# Constrains which zones the regional persistent disk can be provisioned in.
allowedTopologies:
- matchLabelExpressions:
  - key: topology.gke.io/zone
    values:
    - europe-west1-b
    - europe-west1-c

다음은 pv-demo라는 PersistentVolume을 만들고 regionalpd-storageclass를 참조하는 매니페스트의 예시입니다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-demo
spec:
  # The StorageClass that specifies regional replication.
  storageClassName: "regionalpd-storageclass"
  capacity:
     storage: 500Gi
  accessModes:
     - ReadWriteOnce
  claimRef:
    namespace: default
    name: pv-claim-demo
  csi:
    driver: pd.csi.storage.gke.io
    # The unique identifier for the pre-existing regional disk.
    volumeHandle: projects/PROJECT_ID/regions/europe-west1/disks/gce-disk-1
  # Ensures that Pods are scheduled in zones where the disk is replicated.
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
          - key: topology.gke.io/zone
            operator: In
            values:
               - europe-west1-b
               - europe-west1-c

PersistentVolume 예시에서 다음에 유의하세요.

  • volumeHandle 필드에는 PROJECT_ID를 비롯한 gcloud compute disks create 호출의 세부정보가 포함됩니다.
  • claimRef.namespace 필드는 default로 설정된 경우에도 지정해야 합니다.

영구 디스크 이름 지정

Kubernetes는 동일한 이름을 가진 영역 영구 디스크와 리전 영구 디스크를 구분할 수 없습니다. 이 문제를 해결하려면 영구 디스크에 고유한 이름을 지정해야 합니다. 동적으로 프로비저닝된 영구 디스크를 사용하는 경우에는 이 문제가 발생하지 않습니다.

다음 단계