스터디/[쿠버네티스 인 액션] (2024.8)

[쿠버네티스 인 액션] 6장.볼륨

ttoance 2024. 9. 28. 21:50

6.1 불륨 소개 

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

ㄴ 독립적인 쿠버네티스 오브젝트가 아니므로 자체적으로 생성, 삭제될 수 없음 

 

- 첫 번째 파드에는 publicHTML 이라는 볼륨이 있어서 이 볼륨은 WebServer 컨테이너의 /var/htdocs에 마운트되어 웹 서버에서 서비스 

- 두번째 파드에서는 첫 번째 파드의 동일 볼륨이 ContentAgent 컨테이너에 /var/html의 다른 경로에 마운트돼 있고, ContentAgent는 해당 경로에 작성하고 이 내용을 웹 서버가 서비스 

- 세번째 파드는 로그를 작성하는 lovVo1 볼륨을 가지고, 이 볼륨은 WebServer와 LogRotator z컨테이너의 /var/logs 에 마운트 

 

- 사용 가능한 볼륨 소개 

1) emptyDir : 일시적인 데이터를 저장하는데 사용되는 간단한 빈 디렉터리

2) hostPath : 워커 노드의 파일 시스템을 파드의 디렉터리로 마운트하는데 사용 

3) gitRepo : 깃 리포지터리의 콘텐츠를 체크아웃해 초기화한 볼륨 

4) nfs : NFS 공유를 파드에 마운트 

5) gcePersistentDisk(Google Compute Engine Persistent Disk), awsElasticBlockStore, azureDisk : 클라우드 제공자의 전용 스토리지를 마운트하는데 사용 

6) cinder, cephfs, iscsi, flocker, glusterfs, quobyte, rbd, flexVolume, vsphereVolume, photonPersistentDisk, scaleIO : 다른 유형의 네트워크 스토리지를 마운트하는데 사용 

7) configMap, secret, downwardAPI : 쿠버네티스 리소스나 클러스터 정보를 파드에 노출하는데 사용 

8) persistentVolumeChain : 사전에 혹은 동적으로 프로비저닝된 퍼시스턴트 스토리지를 사용하는 ㅏㅇ법 

 

 

 

6.2 불륨을 사용하는 컨테이너 간 데이터 공유 

1) emptyDir 볼륨 사용 

- 볼륨이 빈 디렉터리로 시작한다. 

- 동일 파드에서 실행 중인 컨테이너 간 파일을 공유할 때 유용 ex, 임시 데이터를 디스크에 쓰는 목적인 경우 사용할 수 있다

 

 

- fotune 새 디렉터리 생성하고 안으로 들어가 fortuneloop.sh 쉘 스크립트 실행 

kubernetes-in-action/Chapter06/fortune/fortuneloop.sh at master · luksa/kubernetes-in-action · GitHub

#!/bin/bash
trap "exit" SIGINT
mkdir /var/htdocs

while :
do
  echo $(date) Writing fortune to /var/htdocs/index.html
  /usr/games/fortune > /var/htdocs/index.html
  sleep 10
done

 

- 디렉터리 안에 kubernetes-in-action/Chapter06/fortune/Dockerfile at master · luksa/kubernetes-in-action · GitHub

 

kubernetes-in-action/Chapter06/fortune/Dockerfile at master · luksa/kubernetes-in-action

Code from the Kubernetes in Action book. Contribute to luksa/kubernetes-in-action development by creating an account on GitHub.

github.com

FROM ubuntu:latest

RUN apt-get update ; apt-get -y install fortune
ADD fortuneloop.sh /bin/fortuneloop.sh

ENTRYPOINT /bin/fortuneloop.sh

 

 

- 이미지 빌드하고 도커 허브에 업로드 

docker build -t sootoance/fortune .
docker push sootoance/fortune

 

 

 

kubernetes-in-action/Chapter06/fortune-pod.yaml at master · luksa/kubernetes-in-action · GitHub

 

kubernetes-in-action/Chapter06/fortune-pod.yaml at master · luksa/kubernetes-in-action

Code from the Kubernetes in Action book. Contribute to luksa/kubernetes-in-action development by creating an account on GitHub.

github.com

apiVersion: v1
kind: Pod
metadata:
  name: fortune
spec:
  containers:
  - image: sootoance/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: {}

- 파드는 컨테이너 두 개와 각 컨테이너에 각기 다른 경로로 마운트된 단일 볼륨을 가짐

- html-gernator 컨테이너가 시작되면 매 10초마다 fortune 명령의 결과 /var/htdocs/index.html에 쓰기 시작

- web-server 컨테이너가 시작하면 컨테이너는 /usr/share/nginx/html 디렉터리에 파일 서비스 

 

kubectl create -f fortune-pod.yaml
kubectl port-forward fortune 8080:80

 

 

 

curl http://localhost:8080

curl http://localhost:8080

 

 

