Open engal1991 opened 2 years ago
디플로이먼트의 각 포드는 별도의 데이터를 가지고 있지 않으며 단순 요청에 대한 응답만을 반환해왔다. DB 와 같이 포드 내부에서 특정 데이터를 보유해야하는 상태가 있는 앱의 경우에도 쿠버네티스에도 호스트에 위치한 디렉토리를 각 포드와 공유함으로써 데이터를 보존하는 것이 가능하다.
쿠버네티스틑 퍼시스턴트 볼륨(PV)을 사용하기 위한 기능을 자체적으로 제공한다.
간단히 사용해볼 수 있는 볼륨으로는 2가지가 있다.
호스트의 디렉토리를 포드와 공유해 데이터를 저장하는 방식이다.
volumeMounts:
- name : my-hostpath-volume
mountPath: /etc/data
volumes:
- name : my-hostpath-volume
hostPath:
path : /tmp
예시는 볼륨에서 hostPath 항목을 정의하여 호스트의 /tmp 를 포드의 /etc/data 에 마운트 -> 포드 컨테이너의 /etc/data 와 호스트의 /tmpe 는 동일한 디렉토리로 사용.
kubectl exec -it hostpath-pod touch /etc/data/mydata
ls /tmp/mydata
/tmp/mydata
다만 이러한 보존은 바람직하지 않음 : 디플로이먼트 포드에 장애생겼을경우 다른 노드로 포드가 옮겨진다면 이전 노드에 저장된 데이터를 사용할 수 없음.
hostPath 볼륨은 모든 노드에 배치해야하는 특수한 포드의 경우만 유용하게 사용 가능하다.
emptyDir 볼륨은 포드의 데이터를 영속적으로 보존하기 위해 외부볼륨을 사용하는 것이 아닌 포드가 실행하는 도중에만 휘발성 데이터를 각 컨테이너가 함께 사용할 수 있도록 임시저장공간을 생성한다. emptyDir 디렉토리는 비어잇는 상태로 생성되며 포드가 삭제되면 emptyDir 에 저장되던 데이터도 함께 삭제된다.
아파치 웹 서버를 실행하는 포드를 생성으로 예
(전략)
metadata :
name : emptydir-pod
spec:
containers :
- name : content-creator
image :
volumeMounts :
- name: my-emptydir-volume
mountPath : /data #1. 이 컨테이너가 /data 파일을 생성
- name : apache-webserver
image : httpd:2
volumeMounts :
- name: my-emptydir-volume
mountPath : /usr/local/apache2/htdocs/ #2. 아파치 웹 서버에서 접근할 수 있음.
volumes :
- name: my-emptydir-volume
emptyDir : {} # 포드 내에서 파일을 공유하는 emptyDir
emptyDir 은 한 컨테이너가 파일을 관리하고 한 컨테이너가 그 파일을 사용하는 경우에 유용하게 사용할 수 있음. content-creator 컨테이너 내부로 들어가 /data 디렉토리에 웹 컨텐츠를 생성 -> 아파치 웹 서버 컨테이너의 htdocs 디렉토리에서도 동일하게 웹 컨텐츠 파일이 생성. -> 웹 서버에 의해 외부에 제공된다.
$kubectl apply -f emptydir-pod.yaml
pod/emptydir-pod created
$ kubectl exec -it emptydir-pod -c content-creator sh
# echo Hello, Kubernetes! >> /data/test.html
$ kubectl describe pod emptydir-pod | grep IP
Annotations : cni.projectcalico.org/podIP : 172.17.0.8
IP : 172.17.0.8
$ kubectl run -i --tty --rm debug --image=alick106/ubuntu:curl --restart=Never -- curl 172.17.0.8/test.html
Hello, Kubernetes!
예시로 깃 허브 소스코드를 받아와 emptyDir 를 통해 컨테이너에 공유해주는 사이드카 컨테이너를 생각해볼 수도 있다.
9.1.1 워커 노드의 로컬 디렉터리를 볼륨으로 사용 : hostPath
9.1.2 포드 내의 컨테이너 간 임시 데이터 공유 : emptyDir