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"}}}' |