관리 메뉴

피터의 개발이야기

[Kubernetes] 쿠버네티스 볼륨 개념 1편 (emptryDir, hostPath) 본문

Kubernetes/기초공부

[Kubernetes] 쿠버네티스 볼륨 개념 1편 (emptryDir, hostPath)

기록하는 백앤드개발자 2022. 10. 12. 23:49
반응형

 

ㅁ 쿠버네티스 볼륨

 쿠버네티스 환경에서 노드에 장애가 발생하면 컨테이너를 새로 실행하기 마련이다. 그렇기 때문에 쿠버네티스는 기본적으로 컨테이너는 stateless를 추구하고 있다. 이를 통해 서비스를 자동으로 쉽게 운영할 수 있는 장점을 가지게 되지만, 데이터를 꼭 보존해야할 경우 단점이 될 수 있다. 앱의 특성에 따라 컨테이너에 문제가 발생해도 데이터를 보존하기 위해 볼륨을 사용한다. 볼륨을 사용하면 컨테이너가 재시작하여도 데이터를 유지할 수 있다. 더욱이 퍼시스턴트 볼륨을 사용하여 노드에 종속하지 않고 다른 노드에서 컨테이너가 재시작하더라도 볼륨의 데이터를 그대로 사용할 수 있다. 볼륨이나 퍼시스턴트 볼륨을 사용하면 서버 하나에 종속되지 않고 데이터를 접근하여 안정적으로 서비스를 운영할 수 있다.

 

컨테이너 내의 디스크에 있는 파일은 임시적이며, 컨테이너에서 실행될 때 애플리케이션에 적지 않은 몇 가지 문제가 발생한다. 한 가지 문제는 컨테이너가 크래시될 때 파일이 손실된다는 것이다. kubelet은 컨테이너를 다시 시작하지만 초기화된 상태이다. 두 번째 문제는 Pod에서 같이 실행되는 컨테이너간에 파일을 공유할 때 발생한다. 쿠버네티스 볼륨 추상화는 이러한 문제를 모두 해결한다. (쿠버네티스 개념문서 > 스토리지 > 볼륨 글)

 

 

ㅁ 스토리지의 종류와 클러스터 구성

  본격적으로 볼륨의 종류를 이해 하기에 앞서, 데이터를 저장할 목적과 그에 맞는 볼륨의 형태를 고르는 것도 중요한다.

 크게 볼륨 중에서 내부 호스트의 디스크를 사용하는 emptyDir과 hostPath와 외부 스토리지 시스템을 연동하여 사용하는 퍼시스턴트, EFS 형태로 나누어 볼 수 있다. 내부 호스트의 경우 볼륨이 종속되어 있는 Pod나 Node의 생명주기에 따라 삭제가 된다. 한편 외부 스토리지는 영구볼륨으로 Node나 Pod가 삭제가 되더라도 데이터는 영구 보존할 수 있다. 그렇기 때문에 외부 스토리지 시스템을 연동하면 데이터를 보다 안정적으로 보존할 수 있다.

 먼저 내부적으로 사용할 수 있는 볼륨의 종류와 그 특징을 살표보도록 하자.

 

 

ㅁ emptyDir

  emptyDir  노드의 디스크를 파드가 일시적으로 사용하는 방법이다. 그래서 emptyDir은 Pod가 삭제되면 볼륨도 같이 삭제되는 임시적 성격을 가진다. 그래서 임시 데이터를 보관할 때에 유리하다. Pod가 Scale in out 되면 임시 데이터는 자동으로 정리가 되기 때문이다. emptyDir 볼륨은 파드가 노드에 할당될 때 처음 생성되며, 해당 노드에서 파드가 실행되는 동안에만 존재한다. 파드 내 모든 컨테이너는 emptyDir 볼륨에서 동일한 파일을 읽고 쓸 수 있지만, 해당 볼륨은 각각의 컨테이너에서 동일하거나 다른 경로에 마운트될 수 있다.

 

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    # 마운트할 볼륨의 이름. 실행될 컨테이너 안에 마운트할 경로. 없으면 자동 생성됨
    - mountPath: /cache
      name: cache-volume
  volumes:
  	# 위에 선언한 cache-volume을 사용지정함
  - name: cache-volume
    emptyDir: {}

 

ㅁ hostPath

hostPath는 호스트 노드의 파일이나 디렉토리를 파드에 마운트 해서 볼륨으로 사용하여 노드 상의 다른 파드와 볼륨을 공유할 수 있다. 주의할 점은 호스트의 파일이나 디렉토리를 무분별하게 공유할 경우 보안상에 문제가 발생할 수 있다. HostPath 볼륨을 사용해야 하는 경우, 필요한 파일 또는 디렉터리로만 범위를 지정하고 ReadOnly로 마운트해야 한다. hostPath는 minikube처럼 외부 스토리지를 사용할 수 없는 곳에서 간단하게 사용하는 용도가 적당할 것 같다.

 

apiVersion: v1
kind: Pod
metadata:
  name: test-webserver
spec:
  containers:
  - name: test-webserver
    image: k8s.gcr.io/test-webserver:latest
    volumeMounts:
    - mountPath: /var/local/aaa
      name: mydir
    - mountPath: /var/local/aaa/1.txt
      name: myfile
  volumes:
  - name: mydir
    hostPath:
      # 호스트의 디렉토리 위치, 파일 디렉터리가 생성되었는지 확인 필요.
      path: /var/local/aaa
      type: DirectoryOrCreate
  - name: myfile
    hostPath:
      path: /var/local/aaa/1.txt
      type: FileOrCreate

 

 지금까지 내부 스토리지를 이용한 볼륨에 대해서 알아보았다. 내부 스토리지의 경우 Pod와 Node 다운되면 데이터 분실이 발생할 수 있기 때문에 데이터의 영속성을 보장할 수 었다. 이를 해결하기 위한 외부 스토리지 시스템을 연동한 퍼시스턴트 볼륨에 대해서 알아보고 더 나아가 볼륨을 공유할 수 있는 EFS에 대해서도 알아 보도록 하겠다.

 

[Kubernetes] 쿠버네티스 볼륨 개념 2편 

 

ㅁ 함께 보면 좋은 사이트

 

볼륨

컨테이너 내의 디스크에 있는 파일은 임시적이며, 컨테이너에서 실행될 때 애플리케이션에 적지 않은 몇 가지 문제가 발생한다. 한 가지 문제는 컨테이너가 크래시될 때 파일이 손실된다는 것

kubernetes.io

 ㅇ 쿠버네트스 개념 문서 > 스토리지 > 볼륨

반응형
Comments