Please enable JavaScript to view the comments powered by Disqus.6장. 볼륨: 컨테이너에 디스크 스토리지 연결
Search
🌬️

6장. 볼륨: 컨테이너에 디스크 스토리지 연결

파드는 내부적으로 CPU, RAM, 네트워크 인터페이스 등의 resource를 공유하는 논리적 host와 유사하다. 프로세스가 disk 또한 공유할 수 있을것 같지만 그렇지 않다. 파드 내부의 각 container는 고유하게 분리된 파일 시스템을 가진다.
이곳에서 다루는 내용은 다음과 같다
다중 컨테이너 pod 생성
container 간 disk storage 공유를 위한 볼륨 생성
파드 내부에 git repo 사용
파드에 GCE persistence disk 와 같은 persistant storage 연결
persistent stroage 동적 프로비저닝
새로운 container 가 시작할 때마다 container 이미지를 빌드할 때 추가한 파일들을 갖는 container 를 시작한다. 파드 내에서 컨테이너가 재시작 한다는 관점에서 살펴볼 때, 새로 시작한 container 는 이전 container 가 생성해둔 어떠한 파일도 볼 수 없다.
하지만 전체 파일 시스템이 유지될 필요는 없지만 실제 data를 가진 directory를 보존하고 싶을 수도 있다.
storage volume 은 pod 와 같은 최상위 resource는 아니지만 pod 의 일부분으로 정의되며 파드와 동일한 life cycle 을 가진다. → 파드가 시작되면 volume 이 생성되고, 파드가 삭제되면 volume 이 삭제

볼륨 소개 (Introducing volumes)

k8s volume 은 pod의 구성 요소이고 container 와 동일하게 pod 스펙에 정의된다. 독립적인 k8s 오브젝트가 아니기 때문에 자체적으로 생성, 삭제가 될 수 없다.
pod의 모든 container 가 volume 에 접근할 수 있지만, 접근하기 위해선 각각 mount 가 돼야 한다.

예제의 volume 설명

1번 컨테이너 - WebServer
/var/htdocs/ 에 HTML 페에지를 서비스한다.
/var/logs 에 accss log 를 저장한다
2번 컨테이너 - ContentAgent
/var/html 에 HTML 파일을 생성하는 agent를 실행한다.
3번 컨테이너 - LogRotator
/var/logs 에 로그를 처리한다
각 container는 단일 책임을 갖고 있지만, 자체적으론 쓸모가 없다.
contentAgent는 HTML을 생성하기만 할 뿐 웹 서버 역할은 1번이 수행한다.
그래서 2번(content agent)이 생성한 HTML 파일에 1번(web server)가 접근하지 못한다면 큰 의미가 없다.
그러나 2번 container가 HTML을 특정한 곳에 만들어놓고, 1번 container 가 그곳에 접근하여 web server 의 기능을 수행하고, 1번에 접속해서 발생되는 로그가 저장된곳에 3번에 접근해서 로그에 관련된 작업을 수행한다면 더 나은 시스템이 생성된다.
즉, 같은 volume을 두 개의 container 에 mount 하면 container 는 동일한 파일로 동작할 수 있다.
예제의 경우 2개의 volume을 3개 container 에 mount 하는 것이 된다.
publicHtml
1번의 /var/htdocs/ 을 mount
2번의 /var/html/ 을 mount
logVol
1번의 /var/logs/ 을 mount
3번의 /var/logs/ 를 mount 한다
각 container 들은 그들의 역할에 맞게 필요한 곳에 접근하여 필요한 임무를 수행한다.
(2번 container는 logVol에 접근할 필요가 없다)
container 에서 접근하려면 pod 에 volume 을 정의하는 것만으로는 충분하지 않고 volumeMount를 container spec 에 정의 해야 한다.

사용 가능한 볼륨 유형 소개

