[Kubernetes] Kubernetes Volumes 설명과 실습
[Kubernetes] Kubernetes Volumes 설명과 실습
```
[k8s] Kubernetes Volumes 설명과 실습
```
이번 글을 통해 배워갈 내용
- Kubernetes Volume 이란
- emptyDir 실습
- PV, PVC 실습
- 꿀팁
1. Kubernetes Volume 이란
쿠버네티스 볼륨은 컨테이너에 생성된 데이터가 사라지지 않도록 하거나
여러 컨테이너 간에 데이터를 공유할 수 있도록 도와줍니다.
emptyDir
pod가 삭제되면 데이터는 제거됩니다.
pod안에 컨테이너 사이에 데이터를 공유할 수 있게 합니다.
hostPath
host node에 파일 시스템에 접근하여 데이터를 공유합니다
보안 문제로 실무에서는 절대 사용하지 않습니다
PV(Persistent Volume)
pod의 삭제와 상관없이 저장되는 데이터입니다
관리자가 미리 설정하거나 k8s가 동적으로 생성가능합니다.
하드디스크, 네트워크 파일시스템, 클라우드 스토리지등 다양하게 사용가능합니다.
PVC(Persistent Volume Claim)
PVC는 사용자가 PV의 리소스를 요청하는 방식입니다.
2. emptyDir 실습
nginx-pod를 만들고
nginx-pod 내부에
nginx-a 컨테이너
nginx-b 컨테이너
nginx-c 컨테이너 를 만듭니다.
컨테이너 a 와 b를 같은 empty dir에 volumeMount 하고
확인을 해봅니다.
kubectl create namespace myspace
cat <<EOF > nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: myspace
spec:
containers:
- name: nginx-a
image: nginx
command: ["/bin/sh", "-c", "while true; do echo hello $(date) >> /mnt/data/hello.txt; sleep 10; done"]
volumeMounts:
- name: shared-data
mountPath: /mnt/data
- name: nginx-b
image: nginx
command: ["/bin/sh", "-c", "tail -f /mnt/data/hello.txt"]
volumeMounts:
- name: shared-data
mountPath: /mnt/data
- name: nginx-c
image: nginx
volumes:
- name: shared-data
emptyDir: {}
EOF
kubectl apply -f nginx.yaml
kubectl -n myspace logs nginx-pod -c nginx-b
kubectl -n myspace exec -it nginx-pod -c nginx-a -- cat /mnt/data/hello.txt
kubectl -n myspace exec -it nginx-pod -c nginx-b -- cat /mnt/data/hello.txt
kubectl -n myspace exec -it nginx-pod -c nginx-c -- cat /mnt/data/hello.txt
kubectl delete namespace myspace --force
3. PV, PVC 실습
pv-pvc Persistent Volume, shared-pvc Persistent Volume Claim을 만들고
nginx-a, nginx-b, nginx-c 포드를 만듭니다.
nginx-a, nginx-b는 pvc로 연결합니다
결과를 확인해봅니다.
kubectl create namespace myspace
cat <<EOF > pv-pvc.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: shared-pv
namespace: myspace
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: ""
hostPath:
path: /mnt/shared-data # Can be any valid directory on the node
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: shared-pvc
namespace: myspace
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
volumeName: shared-pv
storageClassName: ""
EOF
kubectl apply -f pv-pvc.yaml
cat <<EOF > nginx-pods.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-a
namespace: myspace
spec:
containers:
- name: nginx
image: nginx
command: ["/bin/sh", "-c", "while true; do echo hello from A $(date) >> /mnt/data/hello.txt; sleep 10; done"]
volumeMounts:
- name: shared-data
mountPath: /mnt/data
volumes:
- name: shared-data
persistentVolumeClaim:
claimName: shared-pvc
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-b
namespace: myspace
spec:
containers:
- name: nginx
image: nginx
command: ["/bin/sh", "-c", "tail -f /mnt/data/hello.txt"]
volumeMounts:
- name: shared-data
mountPath: /mnt/data
volumes:
- name: shared-data
persistentVolumeClaim:
claimName: shared-pvc
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-c
namespace: myspace
spec:
containers:
- name: nginx
image: nginx
EOF
kubectl apply -f nginx-pods.yaml
kubectl -n myspace logs nginx-b
kubectl -n myspace exec -it nginx-a -- cat /mnt/data/hello.txt
kubectl -n myspace exec -it nginx-b -- cat /mnt/data/hello.txt
kubectl -n myspace exec -it nginx-c -- cat /mnt/data/hello.txt
kubectl delete namespace myspace --force
4. 꿀팁
PV에 저장 클래스 명시
항상 Persistent Volumes(PV)에는 저장 클래스를 명시해야 합니다. 저장 클래스 이름(storageClassName)이 없는 PV는 클러스터의 기본 저장 클래스를 사용하게 되며, 기본값이 변경되거나 설정되지 않은 경우 예기치 않은 동작을 초래할 수 있습니다.
동적 프로비저닝을 통한 관리 간소화
Persistent Volumes를 정적으로 프로비저닝 하고 바인딩하는 것은 관리자에게 과도한 부담을 주며, 확장이 어렵습니다. 동적 프로비저닝을 사용하면 필요할 때마다 자동으로 PV가 생성되어 Persistent Volume Claim(PVC) 설정이 간소화됩니다.
적절한 재클레임 정책 선택
각 PV에 적합한 재클레임(reclaim) 정책을 선택하는 것이 중요합니다. 중요한 데이터의 경우 'Retain' 정책을 사용하는 것을 고려하세요. 이 정책은 PV가 해제된 후 수동으로 삭제해야 하지만, 실수로 삭제된 경우에도 데이터를 복구할 수 있도록 보장해 줍니다.
미래의 저장소 요구 예상
미래에 필요한 저장 용량을 미리 예상하여 최대한 많은 저장 공간을 할당하는 것이 좋습니다. 볼륨을 생성한 후에는 크기를 조정할 수 없는 경우가 있으며, 이는 사용 중인 스토리지 드라이버에 따라 달라질 수 있습니다.
RBAC을 통한 저장 리소스 보호
역할 기반 접근 제어(RBAC) 정책을 설정하여 PV 및 PVC가 실수나 악의적인 변경 및 삭제로부터 보호되도록 해야 합니다. 스토리지 객체에 잘못된 작업을 적용하면 되돌릴 수 없는 데이터 손실이 발생할 수 있으며, 이는 무상태 Kubernetes 객체와 달리 롤백하거나 재생성할 수 없습니다.
적절한 접근 모드 선택
Persistent Volume을 구성할 때, 올바른 접근 모드(Access Mode)를 선택하는 것이 중요합니다. 예를 들어, ReadWriteOnce, ReadOnlyMany, ReadWriteMany와 같은 접근 모드가 있으며, 각 모드는 특정 사용 사례에 맞는 읽기/쓰기 권한을 제공합니다. 잘못된 접근 모드를 선택하면 예상치 못한 성능 문제나 데이터 충돌이 발생할 수 있으므로, 애플리케이션의 요구 사항을 정확히 파악한 후 설정하세요.
스토리지 리소스 모니터링
PV와 PVC의 사용 상태를 지속적으로 모니터링하는 것이 중요합니다. 클러스터 내 저장소가 한계에 도달하면 성능 저하나 애플리케이션 장애가 발생할 수 있습니다. 정기적으로 자원 사용량을 점검하고 필요시 확장 또는 최적화를 진행하세요.
데이터 백업 및 복구 계획 수립
Kubernetes 환경에서 발생할 수 있는 데이터 손실에 대비하여, PV의 데이터를 정기적으로 백업하는 시스템을 구축하는 것이 필수적입니다. 특히 중요한 데이터는 장애 발생 시 복구할 수 있는 체계적인 백업 및 복구 계획을 세워야 합니다..
읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
참조 및 인용
https://kubernetes.io/docs/concepts/storage/volumes/