클라우드/쿠버네티스(Kubernetes)

쿠버네티스 Kubernetes 스토리지 볼륨 4 / hostPath 볼륨

두뚜 2021. 7. 12. 23:12

# hostPath 볼륨

- 파드가 동작하는 쿼네티스 클러스터의 노드(호스트)의 로컬 파일시스템의 파일 및 디렉터리를 파드가 사용 할 수 있는 볼륨으로 제공
- 호스트의 디렉토리를 지정해줄 수 있음(데이터를 채워서 또는 빈 디렉토리여도 가능함)
- 네트워크 스토리지가 아니라서 다른 호스트의 파드에게 제공할 수 없음, 각 노드에 각각의 볼륨이 생성
- 쿠버네티스 클러스터 노드에 로그 파일을 저장하거나 CA인증서 및 토큰을 파드에 제공하기 위한 용도로 사용

 

# hostPath 볼륨생성

# 볼륨 리소스 정의
volumes:
- name: <VOL-NAME>
hostPath:
type: <TYPE>
path: <PATH>

# .volumes.hostPath.type: 볼륨의 종류 지정
DirectoryOrCreate: 지정된 경로의 디렉토리 사용 (없으면 만들어 줌=빈 디렉토리 가능)

Directory: 지정된 경로의 디렉토리 사용(존재해야함)
FileOrCreate: 지정된 경로의 파일 사용(없으면 만들어줌)

File: 지정된 경로의 파일 사용(존재해야함)
Socket: 지정된 경로의 UNIX 소켓 사용(존재해야함)
CharDevice: 지정된 경로의 캐릭터 장치사용(존재해야함)
BlockDevice: 지정된 경로의 블록 장치 사용(존재해야함)

# .volumes.hostPath.path: 공유할 볼륨의 호스트 경로 지정


# hostPath 볼륨에 사용할 노드의 디렉터리 준비

- k-node1 에 hostPath 볼륨에 사용할 디렉토리 생성

 

# /web_contents 디렉터리를 생성


# /web_contents 디렉터리에 index.html 파일을 생성

 

# hostPath 볼륨을 사용하는 레플리카셋 생성

더보기

vagrant@k-node1:~$ sudo mkdir /web_contents


vagrant@k-node1:~$ echo " ldh hostPath Volumes " | sudo tee /web_contents/index.html

ldh hostPath Volumes


# ldh-rs-hp.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: ldh-rs-hp
spec:
relicas: 2
selector:
matchLabels:
app: ldh-rs-hp
template:
metadata:
labels:
app: ldh-rs-hp
spec:

#nodeName: k-node1
containers:
- name: web-server
image: nginx:alpone
volumeMounts:
- name: web-content
mountPath: /usr/share/nginx/html
ports:
- containerPort: 80
volumes:
- name: web-content
hostPath:
type: Directory
path: /web_contents

레플리카셋 컨트롤러에 의해 web-server 파드는 두개의 복제본을 가진다 (두개의 파드에 같은 웹 컨텐츠를 제공)

# .spec.template.spec.mountPath
: 마운트 경로, /web_contents를 여기에 마운트

# spec.template.spec.volumes
: spec.template.spec.volumes 필드에 web-content hostPath 볼륨을 지정하며 web-server 컨테이너가 해당 볼륨을 사용

# .spec.template.spec.nodename
: nodename :k-node1 이면 k-nod1에 컨테이너 배치 ( 원래는 스케줄러가 정함 ), 복제본을 늘려도 k-node1에 배치

 

 

# hostPath 볼륨을 사용하는 레플리카셋을 위한 서비스 오브젝트

 

# 레플리카셋과 서비스 생성

더보기

# ldh-svc-hp.yml
apiVesrion: v1
kind: Service
metadata:
name: ldh-svc-hp
spec:
type: LoadBalancer
ports:
- port: 80
targetport: 80
selector:
app: ldh-rs-hp


# 레플리카셋 생성
vagrant@k-control:~$ kubectl create -f ldh-rs-hp.yml

# 서비스 생성
vagrant@k-control:~$ kubectl create -f ldh-svc-hp.yml

 

 

# hostPath 볼륨을 사용하는 리소스 확인

 

# 레플리카셋 컨트롤러와 파드의 상태를 확인

ldh(myapp)-rs-hp-vhk7s 의 파드는 node1에 배치되었고  Ready 되었다

ldh(myapp)-rs-hp-xt6cl 의 파드는 node2에 배치되었고  Ready 되지 않았다

 

 

# ldh(myapp)-rs-hp-xt6cl 의 파드가 준비되지 않은 이유

k-node2는 볼륨을 연결할 수 없어서 준비되지 못했다 - 볼륨을 마운트 할 수 없다고(FailesMount) 보고

 

 

 

# hostPath  볼륨을 사용하는 리소스 변경

레플리카셋 컨트롤러를 삭제하고 ( kubectl delete -f  ldh-rs-hp.yml) 레플리카셋 오브젝트(ldh-rs-hp.yml)를 아래와 같이 수정하여 다시 생성( kubectl create -f ldh-rs-hp.yml) 한다 .

# 수정 된 내용 nodename: k-node1 필드 추가

# .spec.template.spec.nodename
: nodename :k-node1 이면 k-nod1에 컨테이너 배치 ( 원래는 스케줄러가 정함 ), 복제본을 늘려도 k-node1에 배치 , nodeSelector는 노드의 레이블 매핑, nodeName은 배치할 노드를 직접 지정

 

두 파드 모두 k-node1에 배치된 것을 확인하고, 볼륨을 마운트 할 수 있는 준비 상태로 보고

 

 

 

# hostPath 볼륨을 사용하는 리소스 재확인

# index.html 파일 내용이 같은지 확인 

더보기


vagrant@k-control:~$ kubectl exec myapp-rs-hp-7glwn --cat /usr/share/nginx/html/index.html

ldh hostPath Volumes

vagrant@k-control:~$ kubectl exec myapp-rs-hp-7glwn --cat /usr/share/nginx/html/index.html

ldh hostPath Volumes