k8s/CKA

따배씨 / persistent volume

부엉이사장 2024. 10. 20. 20:32
Introduction
개념은 자세히 안적고 대충 persistent volume이랑 persistent volume claim, 이 둘을 사용하는 pod의 관계를 알아야 한다.
간단한 테스트 코드를 직접 쳐보며 그림으로 설명하겠다.

 

Summary
  • pv, pvc, pod관계를 알아봐야함.
  • pvc가 만들어지는순간 pv랑 pvc가 둘다 bound가 되어야 한다.
  • 공식문서에서는 nfs쓰는데 시험은 보통 hostPath타입되므로 volume부분을 따로 복붙해와서 써야한다.
  • storage class는 식별자같은거임. 
  • volumeMode: Block 이건 쓰지마샘. 계속 pending상태됨.
export samp="--dry-run=client -o yaml"
export now="--force --grace-period 0"

 

$samp, $now붙은건 이 명령어로 약어만든거니까 주의

 

 

Kubectl Reference Docs

 

kubernetes.io

 

 


 

 


# persistent volume

이렇게 persistent volume을 두개 만들었다.

persistent volume은 가상의 볼륨? 이런 느낌인데, 이 볼륨을 리소스들, pod들이 사용할 수 있다.

 

코드로 각각 보면

apiVersion: v1
kind: PersistentVolume
metadata:
  name: muzzi-pv
spec:
  storageClassName: "muzzi"
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /home/user/k8s/html-pv
apiVersion: v1
kind: PersistentVolume
metadata:
  name: dori-pv
spec:
  storageClassName: "dori"
  capacity:
    storage: 500Mi
  accessModes:
    - ReadWriteOnce
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /home/user/k8s/html-pv

그냥 단순하게 hostPath타입으로 볼륨을 만들어준 pv를 사용했음.

reclaim정책은 retain, delete등이 있는데, retain은 pv다써도 안에 자료들이 남겨지는거고, delete는 걍 다 삭제해주는거다.

recycle은 공식문서에서 더이상 쓰지말란다.

 

각각 pv를 생성해주면, 

kubectl get pv

muzzi, dori pv가 잘 만들어진걸 볼 수 있다.

 

 

 

 

 

# persistent volume claim

claim은 주장? 뭐 이런건데

일단 pvc를 만들면 조건에 맞는 볼륨이랑 bound를 해준다.

저중에서 맞는건 muzzi-pv랑 bound될거임

 

코드로 보면

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 800Mi
  storageClassName: muzzi

이렇다.

이걸 만들어주면,

pvc가 bound됐다고 나오고, pv도 적절한 muzzi pv가 bound된걸 확인 할 수 있다.

 

 

# pod에서 persistent volume 사용하기

 

이제 pod에서 volume을 pvc를 사용한다고 하면 pod의 볼륨이 pvc가 bound된 pv를 사용하게 된다.

apiVersion: v1
kind: Pod
metadata:
  name: web
spec:
  containers:
    - name: web
      image: nginx
      volumeMounts:
      - mountPath: "/usr/share/nginx/html"
        name: mypd
  volumes:
    - name: mypd
      persistentVolumeClaim:
        claimName: myclaim

뭐 이런식으로 생겼다.

참고로 난 nginx웹서버를 테스트할거라서 저렇게 mount path를 설정해주었다.

yaml로 pod를 만들어준 후, curl로 확인해보면

이렇게 forbidden이 뜬다.

 

아까 pv가 hostpath 타입이고 경로가  

  hostPath:
    path: /home/user/k8s/html-pv

이랬으므로.. worker1노드에서 해당경로에 index.html파일을 만들어줘보자.

 

 

worker1노드로 가서 해당경로에 index.html파일을 임의로 만들어주고

curl을 다시 쳐보면

mount가 제대로 된걸 확인 할 수 있음.

 

 

 

# 삭제한다면?

먼저 pvc는 삭제하더라도 해당 pvc를 사용하는 pod가 있으면 삭제되지 않는다.

때문에 먼저 pod를 삭제한 후, pvc를 삭제해야 정상적으로 pvc가 삭제된다.

그리고나서 pv를 체크해보면 bound였던 status가 released가 된다.

reclaim정책이 retain이라서 그런가봄.