PersistentVolume의 접근 모드를 ReadWriteOncePod로 변경하기

PersistentVolume의 접근 모드를 ReadWriteOncePod로 변경하기 (Change the Access Mode of a PersistentVolume to ReadWriteOncePod)

이 페이지는 기존 PersistentVolume의 접근 모드를 ReadWriteOncePod 로 변경하는 방법을 보여줘요.

출처: 문서

본문

시작하기 전에 (Before you begin)

쿠버네티스 서버는 버전 v1.22 이상이어야 해요.

참고:

참고:

ReadWriteOncePod 접근 모드는 CSI 볼륨에서만 지원돼요. 이 볼륨 접근 모드를 사용하려면 다음 CSI sidecar를 이 버전 이상으로 업데이트해야 해요:

왜 ReadWriteOncePod를 사용해야 하나요?

쿠버네티스 v1.22 이전에는 ReadWriteOnce 접근 모드가 저장소에 대한 단일 작성자 접근을 요구하는 워크로드의 PersistentVolume 접근을 제한하는 데 흔히 사용됐어요. 하지만 이 접근 모드에는 제한이 있었어요: 볼륨 접근을 단일 노드로 제한해서, 같은 노드의 여러 파드가 같은 볼륨을 동시에 읽고 쓸 수 있었어요. 이는 데이터 안전을 위해 엄격한 단일 작성자 접근을 요구하는 애플리케이션에 위험이 될 수 있었어요.

워크로드에서 단일 작성자 접근 보장이 중요하다면, 볼륨을 ReadWriteOncePod 로 마이그레이션하는 것을 고려해요.

기존 PersistentVolume 마이그레이션하기

기존 PersistentVolume이 있다면 ReadWriteOncePod 를 사용하도록 마이그레이션할 수 있어요. ReadWriteOnce 에서 ReadWriteOncePod 로의 마이그레이션만 지원돼요.

이 예시에는 이미 ReadWriteOnce 인 "cat-pictures-pvc" PersistentVolumeClaim이 있고, 이는 "cat-pictures-pv" PersistentVolume에 바인딩되어 있으며, 이 PersistentVolumeClaim을 사용하는 "cat-pictures-writer" Deployment가 있어요.

참고:

저장소 플러그인이 동적 프로비저닝을 지원한다면 "cat-pictures-pv" 는 자동으로 생성되지만 이름이 다를 수 있어요. PersistentVolume의 이름을 얻으려면 다음을 실행해요:

kubectl get pvc cat-pictures-pvc -o jsonpath='{.spec.volumeName}'

변경하기 전에 PVC를 볼 수 있어요. 매니페스트를 로컬에서 보거나 kubectl get pvc <name-of-pvc> -o yaml 을 실행해요. 출력은 다음과 비슷해요:

# cat-pictures-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: cat-pictures-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

그 PersistentVolumeClaim에 의존하는 예시 Deployment는 다음과 같아요:

# cat-pictures-writer-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cat-pictures-writer
spec:
  replicas: 3
  selector:
    matchLabels:
      app: cat-pictures-writer
  template:
    metadata:
      labels:
        app: cat-pictures-writer
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        volumeMounts:
        - name: cat-pictures
          mountPath: /mnt
      volumes:
      - name: cat-pictures
        persistentVolumeClaim:
          claimName: cat-pictures-pvc
          readOnly: false

첫 단계로, PersistentVolume의 spec.persistentVolumeReclaimPolicy 를 편집해 Retain 으로 설정해야 해요. 이렇게 하면 해당 PersistentVolumeClaim을 삭제해도 PersistentVolume이 삭제되지 않아요:

kubectl patch pv cat-pictures-pv -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'

다음으로, 마이그레이션하려는 PersistentVolume에 바인딩된 PersistentVolumeClaim을 사용하는 워크로드를 모두 중지하고 PersistentVolumeClaim을 삭제해야 해요. 마이그레이션이 완료될 때까지는 볼륨 크기 조정 같은 PersistentVolumeClaim에 대한 다른 변경을 피하세요.

그게 끝나면 PersistentVolume의 spec.claimRef.uid 를 지워서 PersistentVolumeClaim이 다시 생성될 때 바인딩할 수 있게 해야 해요:

kubectl scale --replicas=0 deployment cat-pictures-writer
kubectl delete pvc cat-pictures-pvc
kubectl patch pv cat-pictures-pv -p '{"spec":{"claimRef":{"uid":""}}}'

그 후 PersistentVolume의 유효한 접근 모드 목록을 (오직) ReadWriteOncePod 로 교체해요:

kubectl patch pv cat-pictures-pv -p '{"spec":{"accessModes":["ReadWriteOncePod"]}}'

참고:

다음으로 PersistentVolumeClaim을 수정해 ReadWriteOncePod 만 접근 모드로 설정해야 해요. 또한 PersistentVolumeClaim의 spec.volumeName 을 PersistentVolume의 이름으로 설정해 이 특정 PersistentVolume에 바인딩되도록 해야 해요.

이게 끝나면 PersistentVolumeClaim을 다시 만들고 워크로드를 시작할 수 있어요:

# IMPORTANT: Make sure to edit your PVC in cat-pictures-pvc.yaml before applying. You need to:
# - Set ReadWriteOncePod as the only access mode
# - Set spec.volumeName to "cat-pictures-pv"

kubectl apply -f cat-pictures-pvc.yaml
kubectl apply -f cat-pictures-writer-deployment.yaml

마지막으로, 이전에 변경했다면 PersistentVolume의 spec.persistentVolumeReclaimPolicyDelete 로 다시 설정할 수 있어요.

kubectl patch pv cat-pictures-pv -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'

더 알아보기 (Learn more)