여기 있는거 다 몰라도 된다. 저자만 해도 반 정도만 알고 있다고 한다. 아마도 직종이나 바꾸지 않는 이상 사용하는 것만 사용하게 될 것이다.
emptyDir: 일시적인 데이터를 저장한다, 테스트 용도, 초기 데이터 저장
hostPath: worker node 의 file system을 pod 의 directory 로 사용한다
config file, CA 인증서 와 같이 공통으로 사용하는 파일을 위해 사용하며, Log 를 모두 동일한 hostPath에 두기도 한다.
gitRepo: git repository의 contents를 checkout 해 초기화한 volume 이다.
NFS: NFS 공유를 파드에 마운트 한다
gcePersistentDisk: 클라우드 제공자의 storage mount
cinder, cephfs, iscsi, flocker, glusterfs, quobyte, rbd, flexVolume, vsphereVolume, photonPersistentDisk, scaleIO: 다른 유형의 network storage 를 mount 하는데 사용한다.
configMap, secret, downwardAPI: k8s resource나 cluster 정보를 파드에 노출할 때 사용한다
persistentVolumeClaim: 사전에 혹은 동적으로 프로비저닝된 persistent storage를 사용하는 방법이다.(6장)
configMap, secret, downwardAPI 와 같은 유형은 데이터를 저장하는 목적으로는 사용되지 않고, metadata를 pod에 실행 중인 application에 노출하는 데 사용되며 7, 8장에서 설명한다.

볼륨을 사용한 컨테이너간 공유 (Using volumes to share data between containers)

하나의 pod에 있는 n개의 container가 데이터를 공유하는 방법을 살펴본다

emptyDir 볼륨 사용 (Using an emptyDir volume)

이름에서 볼 수 있는 빈 directory 로 시작된다. pod 에서 실행중인 application은 어떤 것이든 이 volume 에 쓰기가 가능하다. 단, volume 은 pod 에 묶여있기 때문에 pod 가 삭제되면 volume 의 contents는 사라진다.
동일 pod에 존재하는 container 간 파일을 공유할 때 유용하다
메모리에 넣기에 큰 데이터 정렬과 같은 작업에도 유용하다
데이터는 container 자체 파일 시스템에도 쓸 수 있지만 write는 불가능한 경우도 있다.

Pod에 emptyDir 볼륨 사용

웹 서버 container 와 contents-agent, HTML을 위한 단일 볼륨으로 pod 를 구성한다
Nginx를 웹 서버로 사용하고 fortune 명령으로 HTML을 생성한다
index.html을 저장하는 script을 생성한다
docker hub 에 푸쉬해놓은 다음 lukas/fortune 이미지를 사용한다
FROM ubuntu:latest RUN apt-get update ; apt-get -y install fortune ADD fortuneloop.sh /bin/fortuneloop.sh ENTRYPOINT /bin/fortuneloop.sh
Docker
복사
docker build -t yevgnenll/fortune . docker push yevgnenll/fortune
Docker
복사

Pod 생성하기

apiVersion: v1 kind: Pod metadata: name: fortune spec: containers: - image: luksa/fortune name: html-generator volumeMounts: - name: html mountPath: /var/htdocs - image: nginx:alpine name: web-server volumeMounts: - name: html mountPath: /usr/share/nginx/html readOnly: true ports: - containerPort: 80 protocol: TCP volumes: - name: html emptyDir: {}
YAML
복사
html-generator 라는 이름으로 container 이름을 짓는다.
html volume 을 /var/htdocs 에 마운트 한다
웹 서버 이름은 web-server 이다.
html 볼륨을
/usr/share/nginx/html 에 mount 한다
html-generator 가 10초 마다 fortune 의 결과를 /var/htdocs/index.html 에 쓰기 시작한다.
web-server container 가 시작하자 마자 /usr/share/nginx/html/ 의 HTML을 서비스한다
client 가 pod의 80 포트로 보낸 요청은 fortune 메세지를 응답으로 받는다

실행 중인 파드 보기

kubectl port-forward fortune 8080:80
YAML
복사
그리고 curl 을 사용해서 요청을 보내보자
curl http:localhost:8080
YAML
복사