[K8S] Pod Template에서 사용하는 Volume 옵션

mizu·2026년 7월 19일

K8S

목록 보기
2/10

🏗️ Volume vs VolumeMounts

디테일한 볼륨 종류를 알아보기 전에, 이 두 녀석의 관계부터 명확히 짚고 넘어가야 합니다. 아주 쉽게 비유하자면 "하드웨어를 사서(Volume), 컴퓨터의 특정 폴더에 연결(VolumeMounts)하는 것"과 같습니다.

  • spec.volumes (어디서 가져올 것인가?): 파드 레벨에서 정의합니다. 파드가 사용할 스토리지의 종류와 소스를 지정하는 곳입니다.
  • spec.containers[].volumeMounts (어디에 붙일 것인가?): 컨테이너 레벨에서 정의합니다. 위에서 정의한 볼륨을 컨테이너 내부의 정확히 어떤 경로(mountPath)에 연결할지 결정합니다.

1. emptyDir: 파드와 운명을 함께하는 임시 공간

💡 역할

파드가 노드에 할당될 때 생성되며, 파드가 살아있는 동안만 유지되는 임시 디렉터리입니다. 파드 안의 모든 컨테이너가 이 디렉터리를 공유하여 읽고 쓸 수 있습니다. 파드가 삭제되면 emptyDir 안의 데이터도 영구히 삭제됩니다.

🛠️ YAML 예시

apiVersion: v1
kind: Pod
metadata:
  name: empty-dir-pod
spec:
  containers:
  - name: web-renderer
    image: nginx
    volumeMounts:
    - name: shared-storage
      mountPath: /usr/share/nginx/html
  - name: content-fetcher
    image: alpine
    command: ["sh", "-c", "echo 'Hello Tech Blog!' > /data/index.html && sleep 3600"]
    volumeMounts:
    - name: shared-storage
      mountPath: /data
  volumes:
  - name: shared-storage
    emptyDir: {}

🎯 주요 유스케이스

  • 사이드카(Sidecar) 패턴: content-fetcher가 웹에서 데이터를 다운로드해 emptyDir에 저장하면, nginx 컨테이너가 이를 읽어서 웹으로 서빙하는 구조.
  • 대용량 연산을 위한 임시 스크래치 공간(Checkpoints, 임시 캐시 등).

🚀 메모리를 스토리지로 쓰기
emptyDir: {} 뒤에 medium: Memory를 추가하면, 디스크가 아닌 노드의 RAM(tmpfs)을 사용하게 됩니다. 읽기/쓰기 속도가 극단적으로 빨라져야 하는 고성능 캐시 시스템을 구축할 때 아주 유용합니다. 단, 노드의 메모리를 직접 소비하므로 sizeLimit을 설정해 두는 것이 안전합니다.


2. hostPath: 워커 노드의 파일 시스템에 직접 빨대 꽂기

💡 역할

파드가 실행 중인 호스트 워커 노드의 실제 파일 시스템 경로를 파드 내부로 마운트합니다. 파드가 삭제되어도 노드에 있는 데이터는 그대로 유지됩니다.

🛠️ YAML 예시

apiVersion: v1
kind: Pod
metadata:
  name: host-path-pod
spec:
  containers:
  - name: log-collector
    image: busybox
    command: ["sh", "-c", "tail -f /var/log/syslog"]
    volumeMounts:
    - name: node-log
      mountPath: /var/log
  volumes:
  - name: node-log
    hostPath:
      path: /var/log # 워커 노드의 실제 경로
      type: Directory # 검증 타입 (Directory, File 등)

🎯 주요 유스케이스

  • 노드의 시스템 로그(/var/log)를 수집하는 모니터링 에이전트(Fluentd, Promtail 등)를 띄울 때.
  • 노드의 도커 상태를 확인하기 위해 /var/run/docker.sock을 컨테이너에 연결할 때.

⚠️ 강력하지만 위험한 양날의 검
일반적인 비즈니스 애플리케이션 파드에서는 hostPath 사용을 절대 지양해야 합니다.
1. 보안 구멍: 컨테이너가 노드의 루트 권한 파일에 접근할 수 있게 됩니다.
2. 스케줄링 대참사: 파드가 A 노드에서 죽고 B 노드에서 재생성되면, B 노드의 경로를 바라보게 되므로 이전 데이터의 연속성이 완전히 깨집니다.


