본문 바로가기
네트워크/k8s

[k8s] 6. Volume - emptyDir, hostPath, PV/PVC

by Lauren X Ming 2021. 2. 4.

Volume

emptyDir, hostPath, PVC/PV에 대해 알아보자

1. emptyDir

  • 컨테이너들끼리 데이터를 공유하기 위해서 볼륨을 사용하는 것
  • 최초 볼륨이 생성될 때 볼륨 내용이 비어있기 때문에 emptyDir로 명명됨
  • Container1이 web이고 Contaner2가 back-end라 하자
  • Container1은 웹서버로 받은 특정 파일을 마운트된 Volume에 저장
  • Container2도 Volume을 이용하여 두 서버가 파일을 주고받을 필요 없이 편하게 사용 가능
  • 이 볼륨은 파드안에 생성되기 때문에 파드에 문제가 생겨 재생성되면 데이터가 없어짐
  • 볼륨에 쓰인 데이터는 꼭 일시적인 사용목적을 가져야 함

Sample YAML

apiVersion: v1
kind: Pod
metadata:
  name: pod-volume-1
spec:
  containers:
  - name: container1
    image: kubetm/init
    volumeMounts:
    - name: empty-dir
      mountPath: /mount1
  - name: container2
    image: kubetm/init
    volumeMounts:
    - name: empty-dir
      mountPath: /mount2
  volumes:
  - name : empty-dir
    emptyDir: {}
  • 컨테이너가 2개
  • 둘 다 볼륨을 마운트하고 있음
  • 마운트하는 path를 보면 컨테이너1은 mount1, 컨테이너2는 mount2
  • path가 달라도 name이 empty-dir이여서 컨테이너마다 자신이 원하는 경로를 사용할 수 있음
  • 무튼 같은 볼륨 사용하는거임

2. hostPath

  • 파드들이 올라가진 노드의 path를 볼륨으로써 사용
  • emptyDir이랑 다른점은 path를 파드들이 공유하기 때문에 파드가 죽어도 노드의 볼륨은 안 죽음
  • 문제점: 파드2가 죽어서 노드1이 아닌 노드2에 파드2가 재생성되면 노드1의 볼륨 이용 불가

  • 노드2가 생길 때, 똑같은 경로를 만들어서 노드에 있는 path끼리 마운트시켜주면 해결가능하지만 쿠버네티스가 해주는게 아님
  • 운영자가 리눅스 시스템의 마운트 기술을 사용하는 것 --> 자동화가 아니니 안정적이지 않음, 노권장
  • 아무튼 hostPath는 파드 자신이 할당되어 있는 노드의 데이터를 읽거나 쓸 때 사용함

Sample YAML

apiVersion: v1
kind: Pod
metadata:
  name: pod-volume-3
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node1
  containers:
  - name: container
    image: kubetm/init
    volumeMounts:
    - name: host-path
      mountPath: /mount1
  volumes:
  - name : host-path
    hostPath:
      path: /node-v
      type: DirectoryOrCreate
  • 파드를 만들 때 컨테이너에서 볼륨을 마운트하는데 mountPath는 /mount1
  • path에 대한 host-path의 볼륨이 /node-v에 있음
  • host-path의 타입은 Directory
  • host-path의 path(/node-v)는 파드가 생성되기 전에 있어야 오류가 나지 않음
  • hostPath는 파드의 데이터를 저장하는 용도가 아니라 노드의 데이터를 파드에서 쓰기 위함

3. PVC/PV

  • Persistent Volume Claim, Persistent Volume
  • PVC/PV는 파드에 영속성 있는 볼륨을 제공함
  • 볼륨은 Local도 있고 외부에 원격으로 활용하는 것도 있음
  • 이런 것들을 각각 PV를 정의하여 연결함
  • 파드는 PV에 바로 연결하지 않고 PVC를 통하여 연결됨
  • 파드를 PV에 바로 연결하지 않는 이유는 쿠버네티스가 User와 Admin으로 영역을 나눠서 관리하기 때문
  • Admin은 쿠버네티스 운영자, User는 파드에 서비스를 만들고 배포를 담당하는 자

Sample YAML

PV(원격 스토리지)

  • 각각의 볼륨에따라 속성들이 다름

PVC

  • 읽기/쓰기 모드가 되고 용량이 1G인 볼륨을 달라
  • storageClassName: ""인데 이는 현재 만들어진 PV중에서 선택되는 걸 의미

Pod

  • claimName에 pvc-01을 연결함
  • 볼륨을 만들어 놓으면, 볼륨을 컨테이너에서 사용

정리

  1. Admin이 PV를 만듦
  2. User가 PVC를 만듦
  3. k8s가 PVC에 맞는 PV를 연결해줌
  4. Pod를 만들 때, PVC를 사용

PV(Local Storage)

  • 호스트패스처럼 호스트에 있는 local path를 사용함
  • 밑에 내용이 많은데 결론적으로 PV에 연결되는 파드들은 node1이라고 라벨링 되어있는 노드 위에만 만들어짐
  • 파드를 생성할 때 무조건 이 노드위에 만들어짐
  • 근데 Local type PV는 잘 사용 안 함 ㅋ 그럼 왜하지
  • 중요한건 spec의 capacity와 accessMode임, 중요한게 참 많아요
  • 이 capacity와 accessMode가 PVC-PV의 연결 근거임

출처

인프런 - 대세는 쿠버네티스

'네트워크 > k8s' 카테고리의 다른 글

[k8s] 8. ConfigMap, Secret - Env, Mount  (0) 2021.02.07
[k8s] 7. Volume - 실습  (0) 2021.02.07
[k8s] 5. Service - 실습  (0) 2021.02.03
[k8s] 4. Service - ClusterIP, NodePort, LoadBalancer  (0) 2021.02.01
[k8s] 3. Pod - 실습  (0) 2021.01.31