Volume이 뭔가요?

작성자 김아름 수정일 2022-10-17 15:24

#volume, #emptyDir, #hostPath, #kubernetes, #쿠버네티스

목록


들어가며

  • 컨테이너 내의 disk에 있는 파일은 임시적이라 컨테이너가 crash될 때 파일은 손실 됩니다.

  • kubelet은 컨테이너를 다시 시작하지만, 파일이 손실 되어 초기화된 상태로 시작됩니다.

  • 또한, multi container pod인 경우 컨테이너 간 파일 공유 시 문제가 발생할 수 있습니다.

  • 쿠버네티스는 이러한 문제를 해결하기 위해 볼륨을 제공합니다.



volume을 알아보자

쿠버네티스에서 제공되는 볼륨은 여러 종류가 있습니다.

그 중 emptyDir과 hostPath에 대해 알아보겠습니다.


  • emptyDir

emptyDir 볼륨은 pod가 노드에 할당될 때 처음 생성되며, pod가 실행되는 동안에만 존재합니다.

pod내 모든 컨테이너는 emptyDir 볼륨을 통해 동일한 파일을 읽고 쓸 수 있지만,

pod가 제거된다면 emptyDir의 데이터는 삭제됩니다.


apiVersion: v1
kind: Pod
metadata:
  name: web
spec:
  containers:
  - image: smlinux/cowsay-web
    name: web-generator
    volumeMounts:
    - name: html
      mountPath: /webdata
  - image: nginx:1.14
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
  volumes:
  - name: html
    emptyDir: {}

위 예시를 보면, web-generator 컨테이너의 /webdata와 web-server 컨테이너의 /usr/share/nginx/html이 emptyDir로 마운트 되어있습니다.


각각의 컨테이너에 접속하여 두 경로가 마운트 되어있는지 확인해보겠습니다.

docker ps | grep k8s_web
c082b7285cbf   nginx   "nginx -g 'daemon of…"   About a minute ago   Up About a minute
3945cd5d297f   smlinux/cowsay-web   "/bin/web-generator.…"   About a minute ago   Up About a minute

위 결과로 알아낸 컨테이너의 아이디를 복사합니다.


두 컨테이너로 접속하여, 마운트된 경로의 데이터를 확인해봅니다.

docker exec -it <container ID> /bin/bash

docker exec -it 3945cd5d297f /bin/bash
cd /webdata/
ls -al
total 4
drwxrwxrwx 2 root root  24 Sep 19 05:05 .
drwxr-xr-x 1 root root  32 Sep 19 05:05 ..
-rw-r--r-- 1 root root 326 Sep 19 05:08 index.html
root@web:/webdata# cat index.html 
 ________________________________________
/ Tomorrow will be cancelled due to lack \
\ of interest.                           /
 ----------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

docker exec -it c082b7285cbf /bin/bash
cd /usr/share/nginx/html/
ls -al
total 4
drwxrwxrwx 2 root root  24 Sep 19 05:05 .
drwxr-xr-x 3 root root  18 Mar 26  2019 ..
-rw-r--r-- 1 root root 293 Sep 19 05:09 index.html
cat index.html 
 ________________________________________
/ Avert misunderstanding by calm, poise, \
\ and balance.                           /
 ----------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

두 컨테이너는 지정된 경로에서 공유되고 있음을 확인할 수 있습니다.


  • hostPath

hostPath 볼륨은 호스트 노드의 파일시스템에 있는 파일이나, 디렉터리를 pod에 마운트합니다.


hostPath 볼륨은 보안 위험이 있기 때문에, 필요한 파일 혹은 디렉터리만을 범위로 지정하고 ReadOnly로 마운트 해야합니다.

hostPath는 Type을 지정하여 마운트 구성의 요구를 추가할 수 있습니다.

DirectoryOrCreate주어진 경로에 아무것도 없다면, kubelet의 소유권 혹은 권한을 0755로 설정한 빈 디렉터리를 생성
Directory주어진 경로에 디렉터리가 있어야 합니다.
FileOrCreate주어진 경로에 아무것도 없다면, kubelet의 소유권 혹은 권한을 0755로 설정한 빈 파일을 생성
File주어진 경로에 파일이 있어야 합니다.


apiVersion: v1
kind: Pod
metadata:
  name: web
spec:
  containers:
  - image: nginx:1.14
    name: nginx
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
  volumes:
  - name: html
    hostPath:
      path: /data/test/webdata

위 예시를 보면, nginx 컨테이너의 /usr/share/nginx/html과 호스트 노드의 /data/test/webdata가 마운트 되어 있습니다.


컨테이너 내부에서 파일 하나를 생성한 뒤, 호스트 경로에서 확인해보겠습니다.

먼저, 컨테이너의 아이디를 찾습니다.

docker ps | grep k8s_nginx_web
2f03568ce18b   295c7be07902                               "nginx -g 'daemon of…"   2 minutes ago   Up 2 minutes


컨테이너 내부로 들어가, test.txt 파일을 생성합니다.

docker exec -it <container ID> /bin/bash

cd /usr/share/nginx/html/
touch test.txt
ls -al
total 0
drwxr-xr-x 2 root root 22 Sep 19 05:20 .
drwxr-xr-x 3 root root 18 Mar 26  2019 ..
-rw-r--r-- 1 root root  0 Sep 19 05:20 test.txt


호스트 경로에서 생성한 파일을 확인해 봅니다.

cd /data/test/webdata/
ls -al
total 0
drwxr-xr-x 2 root root 22 Sep 19 14:20 .
drwxr-xr-x 3 root root 63 Sep 19 14:18 ..
-rw-r--r-- 1 root root  0 Sep 19 14:20 test.txt

두 디렉터리가 공유되고 있음을 알 수 있습니다.



마무리

  • 컨테이너 내부의 데이터를 저장하기 위한 볼륨에 대해 알아보았습니다.

  • 그 중 emptyDir과 hostPath에 대해 알아보았습니다.

아티클이 유용했나요?

훌륭합니다!

피드백을 제공해 주셔서 감사합니다.

도움이 되지 못해 죄송합니다!

피드백을 제공해 주셔서 감사합니다.

아티클을 개선할 수 있는 방법을 알려주세요!

최소 하나의 이유를 선택하세요
CAPTCHA 확인이 필요합니다.

피드백 전송

소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.

02-558-8300