파드 내부에서 컨테이너가 어떻게 외부 디스크 스토리지에 접근하는지, 어떻게 컨테이너간에 스토리지를 공유하는지를 살펴보자.

파드는, 내부에 프로세스가 실행되고 CPU,RAM, 네트워크 인터페이스 등의 리소스를 공유하는 논리적 호스트와 유사하다고 했다.

파드 내부의 각 컨테이너는 고유하게 분리된 파일 시스템을 가진다. 파일 시스템은 컨테이너 이미지에서 제공되기 때문이다.

새로 시작한 컨테이너는 이전에 실행했던 컨테이너에 쓰여진 파일 시스템의 어떤것도 볼 수가 없다.

새로운 컨테이너가 이전에 종료된 위치에서 계속되기를 원할 수 있다.

쿠버네티스는! 스토리지 볼륨을 정의하는 방법으로 이 기능을 제공한다.

6.1 볼륨소개

쿠버네티스 볼륨 : 파드의 구성요소로 컨테이너와 동일하게 파드 스펙에서 정의된다.

6.1.1 볼륨 예제

컨테이너 세개가 있는 파드.

서로 연관된 파드라면 볼륨이 필요함.

리눅스에서는 파일 시스템을 파일트리의 임의의 경로에 마운트 할 수 있다. → 마운트된 파일 시스템의 내용은 마운트된 파일 디렉터리에서 접근 가능하다.

6.1.2 사용가능한 볼륨 유형 소개

각 컨테이너는 볼륨을 마운트 할 수도 있고, 안할수도있음.

6.2 볼륨을 사용한 컨테이간 데이터 공유

하나의 파드에 있는 여러컨테이너에서 데이터 공유하는

6.2.1 emptyDir 볼륨 사용

볼륨이 빈 디렉터리로 시작된다. 파

파드에 실행중인 애플리케이션은 어떤파일이든 볼륨에 쓸 수 있음.

파드에 emptyDir 볼륨 사용

앞선 예제에서 볼륨 두개 →볼륨 한개로 가정

**Fortune 컨테이너 이미지 빌드하기
fortune 이라는 새 디렉터리 생성
fortuneloop.sh 셸 스크립트에 다음 내용을 작성한다.

#!/bin/bash
trap "exit" SIGINT
while:
do
	ehco $(date) Writing fortune to /var/htdocs/index.html
	/usr/games/fortune > /var/htdocs/index.html
	sleep 10
done

그런다음 동일 디렉터리에서 Dockerfile 생성하고 다음 내용 작성

FROME ubuntu:latest
RUN apt-get update ; apt-get -y install fortune
ADD fortunloop.sh /bin/fortuneloop.sh
ENTYPOINT /bin/fortuneloop.sh (이미지 실행시 해당 스크립트 실행되어야 함 명시)

해당 파일 두개 도커 허브에 업로드
$docker build -t pinetree0308/fortune .
$docker push pinetree0308/fortune**

파드 생성하기

fortune-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: fortune
spec:
  containers: 
  - image: luksa/fortune 해당 이미지 컨테이너에서 실행
    name: html-generator 해당 이름의 컨테이너 생성
    volumeMounts:
    - name: html
      mountPath: /var/htdocs  컨테이너의 해당 경로에 html 이란 이름의 볼륨마운트
  - image: nginx:alpine 해당 이름의 이미지 컨테이너에서 실행
    name: web-server 두번째 컨테이너이름
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html  위와 동일한 html 볼륨을 읽기전용으로 마운트
      readOnly: true
    ports:
    - containerPort: 80
      protocol: TCP
  volumes:
  - name: html 해당 이름의 emptyDir 볼륨을 위 컨테이너 두개에 마운트
    emptyDir: {}

파드는 컨테이너 두개, 각기 다른 경로로 마운트된 단일 볼륨 갖는다.

결과적으로 클라이언트 파드가 포트 80으로 보낸 http 요청은 fortune 메시지를 응답으로 받는다.

실행중인 파드보기

k port-forward fortune 8080:80

로컬머신의 포트를 파드로 포워딩

*포트포워딩 대신 서비스로 파드를 노출시킬 수도 있다.

$curl <http://localhost:8080>

emptyDir 을 사용하기위한 매체 저장하기

emptyDir은 파드를 호스팅하는 워커노드의 실제 디스크에 생성되므로 노드 디스크가 어떤 유형인지에따라 성능결정됨

or

emptyDir을 디스크가아닌 메모리를 사용하는 tmpfs파일 시스템으로 생성하도록 요청할 수 있다.

이 작업을 위해

volumes:
- name: html
	emptyDir:
		medium: Memory 이 emptyDir 의파일들은 memory에 저장될 것.

6.2.2 깃 리포지터리를 볼륨으로 사용하기 (건너뛰기)

사용 중단됨

깃레포를 사용하여 컨테이너를 프로비저닝 하려면

mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod's container.

6.3 워커노드 파일 시스템의 접근

대부분의 파드는 호스트 노드를 인식하지 못하므로 노드의 파일 시스템에 있는 어떤 파일에도 접근하면안된다. 그러나 특정 시스템 레벨의 파드 는 노드의 파일을 읽거나 파일 시스테믕ㄹ 통해 노드 디바이스를 접근하기 위해 노드의 파일 시스템 사용해야한다.

쿠버네티스는, hostPath 볼륨으로 가능케 한다.

6.3.1 hostPath 볼륨 소개

노드 파일 시스템의 특정 파일이나 디렉터리를 가리킨다.

6.3.2 hostPath 볼륨을 사용하는 시스템 파드 검사하기

이미 여러개의 시스템 파드 돌아가는 중이라 조회

k get pod s --namespace kube-system

첫번째로 조회된 파드가 어떤 종류의 볼륨을 사용하는지

*상태 유지 파드의 경우 statefulSet을 사용해야함.

kubectl describe po <pod name> --namespace kube-system

<aside> 💡

</aside>

hostpath 를 사용하는 파드군.

사실 다른 파드를 살펴보면, 대부분이 노드의 로그파일 or kubeconfig,ca 인증서를 접근하기 위해 이 유형의 볼륨을 사용한다는 것을 볼 수 있다.

→ 살펴보면, 단지 노드 데이터에 접근하기 위해 사용한다. (자체 데이터 저장목적 x)