Kubernetes

Kubernetes 기초 - Storage(4)

사실 나도 모름 2024. 1. 22. 23:47
  1. Volumes
  2. Persistent Volumes(PV)
  3. Projected Volumes
  4. Ephemeral Volumes                 ←  오늘 볼 내용
  5. Storage Classes

4. Ephemeral Volumes(임시 볼륨)

https://kubernetes.io/ko/docs/concepts/storage/ephemeral-volumes/

 

임시 볼륨

이 문서는 쿠버네티스의 임시(ephemeral) 볼륨 에 대해 설명한다. 쿠버네티스 볼륨, 특히 퍼시스턴트볼륨클레임(PersistentVolumeClaim) 및 퍼시스턴트볼륨(PersistentVolume)에 대해 잘 알고 있는 것이 좋다.

kubernetes.io

 

 

애플리케이션이 실행될 때 모든 데이터가 영구적으로 저장될 필요가 없다.

재시작할 때 일부 데이터가 사라진대도 별 신경쓰지 않는 경우도 있다.

이러한 임시 볼륨에 대해 알아보자.

 

쿠버네티스에서는 다양한 임시 볼륨을 지원한다.

  • emptyDir : 파드가 시작될 때 빈 상태로 시작되며, 저장소는 로컬의 kubelet 베이스 디렉터리(보통 루트 디스크) 또는 램에서 제공된다.
  • configMap, downwardAPI, secret : 각 종류의 쿠버네티스 데이터를 파드에 주입한다.
  • CSI 임시 볼륨 : 앞의 볼륨 종류와 비슷하지만, 특히 이 기능을 지원하는 특수한 CSI 드라이버에 의해 제공된다.
  • 일반(generic) 임시 볼륨 : 퍼시스턴트 볼륨도 지원하는 모든 스토리지 드라이버에 의해 제공될 수 있다.

 

 

 

emptyDir

https://kubernetes.io/ko/docs/concepts/storage/volumes/#emptydir

 

볼륨

컨테이너 내의 디스크에 있는 파일은 임시적이며, 컨테이너에서 실행될 때 애플리케이션에 적지 않은 몇 가지 문제가 발생한다. 한 가지 문제는 컨테이너가 크래시될 때 파일이 손실된다는 것

kubernetes.io

 

 

가장 간단한 임시 볼륨이다.

빈 볼륨을 생성하여 마운트한다.

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: registry.k8s.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir:
      sizeLimit: 500Mi

cache 디렉토리

 

CLI 환경이라 직접 확인하긴 어렵지만 위 웹 서버 이미지의 html 구조를 보면 cache 디렉토리가 있을 것을 예상할 수 있다.

어차피 공식문서에 있는 yaml 코드이므로 잘못될 가능성은 거의 없다.

 

 

 


CSI 임시 볼륨

csi의 경우 로컬 스토리지를 활용하는 서비스가 아니라 외부 프로바이더에 의해 제공되는 스토리지 서비스다.

Amazon EBS, Google Persistent Disk, Azure Disk, Ceph, Portworx, GlusterFS와 같은 클라우드 및 오픈소스 스토리지 서비스를 이용하여 제공된다.

 

csi 볼륨에 대한 yaml 코드는 다음과 같다.

kind: Pod
apiVersion: v1
metadata:
  name: my-csi-app
spec:
  containers:
    - name: my-frontend
      image: busybox:1.28
      volumeMounts:
      - mountPath: "/data"
        name: my-csi-inline-vol
      command: [ "sleep", "1000000" ]
  volumes:
    - name: my-csi-inline-vol
      csi:
        driver: inline.storage.kubernetes.io
        volumeAttributes:
          foo: bar

 

 

 

 


일반 임시 볼륨(ephemeral)

일반 임시 볼륨은 프로비저닝 후 일반적으로 비어 있는 스크래치 데이터에 대해 파드 별 디렉터리를 제공한다는 점에서 emptyDir 볼륨과 유사하다. 하지만 다음과 같은 추가 기능도 제공한다.

  • 스토리지는 로컬이거나 네트워크 연결형(network-attached)일 수 있다.
  • 볼륨의 크기를 고정할 수 있으며 파드는 이 크기를 초과할 수 없다.
  • 드라이버와 파라미터에 따라 볼륨이 초기 데이터를 가질 수도 있다.
  • 볼륨에 대한 일반적인 작업은 드라이버가 지원하는 범위 내에서 지원된다. 이와 같은 작업은 다음을 포함한다. 스냅샷, 복제, 크기 조정, 및 스토리지 용량 추적.
kind: Pod
apiVersion: v1
metadata:
  name: my-app
spec:
  containers:
    - name: my-frontend
      image: busybox:1.28
      volumeMounts:
      - mountPath: "/scratch"
        name: scratch-volume
      command: [ "sleep", "1000000" ]
  volumes:
    - name: scratch-volume
      ephemeral:
        volumeClaimTemplate:
          metadata:
            labels:
              type: my-frontend-volume
          spec:
            accessModes: [ "ReadWriteOnce" ]
            storageClassName: "scratch-storage-class"
            resources:
              requests:
                storage: 1Gi
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: scratch-storage-class
  labels:
    type: my-frontend-volume
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: ephemeral-pv
  labels:
    type: my-frontend-volume
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: scratch-storage-class
  hostPath:
    path: /mnt/data

 

 

조금 길지만 공식문서와 같이 ephemeral 필드를 사용하여 위와 같이 스토리지 클래스와 PV를 생성해줘야 한다.

임시로 사용되는 볼륨이지만 PVC와 PV를 동적으로 생성하는데 있어서 볼륨을 관리하는 부분에 필요하기 때문에 스토리지 클래스와 PV의 개념이 필요하다.

위 예시에서는 provisioner필드의 값으로 no-provisioner를 사용했기에 스토리지 클래스와 PV를 따로 생성한 것이며, 일반적으로 스토리지 클래스만 정의하여 클라우드 프로바이더를 통해 모든 서비스를 동적으로 생성할 수 있다.

scratch라는 빈 디렉토리 생성

 

 

이와 같이 임시 볼륨을 생성하는 것도 동적으로 생성하여 애플리케이션에 볼륨을 제공할 수 있다.

하지만 결국 임시에 불과하니 용도에 맞게 활용해야 하므로 해당 볼륨 사용에 대해 정확한 판단이 필요할 수 있다.

'Kubernetes' 카테고리의 다른 글

Kubernetes 기초 - RBAC(1)  (0) 2024.01.23
Kubernetes 기초 - Storage(5)  (0) 2024.01.23
Kubernetes 기초 - Storage(3)  (0) 2024.01.22
Kubernetes 기초 - Storage(2)  (0) 2024.01.20
Kubernetes 기초 - Storage(1)  (0) 2024.01.12