Container/Kubernetes

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

Nirsa 2020. 3. 6. 01:34
반응형

 

  • 볼륨을 사용해야하는 이유?

컨테이너 특성 상 어떠한 문제가 발생하여 컨테이너가 삭제 된다면 데이터도 같이 삭제 됩니다. 웹 소스 파일의 경우 이미지에 들어있어 삭제 되더라도 상관 없겠지만(컨테이너에서 웹소스를 변경하지 않는 이상) 로그 파일을 보관해야 한다거나, 데이터 베이스를 사용할 경우 실시간으로 생성되던 데이터가 사라지면 큰 장애가 발생 합니다.

이러한 이유로 컨테이너를 사용할 때 중요한 데이터가 있다면 볼륨을 사용하여 데이터를 보관해주어야 합니다.

 

  • 1-1. emptryDir 개념과 예시 코드

emptryDir은 Pod가 사라지면 볼륨도 같이 삭제되는 임시 볼륨의 성격을 가지고 있고 Pod가 실행되는 디스크의 공간에  볼륨 마운트를 하게 됩니다.

위의 이유로 Life cycle이 컨테이너가 아닌, Pod 단위로 되어있어서 컨테이너가 어떠한 문제로 삭제되어도 Pod는 실행중이므로 데이터는 emptyDir에 의해 보관되며 Pod가 삭제되는 순간 emptyDir로 보관중이던 모든 데이터는 삭제 됩니다.

apiVersion: v1
kind: Pod
metadata:
  name: emptydir-pod
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - mountPath: /emptydir
      name: emptydir-volume
  volumes:
  - name: emptydir-volume
    emptyDir: {}
  • spec.containers.volumeMounts.mountPath → 실행될 컨테이너 안에 마운트할 경로 입니다. 컨테이너 안에 해당 디렉토리가 없더라도 자동으로 생성 해줍니다.
  • spec.containers.volumeMounts.mountPath → 마운트할 볼륨의 이름 입니다.
  • spec.voluems → 위에 작성한 emptydir-volume을 사용하도록 지정 해줍니다.

 

  • 1-2 emptyDir 기존 컨테이너 종료 후 새로운 컨테이너에 데이터가 남아있는지 확인

kubectl exec -it [pod name] bash을 입력하여 생성한 emptydir-pod의 쉘로 진입하여 확인하면 마운트 경로로 설정한 /emptydir이 자동으로 생성되어있는 모습을 볼 수 있습니다.

 

해당 Pod가 생성된 노드로 접속하여 emptydir-pod에 있는 nginx 컨테이너를 삭제 하였고, 이후 쿠버네티스에 의해 컨테이너가 다시 생성되는걸 확인 하였습니다.

 

다시 마스터 노드로 돌아와서 emptydir-pod에 bash로 접속 후 확인해보면 새로 생긴 컨테이너에 test.txt 파일이 남아있는것을 확인할 수 있습니다.

 

  • 1-3 emptyDir Pod 삭제 후 데이터가 삭제되는 내용 확인

emptrydir pod가 생성된 워커노드에서 아래와 같이 Pod 삭제 전/후를 비교하면 데이터가 삭제되는것을 확인하실 수 있습니다.

 

  • 2-1. hostPath 개념과 예시 코드

hostPath는 노드의 디스크에 볼륨을 생성하여 Pod가 삭제 되더라도 볼륨에 있던 데이터는 유지 됩니다.

apiVersion: v1
kind: Pod
metadata:
  name: hostpath-pod
spec:
  containers:
  - name: hostpath-pod
    image: nginx
    volumeMounts:
    - mountPath: /hostpath
      name: hostpath-volume
  volumes:
  - name: hostpath-volume
    hostPath:
      path: /tmp/hostpath   # 해당 디렉토리가 존재해야 합니다.
      type: Directory
  • spec.containers.volumeMounts.mountPath → 실행된 컨테이너 안에 마운트할 경로 입니다. 컨테이너 안에 해당 디렉토리가 없더라도 자동으로 생성 해줍니다.
  • spec.containers.volumeMounts.name → 마운트할 볼륨의 이름 입니다.
  • spec.voluems.name → 위에 작성한 hostpath-volume을 사용하도록 지정 해줍니다.
  • spec.voluems.hostPath → 노드에 마운트할 경로를 정해주고 해당 경로는 Directory 라는것을 명시 합니다. 해당 디렉토리는 노드에 생성되어 있어야 하며, DirectoryOrCreate를 사용할 경우 디렉토리가 존재하지 않으면 디렉토리를 생성 해줍니다.

주의해야할 점은 여러개의 워커노드를 사용중인 환경이라면 가장 밑에 있는 부분 중 DirectoryOrCreate가 아닌, Directory를 사용했을 경우 Pod가 실행될 노드의 path에 작성한 디렉토리가 있어야 하므로 잘 확인해주어야 합니다.

만약, Directory를 명시하고 path에 작성한 디렉토리가 없을 경우 ContainerCreating 상태에서 생성되지 않습니다.

 

  • 2-2 hostPath Pod 종료 후 노드에 데이터가 남아있는지 확인

테스트를 위해 hostpath-pod를 bash로 진입 후 볼륨 마운트했던 /hostpath에 테스트 파일을 생성 합니다. 

 

이후 hostpath-pod가 생성된 노드로 이동하여 볼륨 마운트했던 /tmp/hostpath 경로를 확인해보면 위에서 생성한 hostpath-test.txt 파일이 정상적으로 생성된것을 확인할 수 있습니다.

 

다시 마스터노드로 돌아와서 hostpath-pod를 삭제 후 hostpath-pod가 생성 되었던 노드로 이동하여 확인해보면 Pod가 삭제되도 데이터가 그대로 유지되는것을 확인할 수 있습니다.

 

참고로 Pod가 생성된 인스턴스는 kubectl describe [pod name] 을 입력하면 Pod가 생성된 노드의 호스트명을 확인할 수 있고, 2편(pv, pvc)은 아래 링크에서 확인 가능 합니다.

 

쿠버네티스 볼륨 개념 2편 (PersistentVolume, PersistentVolumeClaim) : https://nirsa.tistory.com/157

 

반응형