목록
들어가며
- 컨테이너 내의 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에 대해 알아보았습니다.
아티클이 유용했나요?
훌륭합니다!
피드백을 제공해 주셔서 감사합니다.
도움이 되지 못해 죄송합니다!
피드백을 제공해 주셔서 감사합니다.
피드백 전송
소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.