Kubernetes

K8S Volume

모이스쳐라이징 2021. 10. 6. 00:15

1. k8s Volume이란

  • k8s에서 사용하는 외장 디스크의 개념
  • pod가 가동될때 컨테이너에 마운트해서 사용함
  • k8s에서 사용하는 volume은 기능별로 PV, PVC, StorageClass가 존재함

 

2. PV(Persistent Volume) 종류

임시 볼륨 로컬 볼륨 네트워크 볼륨 네트워크 볼륨(클라우드)
emptyDir  hostpath
local 
iSCSI
NFS
cephFS
glusterFS
gcePersistentDisk
awsEBS
azureFile
...

 

2.1 emptyDir

  • Pod가 생성될때 생성되고, Pod가 삭제 될때 같이 삭제되는 임시 볼륨임
  • 추가적인 설정을 통해 물리 디스크 혹은 메모리에 저장될 수 있음

    volumeMounts:
    - name: shared-storage
      mountPath: /data/shared
  volumes:
  - name : shared-storage
    emptyDir: {}

 

 

2.2 hostpath

  • 노드의 로컬 디스크의 경로를 Pod에 마운트해서 사용함
  • 여러 Pod가 해당 디스크를 공유해서 사용가능 함

    volumeMounts:
    - name: stress-volume
      mountPath: /data/shared
  volumes:
  - name : stress-volume
    hostPath:
      path: /tmp
      type: Directory

 

2.3 gitRepo

  • 지정된 git 리파지토리의 특정 revision 내용을 clone을 이용해서 내려 받은후에 디스크 볼륨을 생성하는 방식
  • 물리적으로는 emptyDir이 생성되고, git 레파지토리 내용을 clone으로 다운 받는다.

  volumeMounts:
  - name: html
    mountPath: /usr/share/nginx/html
    readOnly: true
  ports:
  - containerPort: 80
    protocol: TCP
volumes:
- name: html
  gitRepo:
       repository: https://github.com/luksa/kubia-website-example.git
       revision: master
       directory: .

 

3. PV (Persistent Volume) , PVC (Persistent Volume Claim)

  • Static Volume Provisioning 방식
  • 물리적 디스크에 대한 이해도가 높지 않아도 쉽게 디스크를 사용할 수 있음
  • 실제 물리 디스크가 활성화 되어 있다면, Persistent Volume를 통해 k8s에 등록해서 사용 가능함
  • Pod를 생성할때 볼륨을 활성화 및 설정하고, PVC에 대한 정보를 기입함
  • 정상적인 배포 방식이라면, PVC와 PV를 배포해서 Bound를 확인하고, 이후에 Pod를 배포 함
  • Pod를 삭제한다고 해서 PV와 PVC가 삭제 되지 않으니 직접 삭제해야함

apiVersion: v1
kind: PersistentVolume
metadata:
  name: stress-pv
  labels:
    name: stress-pvc                               # pvc 설정
spec:
  capacity:                                           # 용량 정의
    storage: 5Gi
  accessModes:                                     # 읽고 쓰는 권한 설정
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete     # 볼륨 사용이 끝나면 어떻게 관리할지에 대한 설정
  nfs:                                                  # nfs 엔드포인트 설정
    server: ${nfs-server-ip}
    path: /mnt/volume/stress

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: stress-pvc
spec:
  storageClassName: ""
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      name: stress-pvc

 

 

4. SC (StorageClass)

  • Dynamic Volume Provisioning 방식
  • Static으로 구성해오다 Dynamic을 쓰면 처음엔 충격적이고, 정말 편함
  • PV를 따로 배포할 필요 없이 PVC만 StorageClass를 바라보게 해서 배포하면 PV는 동적으로 생기는 구조
  • StoraeClass를 사용하기 위해선 cluster에 provisioner를 설치해야함

 

 

 

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-csi
  namespace: test
provisioner: nfs.csi.k8s.io
parameters:
  server: ${nfs volume ip}
  share: ${mount path}
reclaimPolicy: Retain  # only retain is supported
volumeBindingMode: Immediate
mountOptions:
  - hard
  - nfsvers=4.1

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: stress-pvc
  namespace: test
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: nfs-csi

 

4.1 StorageClass default 설정

처음 생성하면 default로 지정되지만 이후 다른 SC를 default로 지정해야할 경우 사용

[default 해제]
kubectl patch storageclass nfs-csi -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

[default 등록]
kubectl patch storageclass nfs-csi -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'