Search
Duplicate
📒

[Kubernetes Infra] 05-1. PV, PVC

상태
완료
수업
Kubernetes Infra
주제
연관 노트
3 more properties
참고

쿠버네티스 볼륨

NOTE
도커 컨테이너와 마찬가지로, 쿠버네티스도 파드 내의 데이터를 영구적으로 사용하기 위해서 볼륨을 생성해 파드와 연동할 수 있다!
Volume을 연결하는 방법
apiVersion: v1 kind: Pod metadata: name: random number generators labels: name: random number generators spec: containers: - name: random number generators image: alpine command: ["/bin/sh", "-c"] args: ["shuf -i 0-100 -n 1 >> /opt/number.out;"] volumeMounts: # 볼륨지정 - mountPath: /opt name: data-volume volumes: # 볼륨생성 - name: data-volume hostPath: path: /data type: Directory
YAML
복사
호스트 경로
위와같은 방식으로 구성하면, 노드가 여러개로 구성된 경우 문제가된다.
쿠버네티스는 hostPath에 기입한 /data 경로가 여러 노드에 존재하는 것이 아닌 단 1개만 존재하는것으로 여기기 떄문이다.
쿠버네티스에서는 위와 같은 문제를 해결하기 위해서 외부 스토리지 솔루션을 사용한다.
ex) AWS EBS, NFS, S3, Ceph …
이러한 외부 스토리지 시스템은 CSI 플러그인을 사용한다.

외부 스토리지 솔루션

NOTE
apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: myfrontend image: nginx volumeMounts: - mountPath: "/var/www/html" name: mypd volumes: - name: data-volume awsElasticBlockStore: # ...
YAML
복사
EBS 사용방법
쿠버네티스는 다양한 스토리지 솔루션으로 이러한 문제를 해결할 수 있다.
이외에도 NFS, GlusterFS, Flocker 등이 존재한다.

반영구 저장기법(Pod와 동일 라이프사이클)

NOTE
apiVersion: v1 kind: Pod metadata: name: redis spec: containers: - name: redis image: redis volumeMounts: - name: redis-storage mountPath: /data/redis volumes: - name: redis-storage emptyDir: {}
YAML
복사
반영구 저장기법(emptyDir)
emptyDir 볼륨은 파드가 할당될때 생성되고, 파드가 종료될때까지 지속된다.
해달 볼륨은 파드내의 모든 컨테이너가 접근가능하고, 파드가 살아있는동안만 유지된다.
해당 코드에서는 /data/redis경로에 호스트머신이 아닌, 임시 저장공간을 사용하는개념

퍼시스턴트 볼륨 & 클레임

NOTE
ConfigMap처럼 volume을 직접 spec에 정의하면 관리하기가 매우 까다로워지므로 YAML에 따로 정의하는 방식을 지원한다!
PV와 PVC를 통해서 볼륨을 따로 정리한다.
모든 볼륨을 각 Pod의 volume mount에 명시하는건 Pod가 많아질수록 비효율적이다.
ex) pod의 볼륨을 수정해야 한다면, 모든 Pod의 YAML을 수정해야 한다.
이러한 문제를 해결하기 위해서 volume을 따로 관리한다!

PV(퍼시스턴트 볼륨)

NOTE
PV ⇒ 볼륨 자체 (클러스터 안에서 자원으로 다룬다, 관리자가 생성)
apiVersion: v1 kind: PersistentVolume metadata: name: pv-name spec: capacity: # 볼륨의 저장용량 storage: 5Gi accessModes: # 접근모드(ReadWriteOnce는 단일노드에서 읽기-쓰기 마운트 가능) # ReadOnlyMany | ReadWriteOnce | ReadWriteMany - ReadWriteOnce persistentVolumeReclaimPolicy: Retain # 클레임에서 해제된 후 수행할 작업 (Retain은 유지) storageClassName: standard # 클러스터에서 사용할 스토리지 이름 hostPath: # 호스트 노드의 디렉토리 지정(hostPath이외에, nfs, awsElasticBlockStore 등 가능) path: /path/to/storage
YAML
복사
capacity: 볼륨의 저장용량
accessMode: 접근모드
persistentVolumeReclaimPolicy: 클레임에서 해제된 후 수행할 작업
storageClassName: 클러스터에서 사용할 스토리지 이름(스토리지 유형과 정책에 쓰인다.)
hostPath: 볼륨타입의 종류중 하나.

PV 타입종류

임시: emptyDir
로컬: host Path, local
원격: persistentVolumeClaim, cephfs, cinder, nfs, …
특수 목적: configMap, secret …
클라우드: awsElasticBlockStore, azureDisk

PVC(퍼시스턴트 볼륨 클레임)

NOTE
PVC는 사용자(개발자)가 스토리지를 이용하기 위해 생성하는 것이다.
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: myclaim spec: accessModes: - ReadWriteOnce # 원하는 모드 resources: # 원하는 스펙 requests: storage: 500Mi
YAML
복사
500M을 ReadWriteOnce 방식으로 사용할 수 있는 PV를 달라
apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: myfrontend image: nginx volumeMounts: - mountPath: "/var/www/html" name: mypd volumes: - name: mypd persistentVolumeClaim: claimName: myclaim
YAML
복사
Pod에서 pv claim을 통해 볼륨을 요청한다.

PV와 PVC의 생명주기

NOTE
PV, PVC의 생명주기
1.
프로비저닝
PV를 만드는 단계를 의미한다.
프로비저닝에는 2가지 방법이 존재한다.
PV를 미리 만들어 두고 사용한다 (정적)
요청이 있을 때 마다 PV를 만든다. (동적)
2.
바인딩
프로비저닝으로 만든 PV를 PVC와 연결하는 단계
PV - PVC의 매핑은 1대1 관계이다.
PVC에서 원하는 스토리지의 용량과 접근방법을 명시해서 요청하면 거기에 맞는 PV가 할당된다.
이때 PVC에서 원하는 PV가 없다면 요청은 실패한다. (하지만 PVC는 PV가 생길 때까지 대기하다가 바인딩한다.)
3.
사용
PVC는 Pod에 설정되고 PVC를 볼륨으로 인식해서 사용한다.
사용중인 PVC는 삭제가 불가능하다.
4.
반환
사용이 끝난 PVC는 삭제되고, PVC를 사용하던 PV를 초기화(reclaim)하는 과정을 거친다.
초기화 정책에는 Retain, Delete, Recycle이 있다.