2) 깃 리포지터리를 볼륨으로 사용하기 

kubernetes-in-action/Chapter06/gitrepo-volume-pod.yaml at master · luksa/kubernetes-in-action · GitHub

 

kubernetes-in-action/Chapter06/gitrepo-volume-pod.yaml at master · luksa/kubernetes-in-action

Code from the Kubernetes in Action book. Contribute to luksa/kubernetes-in-action development by creating an account on GitHub.

github.com

apiVersion: v1
kind: Pod
metadata:
  name: gitrepo-volume-pod
spec:
  containers:
  - image: nginx:alpine
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
      protocol: TCP
  volumes:
  - name: html
    gitRepo:
      repository: https://github.com/luksa/kubia-website-example.git
      revision: master
      directory: .

 

 

gitRepo가 Kubernetes 1.11 버전 이후로 더 이상 공식적으로 지원되지 않기 때문에 initContainer을 사용해야한다. 

apiVersion: v1
kind: Pod
metadata:
  name: gitrepo-volume-pod
spec:
  containers:
  - image: nginx:alpine
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
      protocol: TCP
  initContainers:
  - name: git-clone
    image: alpine/git
    command: ['git', 'clone', '--depth=1', 'https://github.com/luksa/kubia-website-example.git', '/git']
    volumeMounts:
    - name: html
      mountPath: /git
  volumes:
  - name: html
    emptyDir: {}

 

 

kubectl create -f gitrepo-volume-pod.yaml
kubectl port-forward gitrepo-volume-pod 8080:80

 

curl http://localhost:8080

 

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

1) hostPath 볼륨 

- 노드 파일시스템의 특정 파일이나 디렉터리를 가리킴

- gitRepo나 emptyDir 볼륨의 콘텐츠는 파드가 종료되면 삭제되는 반면, hostPath 볼륨의 콘텐츠는 삭제되지 않음 

- 파드가 사제되면 다음 파드가 호스트의 동일 경로 가리키는 hostPath 볼륨 사용하고, 이전 파드와 동일한 노드에 스케줄링된다는 조건하에 새로운 파드는 이전 파드가 남긴 모든 항목 볼 수 있음 

ex, 데이터베이스의 데이터 디렉터리를 저장한 위치로는 부적합한데, 이는 파드가 다시 스케줄링되면 더 이상 이전 데이터 볼 수 없기 때문임 

 

2) hostPath 파일 사용하는 유형 찾아보기 

 kubectl get pods --namespace kube-system
 kubectl describe po storage-provisioner --namespace kube-system

 

6.4 퍼시스턴트 스토리지 사용

파드에서 실행중인 애플리케이션이 디스크에 데이터를 유지해야 하고 파드가 다른 노드로 재스케줄링된 경우에도 동일한 데이터 사용해야 할경우에는 지금까지의 데이터 유형으로는 불가능하고 어떤 클러스터 노드에서도 접근이 필요하기 때문에 NAS(Network-Attached Storage) 유형에 저장돼야함. 

 

1) GCE 퍼시스턴트 디스크를 파드 볼륨으로 사용 

 

kubernetes-in-action/Chapter06/mongodb-pod-gcepd.yaml at master · luksa/kubernetes-in-action · GitHub

 

kubernetes-in-action/Chapter06/mongodb-pod-gcepd.yaml at master · luksa/kubernetes-in-action

Code from the Kubernetes in Action book. Contribute to luksa/kubernetes-in-action development by creating an account on GitHub.

github.com

apiVersion: v1
kind: Pod
metadata:
  name: mongodb 
spec:
  volumes:
  - name: mongodb-data
    gcePersistentDisk:
      pdName: mongodb
      fsType: ext4
  containers:
  - image: mongo
    name: mongodb
    volumeMounts:
    - name: mongodb-data
      mountPath: /data/db
    ports:
    - containerPort: 27017
      protocol: TCP

 

- 파드를 삭제하고 재 생성해도 데이터는 그대로 유지된다. 

 

 

2) 기반 퍼시스턴트 스토리지로 다른 유형의 볼륨 사용하기

kubernetes-in-action/Chapter06/mongodb-pod-aws.yaml at master · luksa/kubernetes-in-action · GitHub

 

kubernetes-in-action/Chapter06/mongodb-pod-aws.yaml at master · luksa/kubernetes-in-action

Code from the Kubernetes in Action book. Contribute to luksa/kubernetes-in-action development by creating an account on GitHub.

github.com

 

apiVersion: v1
kind: Pod
metadata:
  name: mongodb-aws
spec:
  volumes:
  - name: mongodb-data
    awsElasticBlockStore:
      volumeID: my-volume
      fsType: ext4
  containers:
  - image: mongo
    name: mongodb
    volumeMounts:
    - name: mongodb-data
      mountPath: /data/db
    ports:
    - containerPort: 27017
      protocol: TCP

 

 

 

 

 

 

반응형