쿠버네티스 볼륨 개념 1편 (emptyDir, hostPath) : https://nirsa.tistory.com/156?category=871751
- 쿠버네티스 PV (Persistent Volume)와 PVC (persistent Volume Claim) 이란?
PV는 관리자에 의해 생성된 볼륨을 뜻하고, PVC는 사용자가 볼륨을 사용하기 위해 PV에 요청을 하게 됩니다. 컨테이너의 /var/log/test.log 디렉토리를 워커노드의 /tmp/log_backup 경로에 PVC와 PV 설정을 하면 아래와 같은 형태가 될 수 있습니다.
- PV와 PVC의 Lifecycle
PV와 PVC는 크게 4가지 정도의 Lifecycle을 가집니다.
- 1. 프로비저닝 (provisioning)
정적(static) 또는 동적(dynamic)의 pv를 생성하는 단계 이며 적어도 지금 작성하는 lifecycle인 프로비저닝에서는 pv 생성이라는 단어를 프로비저닝이라고 불러도 모두 같은 의미가 됩니다. pv 생성(프로비저닝)이 정상적으로 성공하면 Available 상태가 됩니다.
정적 프로비저닝은 매니페스트 파일 등을 통해 특정 용량을 가진 PV를 미리 생성해두고, 요청이 있을 시 미리 생성한 PV을 할당하여 사용하게 됩니다.
동적 프로비저닝은 정적과는 다르게 사용자가 요청할 때 pv를 생성하여 할당하고, 사용자는 원하는 만큼의 용량을 생성해서 자유롭게 사용할 수 있습니다.
- 2. 바인딩 (binding)
PV를 PVC에 연결시키는 단계 입니다. PVC는 사용자가 요청하는 볼륨을 PV에 요청하고 PV는 그에 맞는 볼륨이 있으면 할당해주게 되됩니다. 만약 PVC가 요청하는 볼륨이 PV에 없다면 해당 요청은 무한정 남아있게 되고, PVC가 요청하는 볼륨이 PV에 생성되면 그 요청은 받아들여져 할당해주게 됩니다.
PVC와 PV는 ClaimRef를 사용하는 1:1 관계 이며 바인딩이 정상적으로 완료될 경우 bound 상태가 됩니다.
- 3. 사용 (using)
Pod는 PVC를 볼륨으로 사용 합니다. 클러스터는 PVC를 확인하여 바인딩된 PV를 찾고 해당 볼륨을 Pod에서 사용할 수 있도록 해줍니다.
만약 Pod가 사용중인 PVC를 삭제하려고 하면 Storage Object in Use Protection에 의해 삭제되지 않습니다. 만약 삭제 요청을 하였다면 Pod가 PVC를 사용하지 않을때까지 삭제 요청은 연기 됩니다.
- 4. 회수 (Reclamiming)
PV는 기존에 사용했던 PVC가 아니더라도 다른 PVC로 재활용이 가능 합니다. 때문에 사용이 종료된 PVC를 삭제할 때, 사용했던 PV의 데이터를 어떻게 처리할지에 대한 설정을 하게 됩니다.
- Retain : PV의 데이터를 그대로 보존 합니다.
- Recycle : 재사용하게될 경우 기존의 PV 데이터들을 모두 삭제 후 재사용 합니다.
- Delete : 사용이 종료되면 해당 볼륨을 삭제 합니다.
- 1. pv 생성
apiVersion: v1
kind: PersistentVolume
metadata:
name: dev-pv
spec:
capacity:
storage: 2Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
storageClassName: manual
persistentVolumeReclaimPolicy: Delete
hostPath:
path: /tmp/log_backup
- spec.capacity.storage → 사용할 용량을 2GB로 설정 합니다.
- spec.volumeMode → 볼륨을 Filesystem으로 사용 합니다.
- spec.accessModes → 특정 접근 모드 선택
- ReadWriteOnce : 하나의
Pod노드에서만 읽고 쓸 수 있습니다. - ReadOnlyMany : 여러개의
Pod노드에서 읽을 수 있습니다. - ReadWriteMany : 여러개의
Pod노드에서 읽고 쓸 수 있습니다.
- ReadWriteOnce : 하나의
- spec.storageClassName → 스토리지 클래스를 지정하고 해당 클래스에 맞는 PVC와 연결 할 수 있습니다.
- spec.persistentVolumeReclaimPolicy → Delete는 볼륨의 사용이 종료되면 볼륨을 삭제 합니다. 위의 회수 단계에서 설명한 필드 입니다.
- hostPath → 노드에 저장되는 디렉토리를 설정 합니다.
생성후 kubectl get pv로 확인하면 Available 상태인것을 확인할 수 있습니다.
- 2. PVC 생성
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: dev-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 2Gi
storageClassName: manual
PVC를 생성하고 kubectl get pv,pvc로 조회하면 PV와 PVC가 연결(binding) 되었으므로 상태가 Available 상태에서 Bound으로 변경 된것을 확인할 수 있습니다.
- 3. PVC를 사용할 디플로이먼트 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
labels:
app: test-deployment
spec:
replicas: 1
selector:
matchLabels:
app: test-deployment
template:
metadata:
labels:
app: test-deployment
spec:
containers:
- name: test-deployment
image: nginx
ports:
- containerPort: 8080
volumeMounts:
- mountPath: "/var/log/test.log"
name: dev-volume
volumes:
- name: dev-volume
persistentVolumeClaim:
claimName: dev-pvc
- spec.template.spec.containers.volumeMounts → 볼륨 마운트할 컨테이너 안의 경로를 작성하고, 이 경로를 저장한 볼륨 마운트 정보를 dev-volume 이라는 이름으로 지정 합니다.
- spec.template.spec.volumes → 위에 작성한 컨테이너에서 사용할 볼륨 마운트 이름(dev-volume)을 가져오고, 이 정보와 연결 요청을 보낼 pvc를 2번에서 생성한 dev-pvc로 지정 합니다.
kubectl exec -it [pod name] bash을 입력하여 확인하면 정상적으로 test.log 디렉토리가 생성 되었으며 touch test1 파일을 생성하거나 app.log에 아무 데이터를 넣어 줍니다. Pod가 실행중인 노드로 이동하여 /tmp/log_backup 디렉토리 안에 정상적으로 test1 파일이 생성 된것을 확인할 수 있으며, app.log에 데이터가 입력되었을 경우 입력된 데이터도 확인될 것 입니다.