emptyDir 볼륨은 아무 데이터도 없는 빈 디렉토리를 제공해주는 볼륨이다. 파드가 생성하는 데이터를 저장할 수 있으며, 동일한 파드 내의 컨테이너 간에 데이터를 공유할 때 유용하게 사용할 수 있다. 또한, 빅 데이터와 같은 큰 데이터 셋트를 처리하기 위한 임시 저장소로도 사용 가능
•
최초로 volume이 생성될 때는 volume의 내용이 비어있기 때문에 emptyDir 이라고 불러짐
Container1이 Web1 역할을 하는 서버이고 Container2가 backend 단을 처리해주는 서버라면 web서버로 받는 특정 파일을 mount가 된 volume에 저장을 해놓고 backend의 Container도 volume에 mount해놓았다면 자신의 Local에 있는 파일처럼 사용이 가능합니다. 즉, 두 서버가 file을 주고 받을 필요없이 편하게 사용 가능
•
Volume은 그림에서 처럼 Pod안에서 생성이 되기 때문에 Pod에 문제가 생겨 재생성될 경우 Volume에 있는 데이터도 같이 삭제
emptyDir 볼륨 생성 및 확인
spec:
container:
- volumeMounts:
- name: <VOL-NAME>
mountPath: <PATH>
volumes:
- name: <VOL-NAME>
emptyDir: {}
YAML
복사
.spec.containers.volumeMounts: 컨테이너 마운트 할 볼륨을 선언
.spec.containers.volumeMounts.name: 사용할 볼륨 이름 ().spec.volumes 필드와 이름 참조
.spec.containers.volumeMounts.mountPath: 컨테이너 내의 마운트 포인트
.spec.volumes.name: 볼륨의 이름
.spec.volumes.emptyDir: emptyDir 타입의 볼륨 정의
•
{}: 값을 비워두면 호스트의 로컬 디스크를 사용
•
{ Memory }: tmpfs(RAM 기반 파일시스템)을 사용해 고성능의 볼륨을 제공
•
myapp-rs-emptydir.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp-rs-fortune
spec:
replicas: 1
selector:
matchLabels:
app: myapp-rs-fortune
template:
metadata:
labels:
app: myapp-rs-fortune
spec:
containers:
- name: web-server
image: nginx:alpine
volumeMounts:
- name: web-fortune
mountPath: /usr/share/nginx/html
readOnly: true
ports:
- containerPort: 80
- name: html-generator
image: nginx:latest
command:
[
"/bin/sh",
"-c",
"while true; do echo 'Hello from html-generator' > /var/htdocs/index.html; sleep 30; done",
]
volumeMounts:
- name: web-fortune
mountPath: /var/htdocs
volumes:
- name: web-fortune
emptyDir: {}
YAML
복사
kubectl get pods --selector=app=myapp-rs-fortune
# html-generator
k exec -it myapp-rs-fortune-2jz5n -c html-generator -- /bin/sh
cat /var/htdocs/index.html
> Hello from html-generator
# web-server
k exec -it myapp-rs-fortune-2jz5n -c web-server -- /bin/sh
cat /usr/share/nginx/html/index.html
> Hello from html-generator
Shell
복사
web-fortune 이란 이름의 EmptyDir 볼륨을 정의했으며, web-server 컨테이너는 nginx:alpine 웹 서버 이미지로 /usr/share/nginx/html 디렉토리에 볼륨을 마운트 하며, html-genertor 컨테이너는 nginx:latest이미지를 사용하여 같은 볼륨을 /var/htdocs 디렉토리에 마운트 합니다.
•
서비스 생성 시에도 ClusterIP와 Endpoint 모두 같은 값을 출력함.
gitRepo 볼륨
gitRepo 볼륨은 디렉터리를 탑재하고 컨테이너 시작 시 지정된 Git 리포지토리를 해당 디렉터리에 복제한다.
컨테이너 인스턴스의 gitRepo 볼륨을 사용하면 애플리케이션에서 코드를 추가하지 않아도 된다.
volumes:
- name: <VOL-NAME>
gitRepo:
repository: <GIT-REPO-URL>
revision: <BRANCH>
directory: <PATH>
YAML
복사
.volumes.gitRepo: gitRepo 볼륨 정의
.volumes.gitRepo.repository: Git 저장소의 주소
.volumes.gitRepo.revision: 저장소의 브랜치
volumes.gitRepo.directory: 저장소의 특정 경로 지정
초기화 컨테이너
gitRepo 볼륨 유형은 더 이상 사용되지 않기 때문에 대신, Git 저장소가 있는 컨테이너를 프로비전 하려면 초기화 컨테이너(InitContainer)에 EmptyDir 볼륨을 마운트하고, 여기에 git 명령을 사용해서 Git 저장소를 복제하고, 파드 컨테이너에서 emptyDir 볼륨을 마운트.
초기화 컨테이너는 파드의 애플리케이션 컨테이너가 실행되기 전에 여러가지 작업을 수행하도록 설정할 수 있는 컨테이너.
초기화 컨테이너는 애플리케이션 컨테이너가 실행되기 전 딱 한 번만 실행되며, 초기화 컨테이너가 실패 시 성공할 때까지 재시도를 하게 되며, 초기화 컨테이너가 성공하기 전까지는 애플리케이션 컨테이너는 실행되지 않음.
•
참고로, 초기화 컨테이너는 Readiness Probe 는 지원하지 않습니다.
•
myapp-pod-git.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod-git
spec:
initContainers:
- name: git-clone
image: alpine/git
args:
- clone
- --single-branch
- --
- https://github.com/kubernetes/kubernetes
- /repo
volumeMounts:
- name: git-repository
mountPath: /repo
containers:
- name: git-container
image: busybox
args: ['tail', '-f', '/dev/null']
volumeMounts:
- name: git-repository
mountPath: /repo
volumes:
- name: git-repository
emptyDir: {}
YAML
복사
kubectl exec -it myapp-pod-git -c git-container -- /bin/sh
cd /repo
ls
Shell
복사
•
초기화 컨테이너는 쿠버네티스 저장소를 Git으로 클론하며 이를 /repo 디렉토리에 저장.
•
/repo 디렉토리는 emptyDir 타입의 볼륨인 git-repository로 제공.
•
초기화 컨테이너가 성공하면, git-container 컨테이너에서 똑같은 git-repository 볼륨을 마운트