쿠버네티스 스토리지, 스토리지 클래스

도람·2025년 11월 7일
post-thumbnail

스토리지

컨테이너 내부 디스크에 저장된 파일은 임시적이다.
즉, 컨테이너가 재시작되면 그 안의 데이터는 모두 사라진다.
이로 인해 애플리케이션이 실행될 때 몇 가지 문제가 생길 수 있다.

  1. 컨테이너가 크래시될 때 파일이 손상된다는 것 (kubelet이 컨테이너를 다시 시작하지만, 초기화된 상태이다.)
  2. 같은 Pod 내 여러 컨테이너가 데이터를 공유하기 어렵다.
    Pod안에 여러 컨테이너가 있을 때, 이들이 같은 파일을 공유하는 경우나 서로 데이터를 교환하는 경우에 별도의 저장소가 없는 경우에는 데이터 손상이나 일관성이 깨질 수 있다.

-> 이러한 경우를 해결하기 위해서 쿠버네티스에서는 볼륨(Volume)을 제공한다.
볼륨은 Pod 내 컨테이너들이 공유 파일시스템을 안전하게 사용할 수 있게 해주는 저장소이다.


쿠버네티스의 볼륨

쿠버네티스는 도커보다 훨씬 다양한 유형의 볼륨을 지원한다.

  • 임시로만 존재하는 임시볼륨(ephemeral volum)
    ex) emptyDir

  • 파드가 사라져도 남아 있는 persistent volume
    ex) PVC

이런 식으로 여러 종류의 볼륨을 상황에 맞게 사용할 수 있다.

또한 하나의 파드 안에서도 여러 개의 볼륨을 동시에 사용할 수 있다.
예를 들어,하나는 임시 저장용으로,
또 하나는 로그를 장기 저장용으로 쓰는 식이다.


볼륨 특징

  • 기본적으로 볼륨은 디렉터리 형태의 파일시스템이다.
  • 어떤 매체(디스크, 클라우드 스토리지, NFS 등)를 사용하느냐에 따라 성격이 달라진다.
  • 파드 내의 컨테이너가 재시작되어도 볼륨의 데이터는 유지된다.
  • 단, 파드 자체가 삭제되면 임시 볼륨은 함께 사라지지만,
    퍼시스턴트 볼륨(Persistent Volume) 은 그대로 남는다.

볼륨 마운트 방식

쿠버네티스에서 볼륨을 사용하려면
파드의 스펙(.spec.volumes)에 어떤 볼륨을 사용할지 정의하고,
각 컨테이너의 스펙(.spec.containers[*].volumeMounts)에
“이 볼륨을 어디에 연결할지” 경로를 지정해야 한다.

즉,

.spec.volumes: 

:어떤 볼륨을 쓸 건지 정의

.spec.containers.volumeMounts:

: 볼륨을 컨테이너 내부의 어떤 폴더에 연결할지 지정
->이렇게 연결하면 컨테이너 안에서 마치 로컬 폴더처럼 접근할 수 있다.


볼륨 유형

볼륨에는 퍼시스턴트(Persistent) 볼륨과 프로젝티드(Projected) 볼륨, 임시 볼륨(Ephemeral)이 있다.


퍼시스턴트 볼륨(Persistent Volume, PV)

개념

  • 퍼시스턴트 볼륨(PV)은 말 그대로 영속적인 저장 공간이다.
    컨테이너나 파드가 사라져도 데이터는 남아있다.

  • 쿠버네티스에서 PV는 클러스터의 하나의 리소스로 관리된다.
    (예: 노드가 클러스터의 리소스인 것처럼, 스토리지도 클러스터의 리소스이다.)

-> 즉, 관리자가 미리 만들어 두거나, 필요할 때 자동으로 만들어지는
공용 저장소 공간이라고 보면 된다.


퍼시스턴트 볼륨 클레임 (Persistent Volume Claim, PVC)

PVC는 사용자가 “이 정도 크기의 스토리지를 쓰겠다” 하고 요청하는 신청서 같은 개념이다.
파드가 노드 자원을 사용하는 것처럼, PVC는 PV 자원을 사용한다.

즉,

PV → 실제 저장공간
PVC → 그 저장공간을 요청하는 “청구서”

이 둘은 서로 연결되어야 사용이 가능하다.


프로비저닝 (Provisioning)
PV를 만드는 것은 두가지 방법이 있다.
1. 프로비저닝 방법
2. 동적 프로비저닝 방법

프로비저닝 방법 vs 동적 프로비저닝 방법
프로비저닝 방법 :관리자가 미리 여러 개의 PV를 만들어둔다.
이 PV들은 쿠버네티스에 등록되어 있어서 사용자가 PVC를 만들면,
요청 조건(용량, 접근 모드 등)에 맞는 PV가 연결된다.

ex)
“미리 10Gi 스토리지를 여러 개 만들어두고,
누군가 10Gi 요청하면 자동으로 하나 연결해주는 방식.”

동적 프로비저닝 방법 : 만약 PVC가 요청했는데 조건에 맞는 PV가 미리 존재하지 않으면,
쿠버네티스가 자동으로 새로운 PV를 만들어주는 방식이다.
이때 쿠버네티스는 StorageClass 라는 설정을 참고한다.
StorageClass는 “어떤 종류의 스토리지로 만들지”를 정해주는 템플릿 같은 개념이다.


