[k8s] 쿠버네티스 컴포넌트 정리 - Volume

🔥Log·2024년 11월 25일
0

k8s

목록 보기
4/15

🐳 Volume


Docker 컨테이너를 실행할 때에도 컨테이너의 재시작과 상관없이 항상 보존되어야 하는 정보들은 Volume을 마운팅한다.
동일한 역할을 하는 Volume을 Pod에도 설정할 수 있는데, 한번 정리해보자.

1) emptyDir

emptyDir은 컨테이너 간에 볼륨을 공유하기 위해서 사용된다.
이름이 emptyDir인 이유는 보륨이 생성될 때, 해당 볼륨은 항상 비어 있기 때문이다.
emptyDir로 볼륨을 생성하면, 이 볼륨은 Pod에 생성되게 된다. 그래서 Pod가 재부팅되면, emptyDir에 저장되어 있던 파일들은 모두 삭제가 된다. 그래서 emptyDir에는 영구적일 필요가 없는 임시 데이터 또는 파일들을 저장하기 위해서 사용되어야한다.

yaml 샘플

apiVersion: v1
kind: Pod
metadata:
  name: pod-vol-1
spec:
  containers:
    - name: container-vol-1
      image: kai1114/hello
      volumeMounts:
        - name: empty-dir-1
          mountPath: /mount-1
    - name: container-vol-2
      image: kai1114/hello
      volumeMounts:
        - name: empty-dir-1
          mountPath: /mount-2
  volumes:
    - name: empty-dir-1
      emptyDir: {}

emptyDir은 위와같이 사용할 수 있다.


2) hostPath

hostPath는 말 그대로 host의 경로를 마운팅할 수 있는 방식인데, 여기서 host는 Pod입장에서 host에 해당하고, Node를 의미한다.
즉, Node의 특정 경로를 Pod에 마운팅할 수 있는 것이다. 이로 인해서 Pod가 재부팅되어도 데이터가 날아가지 않는다는 장점을 갖고 있다.

하지만, 당연하게도 이 볼륨은 Node에 종속되기 때문에 Pod가 재성성될 때, 생성되는 Node가 이전과 달라지거나, 장애로 인해서 현재의 노드말고 다른 노드로 위치가 옮겨질 수 있다는 단점이 존재한다.

그렇다면, hostPath는 언제 사용해야할까?

hostPath는 Pod 또는 애플리케이션에서 만들어진 어떠한 정보를 저장하기 위해서 사용하는 것이 아니라, k8s의 Node에 존재하는 또는 Node가 갖고 있는 정보에 Pod가 접근해야하는 경우 사용한다.

yml 샘플

apiVersion: v1
kind: Pod
metadata:
  name: pod-vol-2
spec:
  containers:
    - name: container-vol-1
      image: kai1114/hello
      volumeMounts:
        - name: host-path-1
          mountPath: /mount-1
    - name: container-vol-2
      image: kai1114/hello
      volumeMounts:
        - name: host-path-1
          mountPath: /mount-2
  volumes:
    - name: host-path-1
      hostPath:
        path: /node-path
        type: Directory

hostPath를 사용하기 위해서는 위와 같은 형태로 yml을 작성하여 사용할 수 있다.


3) PVC / PV

서버의 로컬 볼륨 또는 AWS, Git등등 다양한 저장 공간이 있을 수 있는데, 이러한 것들을 PV(Persistent Volume)로 정의한다.

Pod에서는 PVC(Persistent Volume Claim)를 정의하여, 미리 정의된 PV에 연결할 수 있다.

yml 샘플: PV

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-1
spec:
  capacity:
    storage: 1G
  accessModes:
    - ReadWriteOnce
  local:
    path: /node-v
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - { key: kubernates.io/hostmane, operator: In, values: [ minikube ] }

yml 샘플: PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-claim-1
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1G
  storageClassName: ""

yml 샘플: Pod

apiVersion: v1
kind: Pod
metadata:
  name: pod-vol-3
spec:
  containers:
    - name: container
      image: kai1114/hello
      volumeMounts:
        - name: pvc-pv
          mountPath: /mount-2
  volumes:
    - name: pvc-pv
      persistentVolumeClaim:
        claimName: pv-claim-1


🙏 참고


0개의 댓글