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.persistentVolumeReclaimPolicy 를 Delete 로 다시 설정할 수 있어요.
kubectl patch pv cat-pictures-pv -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'
더 알아보기 (Learn more)
- PersistentVolume에 대해 더 알아보기
- PersistentVolumeClaim에 대해 더 알아보기
- 파드가 저장용 PersistentVolume을 사용하도록 구성하기에 대해 더 알아보기