Cloud/Docker & Kubernetes

PV, PVC

DGO 2023. 5. 24. 01:45

쿠버네티스에서 파드는 언제든 생성되고 지워진다.

 

하지만 파드에서 생성한 내용을 기록하고 보관하거나 모든 파드가 동일한 설정 값을 유지하고 관리하기 위해 공유된 볼륨으로 부터 값을 가져올 수 있도록 설정해야 할 때도 있다.

 

따라서 파드의 생명주기와 무관하게 저장이 유지되는 데이터 저장소가 필요한데 이런 요구사항을 만족하기 위한 개념이 PV(PersistentVolume)와 PVC(PersistentVolumeClaim)이다.

 

PV는 데이터를 저장할 볼륨을 생성하고 사용할 수 있게 준비하는 것이고 PVC는 사용자가 PV를 사용할 수 있게 요청하는 것이라고 할 수 있다.

 

PV,PVC를 사용하는 이유는 PV, PVC를 사용하지 않고 파드에 네트워크 볼륨과 같은 스토리지를 직접 마운트 해서 사용한다면 스토리지의 변화에 따라 파드에 직접적인 영향을 미칠 가능성이 있다.

 

네트워크 볼륨을 파드에 마운트 하려면 IP나 호스트를 지정해야하는데 네트워크 볼륨의 IP나 호스트가 변경되면 파드에 문제가 발생 할 수 있기 때문이다.

 

그렇기 때문에 PV, PVC를 생성하여 중계자 역할로 사용한다.

 

PV로 볼륨을 선언할 수 있는 타입은 아래와 같으며 가장 구현하기 쉬운 NFS 볼륨 타입으로 PV와 PVC를 생성해본다.

 

 

우선 PV로 NFS 볼륨을 프로비저닝 하려면 NFS 서버를 마스터 노드에 구성하여야 한다.

 

nfs 서버를 구성하려면 nfs-utils 패키지가 필요하며 해당 패키지가 없으면 yum install nfs-utils 명령어로 패키지를 우선 설

 

치한다.

 

nfs_shared 폴더를 생성하고 해당 폴더를 공유 디렉토리로 설정하기 위해 /etc/exports 설정 파일에 등록한다.

 

mkdir /nfs_shared
echo '/nfs_shared 192.168.1.0/24(rw,sync,no_root_squash)/' >> /etc/exports

rw: 읽기, 쓰기 권한
sync: 쓰기 발생시 동기화
no_root_sqaush : root 권한으로 공유 디렉토리 접근 가능 설정

 

설정이 완료되면 NFS 서버를 활성화하고 다음에 시작할 때 자동으로 적용되도록 systemctl enable --now nfs를 실행한다.

 

 

PV를 아래의 오브젝트 스펙으로 생성하고 kubectl get pv 명령어로 확인한다.

 

#nfs-pv.yaml#

apiVersion: v1
kind: PersistentVolume	// PV
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 100Mi	// 스토리지 용량 지정
  accessModes:
    - ReadWriteMany	// PV의 사용 방식 설정으로 ReadWriteMany(여러 개의 노드가 읽고 쓸 수 있도록 마운트)
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: 192.168.1.10
    path: /nfs_shared

 

 

PV의 상태가 Available임을 확인하고 아래의 오브젝트 스펙으로 PVC를 생성한다.

 

#fs-pvc.yaml#

apiVersion: v1
kind: PersistentVolumeClaim	// PVC
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Mi

 

PVC를 생성하고 kubectl get pvc, pv를 실행하면 아래와 같이 상태가 Available에서 Bound(연결됨)으로 상태가 변화한 것

 

을 알 수 있다.

 

 

이제 PV와 PVC를 생성했으니 해당 PVC를 사용하는 파드를 아래의 디플로이먼트 오브젝트 스펙으로 생성한다.

 

sysnet4admin/audit-trail 이미지로 파드를 생성하며 해당 컨테이너 이미지는 접속 정보를 /audit 디렉토리에 로그를 기록한

 

다.

 

#nfs-pvc-deploy.yaml#

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-pvc-deploy
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nfs-pvc-deploy
  template:
    metadata:
      labels:
        app: nfs-pvc-deploy
    spec:
      containers:
      - name: audit-trail
        image: sysnet4admin/audit-trail	// sysnet4admin/audit-trail 이미지를 사용
        volumeMounts:			// 볼륨이 마운트 될 위치(/audit)를 지정
        - name: nfs-vol
          mountPath: /audit
      volumes:				// PVC로 생성된 볼륨을 가져오기 위해 이전에 생성한 PVC인 nfs-pvc를 지정
      - name: nfs-vol
        persistentVolumeClaim:
          claimName: nfs-pvc

 

 

파드가 생성되었으면 kubectl exec 명령어로 임의의 파드에 접속하여 PVC가 정상적으로 마운트 되었는지 확인한다.

 

 

파드의 기능을 테스트하기 위해 외부에서 접속할 수 있도록 expose 명령으로 로드밸런서 서비스를 생성하고 브라우저에

 

서 접속한다.

 

브라우저 접속후 exec로 접속한 파드에서 audit 디렉토리에 접속 로그가 남았는지 확인한다.

 

 

이후 scale 명령을 사용하여 4개였던 파드를 8개로 늘리고 브라우저에 다시 접속해 다른 파드 이름과 IP가 표시되는지 확

 

인한다.

 

 

새롭게 생성된 임의의 파드에 접속하여 새로운 접속 로그와 기존 로그가 있는지 확인한다.

 

공유 볼륨을 사용하였기 때문에 기존 로그도 남아있는 것을 알 수 있다.

 

 

추가로 만약 사용자와 관리자가 동일한 단일 시스템이라면 PV, PVC를 사용할 필요가 없으므로 기존 코드에서 volumes 부

 

분을 아래와 같이 수정하여 생성했던 nfs서버에 직접 마운트 하는 것도 가능하다.

 

      volumes:
      - name: nfs-vol
        nfs:
        server: 192.168.1.10
        path: /nfs_shared