engal1991 / Docker-Kubernetes

0 stars 0 forks source link

[09장: 퍼시스턴트 볼륨(PV)과 퍼시스턴트 볼륨 클레임(PVC)] 9.1 로컬 볼륨 : hostPath, emptyDir #32

Open engal1991 opened 2 years ago

engal1991 commented 2 years ago

9.1.1 워커 노드의 로컬 디렉터리를 볼륨으로 사용 : hostPath

9.1.2 포드 내의 컨테이너 간 임시 데이터 공유 : emptyDir

N3theri9N commented 2 years ago

디플로이먼트의 각 포드는 별도의 데이터를 가지고 있지 않으며 단순 요청에 대한 응답만을 반환해왔다. DB 와 같이 포드 내부에서 특정 데이터를 보유해야하는 상태가 있는 앱의 경우에도 쿠버네티스에도 호스트에 위치한 디렉토리를 각 포드와 공유함으로써 데이터를 보존하는 것이 가능하다.

쿠버네티스틑 퍼시스턴트 볼륨(PV)을 사용하기 위한 기능을 자체적으로 제공한다.

image

간단히 사용해볼 수 있는 볼륨으로는 2가지가 있다.

9.1.1 워커 노드의 로컬 디렉터리를 볼륨으로 사용 : hostPath

호스트의 디렉토리를 포드와 공유해 데이터를 저장하는 방식이다. image

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 볼륨은 모든 노드에 배치해야하는 특수한 포드의 경우만 유용하게 사용 가능하다.

9.1.2 포드 내의 컨테이너 간 임시 데이터 공유 : emptyDir

image

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 를 통해 컨테이너에 공유해주는 사이드카 컨테이너를 생각해볼 수도 있다.