이 페이지에서는 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 볼륨을 필요에 따라 동적으로 프로비저닝하거나 클러스터 관리자가 사전에 수동으로 프로비저닝하는 방법을 보여줍니다.
동적 프로비저닝
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
: 동적으로 프로비저닝된 볼륨이 복제될 리전 내 영역입니다.
StorageClass를 만듭니다.
kubectl create -f hdb-ha-example-class.yaml
다음 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
를 사용하려면PersistentVolumeClaim
에volumeMode: Block
도 추가해야 합니다. 이 설정은 여러 포드가 동시에 스토리지에 쓰는 경우 발생할 수 있는 데이터 손상을 방지합니다.volumeMode: Block
설정은 Kubernetes의 파일 시스템 관리를 우회하는 원시 블록 기기로 디스크를 노출합니다. 다음은 그 예시입니다.
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc spec: accessModes: - ReadWriteMany volumeMode: Block storageClassName: balanced-ha-storage resources: requests: storage: 20Gi ```
이전에 만든 StorageClass를 참조하는 PersistentVolumeClaim을 적용합니다.
kubectl apply -f pvc-example.yaml
수동 프로비저닝
Compute Engine 문서에 따라 Hyperdisk Balanced High Availability 볼륨을 수동으로 만듭니다.
다음 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
를 지원합니다. 각 액세스 모드의 차이점과 사용 사례는 영구 볼륨 액세스 모드를 참조하세요.
이전에 만든 Hyperdisk Balanced High Availability 볼륨을 참조하는 영구 볼륨을 만듭니다.
kubectl apply -f pv-example.yaml
다음 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에 지정된 액세스 모드와 동일해야 합니다. 각 액세스 모드의 차이점과 사용 사례는 영구 볼륨 액세스 모드를 참조하세요.
이전에 만든 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-b
및 europe-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
StorageClass
가 volumeBindingMode: 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-b
및 europe-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으로 사용의 객체 외에도 리전 영구 디스크의 PersistentVolume
은 node-affinity
도 지정해야 합니다.
StorageClass
를 사용하는 경우 영구 디스크 CSI 드라이버를 지정해야 합니다.
다음은 표준 영구 디스크를 사용하고 europe-west1-b
및 europe-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는 동일한 이름을 가진 영역 영구 디스크와 리전 영구 디스크를 구분할 수 없습니다. 이 문제를 해결하려면 영구 디스크에 고유한 이름을 지정해야 합니다. 동적으로 프로비저닝된 영구 디스크를 사용하는 경우에는 이 문제가 발생하지 않습니다.
다음 단계
- 튜토리얼을 따라 Persistent Disk 및 Cloud SQL로 GKE에 WordPress 배포 알아보기