기존 영구 디스크를 PersistentVolume으로 사용

이 페이지에서는 데이터가 채워진 기존 Compute Engine 영구 디스크를 이용해 PersistentVolume을 만드는 방법과 Pod에서 PersistentVolume을 사용하는 방법에 대해 설명합니다.

PersistentVolume 및 PersistentVolumeClaim 만들기

pd-name이라는 500GB 영구 디스크가 이미 있는 경우 다음 매니페스트 파일(existing-pd.yaml)은 해당 PersistentVolume 및 PersistentVolumeClaim을 설명합니다.

이 예시에서는 claimRef를 사용합니다. PersistentVolume에서 PersistentVolumeClaim을 참조하면 PersistentVolume이 지정한 PersistentVolumeClaim하고만 바인딩되도록 보장할 수 있습니다.

이름이 storageClassName과 일치하는 StorageClass 객체는 StorageClass에서 구성된 기능(예: 볼륨 크기 조절을 위한 allowVolumeExpansion)이 필요한 경우에만 필요합니다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-demo
spec:
  storageClassName: "example-storageclass"
  capacity:
    storage: 500G
  accessModes:
    - ReadWriteOnce
  claimRef:
    namespace: default
    name: pv-claim-demo
  gcePersistentDisk:
    pdName: pd-name
    fsType: ext4
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-claim-demo
spec:
  storageClassName: "example-storageclass"
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500G

PersistentVolume 및 PersistentVolumeClaim을 만들려면 kubectl apply -f existing-pd.yaml을 사용합니다.

Pod에서 PersistentVolume 사용

PersistentVolume 및 PersistentVolumeClaim이 클러스터에 존재하면 volumeMounts 필드에 값을 지정하여 Pod의 컨테이너에 볼륨 액세스 권한을 부여할 수 있습니다. 이 예시에서 이러한 필드는 이름이 task-pv-storage인 볼륨이 파일 경로 /usr/share/nginx/html에 마운트되도록 지정합니다.

kind: Pod
apiVersion: v1
metadata:
  name: task-pv-pod
spec:
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
       claimName: pv-claim-demo
  containers:
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: task-pv-storage

이 매니페스트를 클러스터에 적용하면 Pod가 만들어지고 task-pv-container 컨테이너는 /usr/share/nginx/html/ 디렉터리의 볼륨에 액세스할 수 있습니다.

StatefulSet에서 기존 디스크 사용

StatefulSet에서 기존 디스크를 사용하려면 다음 작업을 완료하세요.

  1. StatefulSet 이름, volumeClaimTemplates.name, StatefulSet의 복제본 수를 결정하고 값을 기록합니다. PersistentVolumeClaim이 생성될 때까지 StatefulSet를 만들지 마세요.
  2. StatefulSet의 자동으로 생성된 PersistentVolumeClaim 이름을 지정합니다. StatefulSet에서 PersistentVolumeClaim 이름은 예측 가능한 패턴을 따릅니다. volumeclaimtemplates-name-statefulset-name-replica-index. 예를 들어 StatefulSet의 이름이 'web'이면 StatefulSet의 volumeClaimTemplates.name은 'www'입니다. 두 개의 StatefulSet 복제본이 있는 경우 PersistentVolumeClaim 이름은 www-web-0www-web-1이 됩니다.
  3. claimRef 필드로 PersistentVolume을 만들고 claimRef.name을 생성된 PersistentVolumeClaim 이름으로 설정합니다. 복제본이 두 개 이상 있으면 각 복제본에 PersistentVolume을 만들어야 합니다.

    아래의 PersistentVolume 예시는 다음과 같은 특징을 가지는 환경에 적합합니다.

    • StatefulSet이 기본 네임스페이스에 있습니다.
    • StatefulSet의 복제본이 두 개 있습니다.
    • StatefulSet의 자동으로 생성된 PersistentVolumeClaim의 이름이 www-web-0www-web-1입니다.
    • 두 개의 기존 영구 디스크 이름이 pd-zeropd-one입니다.
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-statefulset-demo-0
    spec:
      storageClassName: "example-storageclass"
      capacity:
        storage: 100Gi
      accessModes:
        - ReadWriteOnce
      claimRef:
        namespace: default
        name: www-web-0
      gcePersistentDisk:
        pdName: pd-zero
        fsType: ext4
    
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-statefulset-demo-1
    spec:
      storageClassName: "example-storageclass"
      capacity:
        storage: 100Gi
      accessModes:
        - ReadWriteOnce
      claimRef:
        namespace: default
        name: www-web-1
      gcePersistentDisk:
        pdName: pd-one
        fsType: ext4
    
  4. 첫 번째 단계에서 만든 값을 사용하여 StatefulSet를 만듭니다. volumeClaimTemplates에 지정한 저장소가 PersistentVolume의 용량보다 작거나 같은지 확인합니다. 예를 들면 다음과 같습니다.

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      selector:
        matchLabels:
          app: nginx
      serviceName: "nginx"
      replicas: 2
      template:
        metadata:
          labels:
            app: nginx
        spec:
          terminationGracePeriodSeconds: 10
          containers:
          - name: nginx
            image: k8s.gcr.io/nginx-slim:0.8
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - metadata:
          name: www
        spec:
          accessModes: [ "ReadWriteOnce" ]
          resources:
            requests:
              storage: 100Gi