devops

쿠버네티스 컨테이너, 파드의 Volume 본문

DevOps/Kubernetes

쿠버네티스 컨테이너, 파드의 Volume

vataops 2023. 7. 16. 21:47
반응형

쿠버네티스 컨테이너에서 정의되는 Volume은 컨테이너의 데이터를 영구적으로 저장하거나 컨테이너 간 데이터를 공유하기 위해 사용된다. 각 볼륨은 여러 목적과 특성을 가지고 있어 상황에 맞게 사용된다.

복습 겸, 정리해보자.

# Deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: productpage-v1
  labels:
    app: productpage
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: productpage
      version: v1
  template:
    metadata:
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9080"
        prometheus.io/path: "/metrics"
      labels:
        app: productpage
        version: v1
    spec:
      serviceAccountName: bookinfo-productpage
      containers:
      - name: productpage
        image: docker.io/istio/examples-bookinfo-productpage-v1:1.17.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
        securityContext:
          runAsUser: 1000
      volumes:
      - name: tmp
        emptyDir: {}
---

위는 어느 어플리케이션의 Deployment 정의 내용이다. 여기서 볼륨 섹션은 spec.template.spec.containers.volumeMounts와 spec.template.spec.containers.volumes 두가지가 있다.

굳이 순서로 따지면 volumes를 먼저 설명해야한다.

spec.template.spec.containers.volumes

volumes는 파드 또는 컨테이너에 사용되는 볼륨의 실제 정의를 말한다.

https://livebook.manning.com/book/kubernetes-in-action-second-edition/chapter-7/v-6/14

위 그림에서 volumes 섹션은 Pod의 왼쪽 Volume 요소를 의미하는 것으로, 먼저 정의가 되어야 컨테이너에서 마운트할 수 있다. 이 볼륨은 여러 유형이 있는데 다음과 같다.

  • EmptyDir : EmptyDir은 파드의 라이프 사이클동안 데이터를 저장하는 임시 볼륨이다. 파드 내부의 여러 컨테이너 간에 데이터를 공유하는데 사용될 수 있다. 파드가 재시작되면 삭제된다.
  • HostPath : 워커 노드의 파일 시스템 경로를 파드 내부로 마운트하는 방식으로 동작한다. 워커 노드 상의 파일 시스템에 접근해야하는 경우에 사용하는데, 문제는 다른 노드로 파드가 스케쥴링되면 해당 경로에 파일이 없을 수 있다.
  • PersistentVolumeClaim (PVC) : 영구적인 데이터 저장을 위한 볼륨 유형으로, 스토리지 클래스에 의해서 백엔드 스토리지로 동적 프로비저닝될 수 있다. 파드가 삭제되더라도 PVC는 유지되기 때문에 데이터를 보존할 수 있다.
  • ConfigMap과 Secret : 어플리케이션 정보나 암호화된 데이터를 컨테이너에 주입하는데 사용된다.
  • Cloude Provider의 Volume : AWS같은 클라우드 프로바이더가 제공하는 스토리지 솔루션을 사용하여 영구 데이터를 저장할 수 있다.

이제 containers.volumeMounts은 정의된 볼륨을 컨테이너 파일 시스템에 마운트하는 것이라고 보면 된다. 이는 컨테이너가 볼륨과 상호작용을 위한 설정이다. 

위 yaml 파일을 통해 설명하자면,

    spec:
      serviceAccountName: bookinfo-productpage
      containers:
      - name: productpage
        image: docker.io/istio/examples-bookinfo-productpage-v1:1.17.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
        securityContext:
          runAsUser: 1000
      volumes:
      - name: tmp
        emptyDir: {}

이 파드에서 emptyDir 유형의 tmp 볼륨이 정의되었고, productpage라는 컨테이너가 이 tmp 볼륨을 컨테이너 내부 /tmp 경로로 마운트된다.

 

반응형
Comments