Note ≡ 클라우드 스토리지에서 PV와 PVC가 동적으로 할당되는 예제
힌트만 주고 바로 과제를 주는 것은 너무 정이 없는 것 같아서 클라우드에서 작동되는 예제를 준비했습니다.
클라우드의 스토리지와 오브젝트 형태의 스토리지는 동적으로 PVC를 요청을 받아서 처리할 수 있도록 구현돼 있습니다. 이때 오브젝트는 kind: StorageClass를 사용하고, PV와 PVC가 오브젝트를 호출하는 구조입니다. 여기서는 standard.yaml과 같이 StorageClass를 선언합니다. 그리고 메타데이터로 지정한 standard로 호출이 들어오면 동적으로 스토리지를 제공합니다.
standard.yaml
-
apiVersion: storage.k8s.io/v1
-
kind: StorageClass
-
metadata:
-
name: standard
-
provisioner: kubernetes.io/gce-pd
-
parameters:
-
type: pd-standard
-
replication-type: none
현재 시스템에서는 실습하기 어려우므로5 작동하는 방식만 나열해 보겠습니다.
1. dynamic-pvc.yaml을 적용해 PVC를 100Gi만큼 요청합니다. 동적으로 설정된 PV는 PVC의 요청에 따라 생성됩니다. ‘그림 3-67 PV와 PVC의 관계도’를 다시 한 번 보고 오면 이해하기가 쉽습니다.
admin@dynamic-pvc$ kubectl apply -f \
https://raw.githubusercontent.com/sysnet4admin/_Book_k8sInfra/main/ch3/3.4.4/dynamic-pvc.yaml
persistentvolumeclaim/dynamic-pvc created
코드는 다음과 같이 거의 비슷하지만, 제공자에 따라 storageClassName을 작성해야 합니다. 여기서는 번거로움을 피하기 위해서 storageClassName 추가하지 않고 공란으로 둡니다. 공란으로 두면 기본값(standard)을 사용합니다.
dynamic-pvc.yaml
-
apiVersion: v1
-
kind: PersistentVolumeClaim
-
metadata:
-
name: dynamic-pvc
-
spec:
-
accessModes:
-
- ReadWriteOnce
-
resources:
-
requests:
-
storage: 100Gi
-
# storageClassName: <기본값 사용>
제공 업체별 storageClassName의 기본값은 다음과 같습니다.
▼ 표 3-5 제공 업체별 storageClassName 기본값
제공 업체 |
기본 StorageClass 이름 |
기본 프로비저너 |
Amazon Web Services |
gp2 |
aws-ebs |
Microsoft Azure |
standard |
azure-disk |
Google Cloud Platform |
standard |
gce-pd |
OpenStack |
standard |
cinder |
VMware vSphere |
thin |
vsphere-volume |
2. 생성된 PVC와 PVC 요청에 따라 생성된 PV를 함께 확인합니다.
admin@dynamic-pvc$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
dynamic-pvc Bound pvc-…-42010ab20015 100Gi RWX standard 13s
admin@dynamic-pvc$ kubectl get pv
NAME CAPACITY ACCESS MODES STORAGECLASS … STATUS … AGE
pvc-…-42010ab20015 100Gi RWX standard … Bound … 4s
3. 해당 PVC를 사용할 파드들을 생성합니다.
admin@dynamic-pvc$ kubectl apply -f \
https://github.com/sysnet4admin/_Book_k8sInfra/blob/main/ch3/3.4.4/dynamic-pvc-deploy.yaml
deployment.apps/dynamic-pvc-deploy created
dynamic-pvc를 사용하도록 이름을 변경한 것 외에는 dynamic-pvc.yaml과 모두 동일합니다.
dynamic-pvc-deploy.yaml
-
apiVersion: apps/v1
-
kind: Deployment
-
metadata:
-
name: dynamic-pvc-deploy
-
spec:
-
replicas: 3
-
selector:
-
matchLabels:
-
app: dynamic-pvc-deploy
-
template:
-
metadata:
-
labels:
-
app: dynamic-pvc-deploy
-
spec:
-
containers:
-
- name: audit-trail
-
image: sysnet4admin/audit-trail
-
volumeMounts:
-
- name: dynamic-vol
-
mountPath: /audit
-
volumes:
-
- name: dynamic-vol
-
persistentVolumeClaim:
-
claimName: dynamic-pvc
4. 배포된 파드를 확인합니다.
admin@dynamic-pvc$ kubectl get pods
NAME READY STATUS RESTARTS AGE
dynamic-pvc-deploy-78fc9c89c5-72nv6 1/1 Running 0 3m19s
dynamic-pvc-deploy-78fc9c89c5-lg4zr 1/1 Running 0 3m19s
dynamic-pvc-deploy-78fc9c89c5-xh45v 1/1 Running 0 3m19s
5. 배포된 파드 중 1개에 exec로 접속해 df -h로 마운트된 볼륨을 확인합니다. 그런 다음 /audit에 설정한 것과 같이 100Gi(98G) 용량이 마운트된 것을 확인할 수 있습니다.
admin@dynamic-pvc$ kubectl exec -it dynamic-pvc-deploy-78fc9c89c5-72nv6 -- /bin/bash
root@dynamic-pvc-deploy-78fc9c89c5-72nv6:/# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 95G 2.9G 92G 4% /
tmpfs 64M 0 64M 0% /dev
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/sdb 98G 61M 98G 1% /audit
/dev/sda1 95G 2.9G 92G 4% /etc/hosts
shm 64M 0 64M 0% /dev/shm
tmpfs 1.9G 12K 1.9G 1% /run/secrets/kubernetes.io/serviceaccount
tmpfs 1.9G 0 1.9G 0% /proc/acpi
tmpfs 1.9G 0 1.9G 0% /proc/scsi
tmpfs 1.9G 0 1.9G 0% /sys/firmware
예제는 여기까지입니다. 과제를 해결하는 데 도움이 되길 바랍니다.
5 이 실습은 클라우드 환경(EKS, GKE, AKS)에서 실습한 것입니다.