3. subPath: 볼륨의 특정 방(Room)만 콕 집어서 마운트하기

💡 역할

하나의 대형 볼륨 안에 여러 폴더가 있을 때, 전체가 아닌 특정 하위 디렉터리나 단일 파일만 컨테이너 내부로 마운트하고 싶을 때 사용합니다. volumeMounts 속성의 하위 옵션으로 들어갑니다.

🛠️ YAML 예시

apiVersion: v1
kind: Pod
metadata:
  name: subpath-pod
spec:
  containers:
  - name: mysql-a
    image: mysql:5.7
    volumeMounts:
    - name: central-storage
      mountPath: /var/lib/mysql
      subPath: mysql-db-a # 볼륨 내의 mysql-db-a 폴더만 마운트!
  - name: mysql-b
    image: mysql:5.7
    volumeMounts:
    - name: central-storage
      mountPath: /var/lib/mysql
      subPath: mysql-db-b # 볼륨 내의 mysql-db-b 폴더만 마운트!
  volumes:
  - name: central-storage
    persistentVolumeClaim:
      claimName: shared-pvc

🎯 주요 유스케이스

  • 하나의 대형 영구 볼륨(PVC)을 여러 개의 컨테이너가 공유하면서, 각자 독립된 폴더를 격리해서 사용하고 싶을 때.
  • 기존 컨테이너 디렉터리를 통째로 덮어쓰지 않고, 특정 파일 하나만 쏙 집어넣고 싶을 때.

4. ConfigMap & Secret: 설정을 파일 형태로 스며들게 하기

💡 역할

쿠버네티스 오브젝트인 ConfigMap(일반 설정값)과 Secret(암호화된 민감 정보)을 컨테이너 내부에 일반 텍스트 파일 형태로 마운트해 줍니다. 이미지 재빌드 없이 설정을 바꿀 수 있는 핵심 비결이죠.

🛠️ YAML 예시

apiVersion: v1
kind: Pod
metadata:
  name: config-secret-pod
spec:
  containers:
  - name: app
    image: my-application
    volumeMounts:
    - name: app-config-vol
      mountPath: /app/config # ConfigMap 데이터가 이 폴더 안에 파일로 생성됨
    - name: app-secret-vol
      mountPath: /app/certs
      readOnly: true
  volumes:
  - name: app-config-vol
    configMap:
      name: my-app-config
  - name: app-secret-vol
    secret:
      secretName: my-app-secret

💡 subPath와 ConfigMap의 치명적인 밀당
1. 디렉터리 덮어쓰기 주의: ConfigMap을 특정 폴더(예: /etc)에 통째로 마운트하면 기존에 있던 시스템 파일들이 다 날아갑니다. 이를 막으려면 반드시 위에서 배운 subPath를 사용해 파일 단위로 마운트해야 합니다.
2. 실시간 동기화(Hot Reload)의 배신: 쿠버네티스에서 ConfigMap을 수정하면 파드를 재시작하지 않아도 컨테이너 내부 파일이 자동 업데이트됩니다. 하지만 subPath를 통해 마운트된 파일은 자동 업데이트가 되지 않습니다! 설정 변경을 반영하려면 파드를 롤링 업데이트해야 하니 아키텍처 설계 시 꼭 참고하세요.


🗺️ 요약 가이드 맵

볼륨 타입생명 주기주 용도핵심 한 줄 요약
emptyDir파드 종료 시 삭제임시 캐시, 컨테이너 간 데이터 공유"메모리나 임시 디스크를 쓰는 초고속 징검다리 스토리지"
hostPath노드 삭제 시 삭제노드 로그 수집, 도커 소켓 접근"보안상 위험하니 시스템 모니터링용 아니면 봉인할 것"
ConfigMap / Secret독립적설정 파일, 인증서 파일 주입"환경 설정과 보안 키를 파일 형태로 똑똑하게 주입하기"
subPath (옵션)-볼륨 내 특정 폴더/파일만 지정"디렉터리 통째로 덮어쓰는 대참사를 막아주는 핀셋 마운트"
profile
문제를 해결해보자 ✨

0개의 댓글