DevOps/Kubernetes
Kubernetes::스토리지 (Storage)
yscho03
2023. 12. 19. 23:05
728x90
반응형
Persistent Volumes
POD에서 Volume의 한계는 무엇인가?
- 대규모 환경에서는 많은 사용자가 많은 POD를 배포하므로 사용자는 각 포드에 대해 매번 스토리지를 구성해야 한다.
- 어떤 스토리지 솔루션을 사용하든 POD를 배포하는 사용자는 자신의 환경에 있는 모든 포드 정의 파일에서 이를 구성해야 한다.
변경할 때마다 사용자는 자신의 모든 POD에서 변경해야 한다.
Persistent Volumes은 무엇인가?
- Persistent Volumes은 클러스터에 애플리케이션을 배포하는 사용자가 사용하도록 관리자가 구성한 클러스터 전체 스토리지 볼륨 Pool이다.
사용자는 Persistent Volumes Claim을 사용하여 이 Pool에서 스토리지를 선택할 수 있다.
시나리오
Persistent Volume 생성
$ cat > pv-vol.yaml
kind: PersistentVolume
apiVersion: v1
metadata:
name: pv-vol
spec:
accessModes: [ "ReadWriteOnce" ]
capacity:
storage: 1Gi
hostPath:
path: /tmp/data
$ kubectl create -f pv-vol.yaml
persistentvolume/pv-vol creat
- ReadWriteOnce
볼륨은 단일 노드에서 읽기-쓰기로 마운트할 수 있다. ReadWriteOnce 액세스 모드는 포드가 동일한 노드에서 실행 중일 때 여러 포드가 볼륨에 액세스하도록 허용할 수 있다.
- ReadOnlyMany
볼륨은 많은 노드에서 읽기 전용으로 마운트할 수 있다.
- ReadWriteMany
볼륨은 많은 노드에서 읽기-쓰기로 마운트할 수 있다.
- ReadWriteOncePod
볼륨은 단일 Pod에서 읽기-쓰기로 마운트할 수 있다. 전체 클러스터에서 하나의 팟(Pod)만 해당 PVC를 읽거나 쓸 수 있도록 하려면 ReadWriteOncePod 액세스 모드를 사용한다. 이는 CSI 볼륨 및 Kubernetes 버전 1.22 이상에서만 지원된다.
Persistent Volume 조회
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-vol 1Gi RWO Retain Available
Persistent Volume 삭제
$ kubectl delete pv pv-vol
persistentvolume "pv-vol" deleted
Persistent Volume Claims
정의
- Persistent Volume 및 Persistent Volume Claim은 Kubernetes 네임스페이스에서 두 개의 개별 개체이다.
- Persistent Volume Claim이 생성되면 Kubernetes는 요청 및 볼륨에 설정된 속성을 기반으로 Persistent Volume Claim에 바인딩한다.
시나리오
PV 생성
$ cat > pv-definition.yaml
kind: PersistentVolume
apiVersion: v1
metadata:
name: pv-vol1
spec:
accessModes: [ "ReadWriteOnce" ]
capacity:
storage: 1Gi
hostPath:
path: /tmp/data
$ kubectl create -f pv-definition.yaml
persistentvolume/pv-vol1 created
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-vol1 1Gi RWO Retain Available
PVC 생성
$ cat > pvc-definition.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: myclaim
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 500Mi
$ kubectl create -f pvc-definition.yaml
persistentvolumeclaim/myclaim created
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
myclaim Pending 10s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
myclaim Bound pv-vol1 1Gi RWO 16s
Using PVC in PODs
전제 조건
- POD는 PVC을 볼륨으로 사용하여 스토리지에 액세스한다. PVC은 클레임을 사용하는 POD와 동일한 네임스페이스에 있어야 한다.
- 클러스터는 POD의 네임스페이스에서 클레임을 찾고 이를 사용하여 PVC을 지원하는 PV을 가져옵니다. 그러면 볼륨이 호스트와 POD에 마운트된다.
- PV은 PVC 범위이고 PVC은 네임스페이스 범위이다.
시나리오
PV 생성
$ cat > pv-definition.yaml
kind: PersistentVolume
apiVersion: v1
metadata:
name: pv-vol1
spec:
accessModes: [ "ReadWriteOnce" ]
capacity:
storage: 1Gi
hostPath:
path: /tmp/data
$ kubectl create -f pv-definition.yaml
PVC 생성
$ cat > pvc-definition.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: myclaim
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
$ kubectl create -f pvc-definition.yaml
POD 생성
$ cat > pod-definition.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: nginx
volumeMounts:
- mountPath: "/var/www/html"
name: web
volumes:
- name: web
persistentVolumeClaim:
claimName: myclaim
$ kubectl create -f pod-definition.yaml
PV, PVC, POD 조회
$ kubectl get pod,pvc,pv
Storage Class
Why Storage Class ?
PVC를 사용해 볼륨을 요청할 수 있으나 PV로 사용할 볼륨을 수동으로 프로비저닝해 하는 어려움
이런 이슈 사항을 해결하기 위하여 자동으로 볼륨을 생성하고 할당하는 StorageClass를 사용하게 됨.
즉, 정적인 방식 (Static Provisioning)에서 동적인 방식 (Dynamic Provisioning)으로 전환을 하기 위함
Storage Class 특징
- 여러가지 스토리지 유형을 표현하는 것을 말한다.
- 클러스터 관리자가 정의한 QoS 수준, 백업정책, 기타 정책에 매핑된다.
시나리오
Storage Class 생성
$ cat > sc-definition.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: google-storage
provisioner: kubernetes.io/gce-pd
$ kubectl create -f sc-definition.yaml
storageclass.storage.k8s.io/google-storage created
$ kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
google-storage kubernetes.io/gce-pd Delete Immediate false 20s
Persistent Volume Claim 생성
$ cat > pvc-definition.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: myclaim
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: google-storage
resources:
requests:
storage: 500Mi
$ kubectl create -f pvc-definition.yaml
POD 생성
$ cat > pod-definition.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: frontend
image: nginx
volumeMounts:
- mountPath: "/var/www/html"
name: web
volumes:
- name: web
persistentVolumeClaim:
claimName: myclaim
$ kubectl create -f pod-definition.yaml
728x90
반응형