☸️ Kubernetes

[kubernetes] PV, PVC를 Pod에 연결하기

loose 2023. 11. 30. 20:16
반응형

Pod에서 Volume을 다루는 이유

 

쿠버네티스 컨테이너 서버에서 로그가 생성된 경우 해당 기록을 따로 밖으로 빼내지 않는 이상 컨테이너가 종료되면 로그도 같이 삭제된다. 그렇기에 Volume이라는 외부 저장소를 연결하여 로그 기록을 따로 저장할 수 있다.(도커 볼륨의 이유와 같다)

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mycontainer
    image: myimage
    volumeMounts:
    - name: myvolume
      mountPath: /app/data
  volumes:
  - name: myvolume
    hostPath:
      path: /tmp/data
      type: Directory

 

volumeMounts의 mountPath는 컨테이너 서버의 경로를 뜻한다.

volumes의 hostPath는 호스트 파일 시스템의 경로를 뜻한다.

즉, 컨테이너 경로 /app/data에 데이터가 쌓이면 호스트 경로 /tmp/data에서 똑같은 백업 데이터가 쌓인다.

 

PV(Persistent Volume),  PVC(Persistent Volume Claim)가 필요한 이유

위와 같이 단순하게 파드의 컨테이너와 호스트 파일 시스템을 연결해서 사용할 수도 있다.

하지만 PV를 사용하는 이유는 여러 파드가 하나의 Volume을 사용할 수 있도록 도와줄 수 있으며 해당 Volume에 대한 접근 모드(Access Modes)와 같은 여러 편의 옵션들을 제공해주기 때문이다.

PV는 Pod와 직접적으로 연결되지 않으며 PVC가 중간 다리 역할을 해준다.
PVC
파드와 PV 격리를 제공하므로 파드 스토리지 충돌 방지를 도와주고 유연하게 사용하도록 도와주는 역할을 담당한다.

 

 

PV,  PVC 생성

약 1Gi 용량을 할당한 PV 부터 만들어보자.(참고로 hostPath는 프로덕션 환경에서는 사용하지 않는다.)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /stir
accessMode에 대해서 설명하자면 ReadWriteOnce, ReadOnlyMany, ReadWriteMany가 설정이 가능하다.

RWO - 하나의 파드에 의해 읽기 및 쓰기 작업을 위해 사용된다.
ROX - 여러 파드에 의해 읽기 작업을 위해 사용되고 한번에 하나의 파드만 쓰기 작업을 위해 사용한다.
RWX - 여러 파드에 의해 읽기 및 쓰기 작업을 위해 사용된다. 
persistentVolumeReclaimPolicy는 PV가 지워질 때 해당 Volume을 어떻게 관리할 것인지에 대한 설정이다.
Default 값은 Retain이다.

Retain - PV가 삭제되더라도 Pod가 사용중이라면 유지한다. 유지되고 있는 PV는 다른 PVC에 의해 할당되지 않는다.
Delete - PV가 삭제되면 Pod가 사용중이더라도 삭제한다.
Recycle - PV가 삭제되면 다른 PVC에 의해 할당될 수 있다.

Retain 상태에서 PVC나 PV를 실행 도중에 delete 해보면 즉시 종료되지 않고 Terminating 상태로 유지되는 것을 확인할 수 있다.

 

이제 Pod와 직접적으로 연결할 PVC를 만들어보자.,

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

 

 

 

PVC 파일 내부를 보면 특정 PV를 지정하진 않는다.

PVC를 만들면 적절한 PV를 가져와서 1대 1로 할당한다.
즉, PVC의 request 용량이나 accessModes를 PV의 설정과 일치시켜야 할당이 된다.

만약 PVC에서 사용 가능한 PV가 없다면 pending 상태로 남는다.(k get pvc)

만약에 원하는 PVC에 원하는 PV 할당하고 싶다면 label을 할당해야한다.

위 2개를 만들고나면 PVC가 PV에 바인딩 된다.

확인 방법은 k get pv 요청 시 Bound 상태로 변한다. Bound 상태가 아닌 경우 사용할 수 없다.

 

PV,  PVC와 Pod 연동하기

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: my-pvc
      mountPath: /usr/share/nginx/html
  volumes:
  - name: my-pvc
    persistentVolumeClaim:
      claimName: my-pvc

 

Pod에 volumes 설정 부분에 이젠 hostPath가 아닌 PV가 연결되었다.

k exec -it nginx -- /bin/sh

 

위 명령어로 nginx 파드에 들어가서 /usr/share/nginx/html 로 들어가서 파일 하나를 생성해보자.

그럼 위의 PV yaml 파일에서 지정한 hostPath로 파일이 저장되는 것을 확인할 수 있다.


만약에 PVC 상태가 Bound 상태가 아니라면 Pod는 PVC를 찾을 수 없어 Pod가 실행되지 않는다.

728x90