이번 스터디 주제는 쿠버네티스에서 데이터를 저장할 때 사용하는 볼륨에 대해 알아보려고 한다.
emptyDir
- Pod가 생성될 때 임시적으로 사용하는 볼륨
- Pod가 삭제하면 동시에 볼륨도 영구삭제되기 때문에 주의
- 1개의 Pod에 Multi Container가 있을 때 사용되며 container 간 데이터 공유
- 대규모 데이터 세트를 정렬할 때에는 비효율적
apiVersion: v1
kind: Pod
metadata:
name: fortune
spec:
containers:
- image: luksa/fortune
name: html-generator #Container2 이름
volumeMounts:
- name: html
mountPath: /var/htdocs #Volume Mount 위치
- image: nginx:alpine
name: web-server #Container2 이름
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html #Volume Mount 위치
readOnly: true
ports:
- containerPort: 80
protocol: TCP
volumes:
- name: html
emptyDir: {}
출처 - Kubernetes in action Github(https://github.com/luksa/kubernetes-in-action)
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: https://github.com/luksa/kubernetes-in-action.git #github 주소
revision: master
directory: .
git Repo를 volume으로 붙일수 있다. 단점으로는 gitRepo에 변경이 생길 시 재배포를 해야 함.
hostPath
- 노드의 디렉터리나 파일을 컨테이너의 마운트 => 노드와 데이터 공유
- 노드 기준으로 파일을 생성 및 쓰기, Pod는 읽기 전용
- Pod가 재생성되고 다른 노드에서 실행됐을 경우 데이터가 달라질 수 있음
- 쿠버네티스 공식 문서에서도 최대한 안 쓰는 것을 권장
Node01의 hostPath 경로에 있는 파일과 Node02의 hostPath 경로에 있는 파일이 다르면
Node01에 있는 Pod1이 삭제되어 Node2로 이동했을 때 Pod에 Mount 되어 있는 내용이 다르다.
기존과 동일하게 만들려면 수동으로 동기화해야 한다.
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
# 호스트의 디렉터리 위치
path: /data
# 이 필드는 선택 사항이다
type: Directory
hostPath 샘플 yaml
출처 - 쿠버네티스 공식문서(https://kubernetes.io/ko/docs/concepts/storage/volumes/#hostpath)
PV(Persistent Volume)
- 스토리지 백엔드(NFS, AWS EBS, Google Cloud Disk 등)와 클러스터의 연결고리
- 클러스터의 자원이기 때문에 네임스페이스가 구분되지 않음
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv
spec:
capacity:
storage: 1Gi #1) 사용할 용량
volumeMode: Filesystem
accessModes: #2)접근모드
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain #3) 반환정책
storageClassName: standard
nfs: #nfs 사용할 경우에만 사용
path: /path/to/nfs/volume
server: nfs-server.example.com
출처 - https://kubernetes.io/ko/docs/concepts/storage/persistent-volumes/
PVC(Persistent Volume Claim)
- 클러스터와 Pod 간의 연결고리며 데이터가 저장되는 곳
- PVC가 생성될 때마다 스토리지 백엔드의 자원이 생성
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: example-pvc
spec:
accessModes:
- ReadWriteOnce #2) 접근모드
resources:
requests:
storage: 1Gi #1) 사용할 용량
storageClassName: standard #뒤에 설명
- capacity: PV를 사용할 용량, 추후에 PVC를 생성할 때 이 용량보다 작으면 안 된다.
- accessModes: PV에 접근할 수 있는 모드 선택
- ReadWriteOnce(RWO): 하나의 Pod만 접근 가능하며 읽고 쓰기 가능
- ReadOnlyMany(ROX): 여러 개의 Pod가 접근 가능하며 읽기만 가능
- ReadWriteMany(RWX): 여러개의 Pod가 접근 가능하며 읽고 쓰기 가능
- persistentVolumeReclaimPolicy: 반환정책
- Retain: PVC가 삭제되더라도 PV는 존재
- Delete: PVC가 삭제되면 PV도 같이 삭제
Storage Class
PV/PVC를 사용할 때마다 사용자는 PVC만 만들어서 사용하면 되고, 운영자는 PV를 생성해야만 하는 번거로움이 있기에 보완하고자 동적 프로비저닝해주는 StorageClass가 등장
StorageClass를 생성하고 PVC에 Storageclass 이름을 지정하여 생성
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: slow
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-standard
fstype: ext4
replication-type: none
출처 - https://kubernetes.io/ko/docs/concepts/storage/storage-classes/
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: block-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: slow
출처 - https://kubernetes.io/docs/concepts/storage/persistent-volumes/
yaml을 실행하면 GCP PD에 10Gi volume이 생성
※ AWS, Google, Azure, OpenStack Cinder 등은 쿠버네티스 내부 프로비저너가 있지만 이외의 Storage를 사용할 시에는 별도의 프로비저너 배포 필요
'Kubernetes > Kubernetes Based' 카테고리의 다른 글
테라폼(Terraform)을 활용해 GKE Pod 배포 (0) | 2024.03.06 |
---|---|
ubuntu/windows 테라폼 설치 (1) | 2024.02.27 |
2024년 2월 쿠버네티스 자격증 CKA 후기(M1 맥북 에어로 시험) (0) | 2024.02.13 |