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 쉘 스크립트 실행
#!/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
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
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
2) 깃 리포지터리를 볼륨으로 사용하기
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 퍼시스턴트 디스크를 파드 볼륨으로 사용
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
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
'스터디 > [쿠버네티스 인 액션] (2024.8)' 카테고리의 다른 글
[쿠버네티스 인 액션] 7장. 컨피그맵과 시크릿 - 컨테이너에 명령어 인수 전달, 각 컨테이너에 사용자 정의 환경변수 지정 (0) | 2024.10.02 |
---|---|
[쿠버네티스 인 액션] 6장.볼륨 - 퍼시스턴트볼륨과 퍼시스턴트볼륨클레임 +참고영상 (2) | 2024.09.29 |
[쿠버네티스 인 액션] 5장.서비스 - 레디니스 프로브, 헤드리스 서비스, 서비스 해결 (0) | 2024.09.22 |
[쿠버네티스 인 액션] 5장.서비스 - 서비스 앤드포인트, 외부 클라이언트 연결 (노드포트, 로드밸러스, 인그레스) (0) | 2024.09.22 |
[쿠버네티스 인 액션] 5장.서비스 - 서비스 생성, 서비스 검색 (2) | 2024.09.21 |