kubernetes volume
03 May 2019
사용 가능한 볼륨
emptyDir 볼륨
-
일시적인 데이터를 저장하는 데 사용되는 비어있는 단순한 디렉터리
-
볼륨의 수명이 포드와 연관되어 있기 때문에 포드를 삭제하면 볼륨의 내용이 손실됩니다.
-
동일한 포드에서 실행 중인 컨테이너 간에 파일을 공유할 때 특히 유용합니다.
apiVersion: v1
kind: Pod
metadata:
name: fortune
spec:
containers:
- image: luksa/fortune
name: html-generator
volumeMounts:
- name: html
mountPath: /var/htdocs
- image: nginx:airpline
name: web-server
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
ports:
- containerPort: 80
protocol: TCP
volumes:
- name: html
emptyDir: {}
gitRepo 볼륨
- volume이 생성될 때 git repository에서 emptyDir volume으로 파일을 복제합니다.
- gitRepo 볼륨은 생성된 후에는 참조하는 repo와 동기화되지 않습니다. => 레플리케이션컨트롤러가 관리하는 경우 포드를 삭제하면 새 포드가 만들어지고 새 포드의 볼륨에 최신 커밋이 포합됩니다.
apiVersion: v1
kind: Pod
metadata:
name: gitrepo-volume-pod
spec:
containers:
- image: nginx:alpine
name: web-server
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
ports:
- containerPort: 80
protocol: TCP
volumes:
- name: html
gitRepo:
repository: <git url>
revigion: master # master 브랜치로 체크아웃
directory: .
hostPath 볼륨
- 노드의 파일 시스템에 있는 특정 파일 또는 디렉터리를 가리킵니다.
영구 스토리지 사용
apiVersion: v1
kind: Pod
metatdata:
name: mongodb
spec:
volumes:
- name: mongodb-data
# gcePersistentDisk: # GCE 영구 스토리스 사용
# pdName: mongodb
# fsType: ext4
awsElasticBlockStore: # AWS EBS 사용
volumeId: my-volume
fsType: ext4
containers:
- image: mongo
name: mongodb
volumeMounts:
- name: mongodb-data
mountPath: /data/db
ports:
- containerPort: 27017
protocol: TCP
...
volumes:
- name: mongodb-data
nfs: # NFS 사용
server: 1.2.3.4
path: /some/path
...
PersistentVolume and PersistentVolumeClaim
- 애플리케이션이 인프라 세부 사항을 처리하지 않고도 쿠버네티스 클러스터의 스토리지를 요청할 수 있도록합니다.
- 시스템 관리자가 실제 물리 디스크를 생성한 후에, 이 디스크를 PersistentVolume이라는 이름으로 쿠버네티스에 등록한다. 개발자는 Pod를 생성할때, 볼륨을 정의하고, 이 볼륨 정의 부분에 물리적 디스크에 대한 특성을 정의하는 것이 아니라 PVC를 지정하여, 관리자가 생성한 PV와 연결한다.
출처: https://bcho.tistory.com/tag/PersistentVolumeClaim [조대협의 블로그]
apiVersion: v1
kind: PersistentVolume
metatdata:
name: mongo-pv
spec:
capacity:
storage: 1Gi
accessModes: # 단인 클라이언트가 읽기 및 쓰기용으로 마운트하거나 여러 클라이언트가 읽기 전용으로 마운트할 수 있음
- ReadWriteOnce # RWO
- ReadOnlyMany # ROX
# - ReadWirteMany # RWX
persistentVolumeReclaimPolicy: Retain # claim이 해제된 후에는 PersistentVolume을 삭제하거나 삭제된 상태로 유지
gcePersistentDisk:
pdName: mongodb
fsType: ext4
apiVersion: v1
kind: PersistentVolumeClaim
metatdata:
name: mongodb-pvc
spec:
resources:
requests:
storage: 1Gi # 스토리지의 1Gib 요청
accessModes:
- ReadWriteOnce
storageClassName: "" # 빈 문자열을 스토리지 클래스 이름으로 정정하면 PVC가 새 문자열을 동적으로 프로비저닝하는 대신 사전 프로비저닝된 PV에 바인딩합니다. => 빈 문자열로 설정하지 않으면 동적 볼륨 프로비저너가 미리 준비된 PersistentVolume이 있음에도 새 PersistentVolume을 프로비저닝합니다.
PersistentVolumes
binds are exclusive, and sincePersistentVolumeClaims
are namespaced objects, mounting claims with “Many” modes (ROX
,RWX
) is only possible within one namespace.
# pod에서 pvc 정의
apiVerison: v1
kind: Pod
metadata:
name: mongodb
spec:
volumes:
- name: mongodb-data
persistentVolumeClaim:
claimName: mongodb-pvc # 포드 볼륨에서 PVC이름으로 접근
containers:
- image: mongo
name: mongodb
volumeMounts:
- name: mongodb-data
mountPath: /data/db
ports:
- containerPort: 27017
protocol: TCP
StorageClass 리소스
- PersistentVolumeClaim이 스토리지클래스를 요청할 때 PersistentVolume을 프로비저닝하는 데 사용합니다.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
provisioner: kubernetes.io/gce-pd # PersistentVolume프로비저닝에 사용할 볼륨 플러그인
parameters: # 제공자에게 전달될 먀갸 변수
type: pd-ssd
zone: europe-west1-b
# storage class를 사용하는 pvc 생성
apiVersion: v1
kind: PersistentVolumeClaim
metatdata:
name: mongodb-pvc
spec:
storageClassName: fast
resources:
requests:
storage: 1Gi # 스토리지의 1Gib 요청
accessModes:
- ReadWriteOnce