[Xshell] 오브젝트 - Volume

emptyDir, hostPath, PV/PVC


Volume의 필요성

container 내의 디스크에 있는 파일은 임시적이며, container가 크래시될 때 파일이 손실된다.

또한, pod에서 같이 실행되는 container간에 서로 파일을 공유하기 위해서는 서버 간에 파일을 주고 받아야한다.

volume은 이러한 문제를 해결한다.


Volume의 종류

volume은 pod의 container에서 사용한다.

기본적으로 볼륨은 디렉토리인데, 데이터의 사용목적에 따라 사용하는 volume의 종류가 다르다.


종류 특징 용도
emptyDir container들끼리 데이터를 공유 only 일시적인 사용목적의 데이터
hostPath Node의 path를 volume으로 사용 pod의 데이터를 저장하기 위한 용도가 아니라,
Node에 있는 데이터를 pod에서 쓰기 위한 용도
PVC/PV pod는 PV에 바로 연결하지 않고, PVC를 통해 연결됨 pod의 영속성 있는 데이터를 제공

[1] emptyDir

volume이 생성될 때 volume 안이 비어 있어 emptyDir라고 한다.


예를 들어,

container1 : 웹 역할을 하는 서버

container2 : 벡엔드단을 처리하는 서버라고 할 때,

웹서버로 받은 특정 파일을 mount가 된 volume에 저장해놓으면 두 서버가 volume을 자신의 로컬에 있는 파일처럼 사용한다.

따라서, 서버간의 파일을 주고 받을 필요가 없다!

하지만, 문제가 있다. pod안에 volume이 생성되기 때문에, pod에 문제가 발생해서 재성성이 되면 volume의 데이터가 사라진다.

따라서, emptyDir은 일시적인 사용목적의 데이터에만 사용한다.

실습

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: {}

1) container 2개짜리 pod를 생성하고, (대쉬보드에서) container1에 들어간다.

mount1 폴더가 mount가 되었는지 확인한다. (mount)
그리고, 빈 폴더에 파일을 하나 만든다. (echo)


2) container2에서 container1에서 만든 파일이 보인다.


3) 그 다음, pod를 삭제하고 재생성하면 데이터가 삭제되었다. emptyDir 볼륨은 pod안에 있기 때문에 pod가 삭제되면 데이터도 삭제되기 때문이다.


따라서 emtyDir는 container들끼리 임시적으로 데이터를 공유하고 싶을 때 사용하는 것이다.


[2] hostPath

하나의 host(즉, pod들이 올라가 있는 node)의 path를 volume으로 사용한다. 즉, pod가 죽어도 데이터가 살아있다.


다른 node에 있는 pod는 해당 volume에 mount할 수 없기 때문에

hostPath는 pod의 데이터를 저장하기 위한 용도가 아닌, node에 있는 데이터를 pod에서 쓰기 위한 용도이다.

시스템 파일이나 설정 파일들이 이에 속한다.

주의할 점은 pod가 생성되기 전에, hostPath에 해당하는 node가 만들어져야 한다.

실습

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

type: DirectoryOrCreate 로 하면,
해당 node에 hostpath가 없으면 path를 직접 생성해주기 때문에 사전에 node에 path를 만들 필요가 없다.

1) 같은 node에 pod 2개를 만들어 본다.

2) 앞의 실습과 비슷하게 mount1 폴더명으로 node1의 nodev 라는 디렉토리를 공유한다.

3) Xshell에서 실제 노드에 volume path가 잘 있는지 확인할 수 있다.


Tips

hostPath Type

  • DirectoryOrCreate : 실제 경로가 없다면 생성
  • Directory : 실제 경로가 있어야됨
  • FileOrCreate : 실제 경로에 파일이 없다면 생성
  • File : 실제 파일이 었어야함

[3] PVC/PV

PVC : persistent volume chain , PV : persistent volume 으로, pod는 PV에 바로 연결하지 않고, PVC을 통해서 연결된다.

Pod의 영속성 있는 Volume을 제공하기 위한 개념이다.


Admin : 쿠버네티스를 담당하는 운영자
User : pod의 service를 만들고 배포를 관리하는 서비스 담당자
user의 pvc에 맞게 해당 pv에 연결됨.

프로세스는 아래와 같다.

  1. PV 정의 생성

  2. PVC 생성

  3. PV 연결

  4. Pod 생성 시 PVC 마운팅

실습

PV

volume의 형태는 로컬 volume, 외부의 원격으로 사용되는 volume이 있다.

로컬 volume의 실체는 hostpath와 같은 성격이다. (사실 로컬 volume은 잘 안씀)

PV에 연결되는 pod들은 yaml에서 지정한 node1에 만들어진다.

pod들을 해당 노드에 생성하도록 강제하는 점에서 데이터의 영속성이 보장되는 것이다. pod가 재생성되도 지정된 node에 재생성되므로 hostPath의 문제가 해결된다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-03
spec:
  capacity:
    storage: 2G
  accessModes:
  - ReadWriteOnce
  local:
    path: /node-v
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}
  • accessModes : ReadWriteOnce / ReadOnlyMany

  • storage

PVC

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

storageClassName:”” 로 두면 만들어진 PVC와 맞는 PV에 알아서 할당된다.

accessModes와 storage를 고려해서!

PVC에서 요구하는 storage가 PV의 storage보다 모두 크다면 연결이 PENDING이 된다.(작은 경우는 연결됨)

Pod

apiVersion: v1
kind: Pod
metadata:
  name: pod-volume-3
spec:
  containers:
  - name: container
    image: kubetm/init
    volumeMounts:
    - name: pvc-pv
      mountPath: /mount3
  volumes:
  - name : pvc-pv
    persistentVolumeClaim:
      claimName: pvc-01


해당 게시글은 ‘대세는 쿠버네티스 초중급편’ 강의와 ‘컨테이너 인프라 환경 구축을 위한 쿠버네티스.도커_조훈’ 도서를 바탕으로 작성하였습니다.

Categories:

Updated:

Leave a comment