[k8s] 스토리지
Posted by Albert 7Hour 32Min 14Sec ago [2025-04-19]
1. emptyDir: pod안에 임시적으로 저장하는 볼륨(pod 날라가면 같이 없어짐)
apiVersion: v1
kind: Pod
metadata:
name: nginx-volume-01
spec:
containers:
- name: nginx-test01
image: nginx:latest
volumeMounts:
- name: empty-test01
mountPath: /mount01
volumes:
- name: empty-test01
emptyDir: {}
2. hostPath: 지정된 특정 호스트(노드) 의 특정폴더에 저장됨
(hostPath 볼륨은 보안 이슈가 많아 쿠버네티스 공식홈페이지에서는 가급적으로 사용하지 않을것을 권고하니 될수있으면 사용하지 말자)
apiVersion: v1
kind: Pod
metadata:
name: nginx-volume-03
spec:
nodeSelector:
kubernetes.io/hostname: k8s-work2
containers:
- name: nginx-test01
image: nginx:latest
volumeMounts:
- name: hostpath-test01
mountPath: /mount01
volumes:
- name: hostpath-test01
hostPath:
path: /home/albert
type: DirectoryOrCreate
3. PV, PVC
PV: PersistentVolume 의 머리글자로 외부 스토리지를 의미
PVC: 동적으로 스토리지를 바인딩 하기위한 객체. 즉 쿠버네티스 클러스터 관리자가 PV를 생성,관리 하고, 사용자는 PVC를 통해 PV를 요청
4. 테스트 내용
PV: volume-test04-1-pv.yml
(k8s-work1 192.168.56.7 노드에 nfs server를 설치하고 /tmp/k8s-pv 폴더를 공유하여 pv-01 이름을 가진pv생성)
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-01
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 100Mi
persistentVolumeReclaimPolicy: Retain
storageClassName: pv-test-01
nfs:
server: 192.168.56.7
path: /tmp/k8s-pv
PVC: volume-test04-2-pvc.yml
(pv-test-01 classname인 pv를 사용을 정의한 pvc-01 pvc 생성)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-01
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 30Mi
storageClassName: pv-test-01
POD: volume-test04-3-pod.yml
(이름이 pv-01인 pvc를 사용하는 nginx pod)
apiVersion: v1
kind: Pod
metadata:
name: nginx-volume-04
spec:
nodeSelector:
kubernetes.io/hostname: k8s-work1
containers:
- name: nginx-test01
image: nginx:latest
volumeMounts:
- name: nfs-pv-01
mountPath: /mount01
volumes:
- name: nfs-pv-01
persistentVolumeClaim:
claimName: pvc-01
5. 실행결과
albert@k8s-master:~/work/ch09/ex11$ kubectl apply -f volume-test04-1-pv.yml
persistentvolume/pv-01 created
albert@k8s-master:~/work/ch09/ex11$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
pv-01 100Mi RWO Retain Available pv-test-01 <unset> 7s
albert@k8s-master:~/work/ch09/ex11$ kubectl apply -f volume-test04-2-pvc.yml
persistentvolumeclaim/pvc-01 created
albert@k8s-master:~/work/ch09/ex11$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
pvc-01 Bound pv-01 100Mi RWO pv-test-01 <unset> 4s
albert@k8s-master:~/work/ch09/ex11$ kubectl apply -f volume-test04-3-pod.yml
pod/nginx-volume-04 created
albert@k8s-master:~/work/ch09/ex11$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-volume-04 1/1 Running 0 5s
pod 내부에 진입 및 파일생성 확인(test란 파일이 있다.)
albert@k8s-master:~/work/ch09/ex11$ kubectl exec -it nginx-volume-04 -- /bin/bash
root@nginx-volume-04:/' cd mount01/
root@nginx-volume-04:/mount01' ls
abc.txt test
실제 nfs서버의 /tmp/k8s-pv폴더에서 확인(똑같이 abc.txt test 2개 파일이 있는거 확인됨)
albert@k8s-work2:/tmp/k8s-pv$ ls
abc.txt test
6. 테스트 항목삭제
albert@k8s-master:~/work/ch09/ex11$ kubectl delete -f volume-test04-3-pod.yml
pod "nginx-volume-04" deleted
albert@k8s-master:~/work/ch09/ex11$ kubectl delete -f volume-test04-2-pvc.yml
persistentvolumeclaim "pvc-01" deleted
albert@k8s-master:~/work/ch09/ex11$ kubectl delete -f volume-test04-1-pv.yml
persistentvolume "pv-01" deleted
끝