참고
쿠버네티스 볼륨
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이 있다.