[kubernetes] - emptyDir 볼륨을 사용한 컨테이너 간 데이터 공유
테스트 전 간단하게 쿠버네티스의 볼륨에 대해 정리하자면, 파드 내부의 각 컨테이너는 고유하게 분리된 파일시스템을 가진다.
새로 시작한 컨테이너는 이전에 실행했던 컨테이너에 쓰여진 파일시스템을 접근할 수 없다.(같은 파드에 실행된다고 해도 마찬가지)
하지만 새로운 컨테이너가 이전에 종료된 위치에서 계속되기를 원한다면 (실제 데이터를 가진 디렉터리를 보존하고 싶을 수도 있다.)
쿠버네티스는 스토리지 볼륨을 정의하는 방법으로 해당 기능을 제공한다.
[볼륨 소개]
- 쿠버네티스 볼륨은 파드의 구성요소로 컨테이너와 동일하게 파드 스펙에서 정의된다.
- 볼륨은 독립적인 오브젝트가 아니므로 자체적으로 생성, 삭제될 수 없다.
- 볼륨은 파드의 모든 컨테이너에서 사용 가능하지만 접근하려는 컨테이너에서 각각 마운트되어야 한다.(마운트 경로는 상관없음)
[사용 가능한 볼륨 유형]
-emptyDir : 일시적인 데이터를 저장하는 데 사용되는 간단한 빈 디렉터리
-hostPath : 워커 노드의 파일시스템을 파드의 디렉터리로 마운트하는 데 사용
-gitRepo : 깃 리포지터리의 콘텐츠를 체크아웃해 초기화한 볼륨 (현재 deprecated)
-nfs : NFS 공유를 파드에 마운트
-gcePersistenDisk, awsElasticBlockStore, azureDisk : 클라우드 제공자의 전용 스토리지를 마운트하는 데 사용
-cinder,cephfs, iscsi, flocker, glusterfs, quobyte, rbd, flexVolume, vsphereVolume, photonPersistenDisk, scaleIO : 다른 유형의 네트워크 스토리지를 마운트하는 데 사용
-configMap, secret, downwardAPI : 쿠버네티스 리소스나 클러스터 정보를 파드에 노출하는 데 사용되는 특별한 유형의볼륨(데이터를 저장하는 데 사용되지 않음)
-persistenVolumeClaim : 사전에 혹은 동적으로 프로비저닝된 퍼시스턴스 스토리지를 사용하는 방법
==========================================================================================
emptyDir 볼륨을 사용한 컨테이너 간 데이터 공유
해당 컨테이너들을 통해 하나의 파드에 있는 컨테이너 간의 데이터 공유를 테스트 해보았다.
컨테이너1 : fortune 명령을 통해 임의로 생성한 출력을 index.html에 저장하는 스크립트를 실행하는 이미지를 생성하여 컨테이너 이미지로 사용한다.
컨테이너2 : apache를 웹서버로 사용한다.
[도커파일에 포함할 셸 스크립트(test.sh)]
> 임의의 텍스트가 /var/www/html/index.html에 저장되도록 하는 셸 스크립트 구성
[Dockerfile]
> 해당 도커파일이 실행되면 test.sh 스크립트가 실행되도록 함
> test.sh 스크립트와 같은 디렉터리에 해당 Dockerfile 생성
[도커 빌드]
[NCP Container Registry에 업로드하기 위해 생성한 이미지(emptydirtest) 태그]
[NCP Container Registry에 이미지 Push]
[동일한 볼륨(emptyDir)을 공유하는 컨테이너 두 개가 있는 파드 메니페스트]
> 첫 번째 컨테이너(html-generator)은 위에서 생성한 emptydirtest:latest 이미지를 실행하며 볼륨(html)을 컨테이너의/var/www/html에 마운트한다.
> 두 번째 컨테이너(web-server)은 전에 생성한 apache2:latest 이미지를 실행하며 동일한 볼륨(html)을 /var/www/html에읽기 전용으로 마운트한다.
> html이란 단일 emptyDir 볼륨을 컨테이너 두 개에 마운트한다.
[파드 생성 후 확인]
> html-generator 컨테이너가 시작되면 10초마다 fortune 명령의 결과를 /var/www/html/index.html에 쓰기 시작하며 볼륨이 /var/www/html에 마운트되었으므로 Index.html 파일은 컨테이너의 최상단 레이어가 아닌 볼륨에 쓰여진다.
> web-server 컨테이너가 시작되면 컨테이너는 /var/www/html 디렉터리의 HTML 파일을 서비스하기 시작하며 볼륨에해당 경로에 마운트되었기에 apache는 html-generator 컨테이너가 작성한 index.html 파일(fortune 명령어를 통해 임의의 텍스트 출력)을 서비스한다.
> 클라이언트가 파드의 포트 80으로 HTTP 요청을 하면 fortune 메세지를 응답받는다.
[curl을 통한 Pod 응답 확인]
> 간격을 두고 요청을 보내면 다른 메세지가 뜨는 것을 확인할 수 있다.
emptyDir 볼륨은 가장 단순한 볼륨의 유형이지만 다른 유형들도 emptyDir 볼륨을 기반으로 한다.