본문 바로가기
Kubernetes/Kubernetes Based

Kubernetes HostPath, emptyDir, PV, PVC, StorageClass

by 썩석 2024. 3. 21.
반응형

이번 스터디 주제는 쿠버네티스에서 데이터를 저장할 때 사용하는 볼륨에 대해 알아보려고 한다.

 

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 #뒤에 설명

 

  1. capacity: PV를 사용할 용량, 추후에 PVC를 생성할 때 이 용량보다 작으면 안 된다.
  2. accessModes: PV에 접근할 수 있는 모드 선택
    1. ReadWriteOnce(RWO): 하나의 Pod만 접근 가능하며 읽고 쓰기 가능
    2. ReadOnlyMany(ROX): 여러 개의 Pod가 접근 가능하며 읽기만 가능
    3. ReadWriteMany(RWX): 여러개의 Pod가 접근 가능하며 읽고 쓰기 가능
  3. persistentVolumeReclaimPolicy: 반환정책
    1. Retain: PVC가 삭제되더라도 PV는 존재
    2. 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를 사용할 시에는 별도의 프로비저너 배포 필요

 

반응형