쿠버네티스 Volume
쿠버네티스에서 Pod는 이미지로부터 파일 시스템을 제공받아 사용한다. 따라서 Pod가 삭제되면 저장공간도 같이 삭제된다. 이러한 쿠버네티스 컨테이너 상태를, 데이터를 유지하지 않으므로 Stateless 하다고 한다.
따라서 쿠버네티스 클러스터 환경에서는 데이터를 영구적으로 보존하기 위해서 외부 볼륨을 사용할 수 있다. 상황에 따라 간단히 테스트 해보기 위한 간단한 볼륨을 사용할 수 도 있다.
쿠버네티스 볼륨의 종류
- emptyDir : 아무 데이터도 없는 빈 디렉토리를 제공한다. 동일한 Pod 내에서 다른 컨테이너들끼리 공유하여 접근할 수 있는 공간이다.
- hostPath : 각 노드들마다 분리된 저장공간을 제공하는 볼륨이다.
- gitRepo : 현재는 depreciated 되었다. Git Repository를 저장공간으로 사용하는 볼륨이다.
- Network Storage Volume : 네트워크에 연결된 스토리지를 저장공간으로 사용하도록 제공하는 볼륨이다. ex) iscsi, nfs ..
- Cloud Storage : azureDisk, awsElasticBlockStore 등과 같은 클라우드 제공업체에서 클라우드 환경에서의 스토리지를 저장공간으로 사용하는 볼륨이다.
- 정적 / 동적 프로비저닝 볼륨 : persistentVolume과 persistentVolumeClaim을 설정하여 pod와 연결하여 저장공간으로 사용한다. 수동으로 설정하여 저장공간을 사용하는 정적 프로비저닝 볼륨과 개발자의 PVC 요청에 따라 동적으로 저장공간이 할당되는 동적 프로비저닝 볼륨이 있다.
emptyDir
- pod를 생성하는 파일에서 정의할 수 있으며, emptyDir은 말 그대로 아무 데이터도 없는 빈 디렉토리를 제공한다.
- 동일한 Pod 내에서 다른 컨테이너들끼리 공유하여 접근할 수 있는 공간이다. (리눅스의 /tmp 디렉토리와 유사하다고 생각했음)
- Pod가 삭제되면 emptyDir도 삭제된다. 따라서 테스트용 임시 저장소 개념으로 사용할 수 있다.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp-rs-fortune
spec:
replicas: 1
selector:
matchLabels:
app: myapp-rs-fortune
template:
metadata:
labels:
app: myapp-rs-fortune
spec:
containers:
- name: web-server
image: nginx:alpine
volumeMounts:
- name: web-fortune
mountPath: /usr/share/nginx/html
readOnly: true # 읽기만 가능 , 설정하지 않으면 read write 가능
ports:
- containerPort: 80
- name: html-generator
image: ghcr.io/c1t1d0s7/fortune
volumeMounts:
- name: web-fortune
mountPath: /var/htdocs
volumes:
- name: web-fortune
emptyDir: {}
volumeMounts : 컨테이너와 볼륨 저장공간을 연결하는 부분이다. web-fortune이라는 emptyDir 볼륨을 생성하고 연결해주고 있다.
emptyDir: {} 빈괄호로 두면 host의 로컬 디스크를 사용한다.
HostPath
hostPath 볼륨은 각 노드마다 분리되어 있는 저장공간을 제공하는 볼륨이다. 서로 다른 노드들끼리 저장공간이 공유되고 있지 않다. 즉, 저장공간이 각 노드마다 분리되어 있는 것이다.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp-rs-hp
spec:
replicas: 2
selector:
matchLabels:
app: myapp-rs-hp
template:
metadata:
labels:
app: myapp-rs-hp
spec:
containers:
- name: web-server
image: nginx:alpine
volumeMounts:
- name: web-content
mountPath: /usr/share/nginx/html
ports:
- containerPort: 80
volumes:
- name: web-content
hostPath:
type: Directory
path: /srv/web_contents
hostPath를 설정하는 부분에서, host가 되는 node에 해당 path가 존재헤야 한다. 즉, /srv/web_contents 라는 디렉토리가 있는 노드에 pod 이 배치될 때만 hostPath Volume 을 사용할 수 있는 것이다.
node 1에만 /srv/web_contents 디렉토리를 생성한경우에, 레플리카 셋을 생성한 후 결과는 다음과 같다. (사용자의 환경마다 다를 것이다)
vagrant@kube-control1:~/work/20230217$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp-rs-hp-9ncfj 1/1 Running 0 5m49s 192.168.9.82 kube-node1 <none> <none>
myapp-rs-hp-f8h66 0/1 ContainerCreating 0 5m49s <none> kube-node3 <none> <none>
myapp-rs-hp-9ncfj 는 node1에 배치되었다. 따라서 /srv/web_contents 디렉토리를 생성한 node1에서는 연결이 되어 정상 동작하는 상태이지만, node3에 배치된 myapp-rs-hp-f8h66 Pod는 정상 동작하지 않고 있다.
'Cloud Engineering > Kubernetes ⚙️' 카테고리의 다른 글
[Kubernetes] Persistent Volume 과 Persistent Volume Claim (0) | 2023.02.20 |
---|---|
[Kubernetes] Ingress 컨트롤러 (0) | 2023.02.19 |
[Kubernetes] Service 의 종류 (0) | 2023.02.16 |
[Kubernetes] Jobs (잡)과 CronJob (0) | 2023.02.13 |
[Kubernetes] DaemonSet (데몬셋) (0) | 2023.02.13 |