프로젝티드(Projected) 볼륨

공식 문서에는 아래 이미지처럼 간단한 설명만 나와 있어서,
조금 더 이해하기 쉽게 정리해보았다

프로젝티드 볼륨이란
여러 가지 볼륨 소스를 하나의 디렉토리에 합쳐서 보여주는 볼륨이다.
쉽게 말해, ConfigMap·Secret·DownwardAPI 같은 설정 정보를
하나의 폴더에 “깔끔하게 묶어서” 관리할 수 있는 기능이다.


왜 필요할까?

보통 파드에서는 여러 출처에서 설정 정보를 가져온다.

  • ConfigMap : 애플리케이션 설정값
  • Secret : 비밀번호나 인증 토큰
  • DownwardAPI : 파드 이름, 네임스페이스 등의 메타데이터

이런 데이터를 각각 다른 경로에 마운트하면 관리가 복잡해진다.
그래서 “프로젝티드 볼륨”을 사용하면
이 모든 정보를 하나의 디렉토리로 통합해서 관리할 수 있다.

즉, 여러 볼륨을 “프로젝션(projection)”하여
하나의 파일시스템 경로에 합쳐놓는 것이다.


프로젝티드 볼륨 구성 예시

apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: container-test
    image: busybox:1.28
    volumeMounts:
    - name: all-in-one
      mountPath: "/projected-volume"
      readOnly: true
  volumes:
  - name: all-in-one
    projected:
      sources:
      - secret:
          name: mysecret
          items:
            - key: username
              path: my-group/my-username
      - downwardAPI:
          items:
            - path: "labels"
              fieldRef:
                fieldPath: metadata.labels
            - path: "cpu_limit"
              resourceFieldRef:
                containerName: container-test
                resource: limits.cpu
      - configMap:
          name: myconfigmap
          items:
            - key: config
              path: my-group/my-config

프로젝티드 볼륨은 여러 개의 설정 소스를
한 디렉토리에 통합해서 관리할 수 있는 볼륨이다.
설정 관리가 단순해지고, 파드 내부 구조도 훨씬 깔끔해진다.


임시(Ephemeral) 볼륨

임시 볼륨은 말 그대로 파드의 수명과 함께 사라지는 일시적인 볼륨이다.
파드가 생성될 때 같이 만들어지고, 파드가 종료되면 함께 삭제된다.

언제 사용할까?

일부 애플리케이션은 데이터를 잠깐만 저장해도 되는 경우가 있다.

  • 캐시 서버처럼 빠른 임시 저장이 필요한 서비스
  • 읽기 전용 설정 파일이나 비밀 키를 잠시 참조해야 하는 애플리케이션

이런 경우에는 데이터를 영구적으로 저장할 필요가 없으므로
퍼시스턴트 볼륨(PV)을 쓸 이유가 없다.
-> 대신 임시 볼륨을 사용하면 훨씬 가볍고 관리가 단순하다.


특징

  • 파드와 함께 생성되고, 파드가 종료되면 자동 삭제된다.
  • 별도의 퍼시스턴트 스토리지 없이도 바로 사용 가능하다.
  • 파드 내부에 인라인(inline) 으로 정의되므로,
    추가 리소스를 따로 만들 필요가 없다.
  • 애플리케이션 배포가 간단해지고, 어디서든 동일하게 실행할 수 있다.

임시볼륨 예시

  • emptyDir : 파드 시작 시 빈 디렉터리로 생성되며,
    로컬 디스크(kubelet의 베이스 디렉터리) 또는 램에서 저장 공간을 제공한다.
  • configMap / downwardAPI / secret : 쿠버네티스 리소스 데이터를 파드 내부로 주입한다.
  • CSI 임시 볼륨 : 위의 볼륨들과 비슷하지만, 이를 지원하는 특수한 CSI 드라이버에 의해 제공된다.
  • 일반(generic) 임시 볼륨 : 퍼시스턴트 볼륨을 지원하는 모든 스토리지 드라이버에서 사용할 수 있다.시스턴트 볼륨도 지원하는 모든 스토리지 드라이버에 의해 제공될 수 있다

정리 : 임시(Ephemeral) 볼륨은 “파드가 살아있는 동안만 존재하는 저장소”이다.
캐시, 임시 파일, 설정 데이터처럼 지속성이 필요 없는 작업에 적합하다.


예시: 임시 스토리지를 사용하는 파드

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

참고자료:
[쿠버네티스 공식 홈페이지 - Volumn]
https://kubernetes.io/ko/docs/concepts/storage/volumes/
[쿠버네티스 공식 홈페이지 - Persistent Volumes]
https://kubernetes.io/docs/concepts/storage/persistent-volumes/
[쿠버네티스 공식 홈페이지 - Projected Volumes]
https://kubernetes.io/docs/concepts/storage/projected-volumes/
[쿠버네티스 공식 홈페이지 - Ephemeral Volumes]
https://kubernetes.io/docs/concepts/storage/ephemeral-volumes/

profile
정도를 걷는 엔지니어

0개의 댓글