목차
https://kubernetes.io/ko/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
쿠버네티스 공식 문서 참고하여 실습 진행
과정의 요약은 다음과 같다.
- 클러스터 관리자로서, 물리적 스토리지와 연결되는 퍼시스턴트볼륨을 생성한다. 볼륨을 특정 파드와 연결하지 않는다.
- 그 다음 개발자 / 클러스터 사용자의 역할로서, 적합한 퍼시스턴트볼륨에 자동으로 바인딩되는 퍼시스턴트볼륨클레임을 생성한다.
- 스토리지에 대해 위의 퍼시스턴트볼륨클레임을 사용하는 파드를 생성한다.
1. 사용자 노드에 index.html 파일 생성하기
ubuntu@k3s:/mnt$ sudo mkdir /mnt/data
ubuntu@k3s:/mnt$ ls
data
ubuntu@k3s:/mnt$ cd data/
ubuntu@k3s:/mnt/data$ ls
ubuntu@k3s:/mnt/data$ sudo sh -c "echo 'Hello from Kubernetes storage' > /mnt/data/index.html"
ubuntu@k3s:/mnt/data$ ls
index.html
ubuntu@k3s:/mnt/data$ cat index.html
Hello from Kubernetes storage
2. 퍼시스턴트 볼륨 생성하기
이 예제에서, 사용자는 hostPath 퍼시스턴트볼륨을 생성한다. 쿠버네티스는 단일 노드에서의 개발과 테스트를 위해 hostPath를 지원한다. hostPath 퍼시스턴트볼륨은 네트워크로 연결된 스토리지를 모방하기 위해, 노드의 파일이나 디렉터리를 사용한다.
운영 클러스터에서, 사용자가 hostPath를 사용하지는 않는다. 대신, 클러스터 관리자는 Google Compute Engine 영구 디스크, NFS 공유 또는 Amazone Elastic Block Store 볼륨과 같은 네트워크 자원을 프로비저닝한다. 클러스터 관리자는 스토리지클래스(StorageClasses)를 사용하여 동적 프로비저닝을 설정할 수도 있다.
hostPath 퍼시스턴트볼륨의 설정 파일은 아래와 같다.
라고 하는데 현재 pv 공식 문서에서는 아래와 같이 사용이 종료된다고 한다.
그리고 일단 현재 진행하는 프로젝트에서는 k3s 로 단일 클러스터를 사용하고 있기 때문에 hostPath 를 사용하는 PV를 생성해서 사용해보려고 한다.
더보기
퍼시스턴트 볼륨의 유형
퍼시스턴트볼륨 유형은 플러그인으로 구현된다. 쿠버네티스는 현재 다음의 플러그인을 지원한다.
- cephfs - CephFS 볼륨
- csi - 컨테이너 스토리지 인터페이스 (CSI)
- fc - Fibre Channel (FC) 스토리지
- hostPath - HostPath 볼륨 (단일 노드 테스트 전용. 다중-노드 클러스터에서 작동하지 않음. 대신 로컬 볼륨 사용 고려)
- iscsi - iSCSI (SCSI over IP) 스토리지
- local - 노드에 마운트된 로컬 스토리지 디바이스
- nfs - 네트워크 파일 시스템 (NFS) 스토리지
- rbd - Rados Block Device (RBD) 볼륨
아래의 PersistentVolume 타입은 사용 중단되었다. 이 말인 즉슨, 지원은 여전히 제공되지만 추후 쿠버네티스 릴리스에서는 삭제될 예정이라는 것이다.
- awsElasticBlockStore - AWS Elastic Block Store (EBS) (v1.17에서 사용 중단)
- azureDisk - Azure Disk (v1.19에서 사용 중단)
- azureFile - Azure File (v1.21에서 사용 중단)
- cinder - Cinder (오픈스택 블록 스토리지) (v1.18에서 사용 중단)
- flexVolume - FlexVolume (v1.23에서 사용 중단)
- gcePersistentDisk - GCE Persistent Disk (v1.17에서 사용 중단)
- portworxVolume - Portworx 볼륨 (v1.25에서 사용 중단)
- vsphereVolume - vSphere VMDK 볼륨 (v1.19에서 사용 중단)
pv-volume.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: task-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
생성 및 확인
ubuntu@k3s:~/test$ k apply -f pv-volume.yaml
persistentvolume/task-pv-volume created
ubuntu@k3s:~/test$ k get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
task-pv-volume 5Gi RWO Retain Available manual 4s
ubuntu@k3s:~/test$
3. 퍼시스턴 볼륨 클레임 생성하기
pv-claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: task-pv-claim
namespace: test
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
공식문서의 코드에서 namespace 만 추가하였음
생성 및 확인
ubuntu@k3s:~/test$ vim pv-claim.yaml
ubuntu@k3s:~/test$ k apply -f pv-claim.yaml
persistentvolumeclaim/task-pv-claim created
ubuntu@k3s:~/test$ k get pvc -n test
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
task-pv-claim Bound task-pv-volume 5Gi RWO manual 9s
ubuntu@k3s:~/test$
정상적으로 바인딩 됨을 확인함
4. 파드 생성하기
pv-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: task-pv-pod
namespace: test
spec:
volumes:
- name: task-pv-storage
persistentVolumeClaim:
claimName: task-pv-claim
containers:
- name: task-pv-container
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: task-pv-storage
pod 생성 및 확인
ubuntu@k3s:~/test$ vim pv-pod.yaml
ubuntu@k3s:~/test$ k apply -f pv-pod.yaml
pod/task-pv-pod created
ubuntu@k3s:~/test$ k get all -n test
NAME READY STATUS RESTARTS AGE
pod/task-pv-pod 1/1 Running 0 9s
ubuntu@k3s:~/test$ k exec -it task-pv-pod -n test /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@task-pv-pod:/# apt update
...
root@task-pv-pod:/# apt install curl
...
root@task-pv-pod:/# curl http://localhost/
Hello from Kubernetes storage
이후 공식 문서는 정리하기로 넘어가지만
나는 해당 마운트 포인트에 새로 파일을 생성해서 host dir에 pod 가 삭제되어도 해당 파일이 남아있는지 확인해보려고 한다.
파일 생성
root@task-pv-pod:/# cd /usr/share/nginx/html
root@task-pv-pod:/usr/share/nginx/html# touch app.py
root@task-pv-pod:/usr/share/nginx/html# ls
app.py index.html
확인
ubuntu@k3s:~$ ls /mnt/data/
app.py index.html
잘 남아있다.
정리하기
파드, 퍼시스턴트볼륨클레임, 퍼시스턴트볼륨을 삭제한다.
kubectl delete pod task-pv-pod
kubectl delete pvc task-pv-claim
kubectl delete pv task-pv-volume
'Kubernetes' 카테고리의 다른 글
DevOps GPTs (0) | 2024.03.10 |
---|---|
rpc error: code = Unknown desc = failed to pull and unpack image : 403 Forbidden (0) | 2023.08.14 |
시크릿을 환경 변수 형태로 사용하기 (0) | 2023.06.15 |
kubectl 을 사용해 시크릿 생성 (0) | 2023.06.15 |
k9s (0) | 2023.06.08 |