티스토리 뷰
Kubernetes Storage
- Kubernetes 저장 공간은 쿠버네티스 어플리케이션이 스토리지를 요청하고 사용할 수 있는 방법을 제공한다.
- Pod는 컨테이너가 종료되면 컨테이너 내부의 데이터는 사라진다. 이 데이터를 영속적으로 보관할 수 있는 방법이 필요하며 이때 Persistent Volume에 저장할 수 있다.
image from : https://amazic.com/kubernetes-storage-101-all-you-need-to-know-to-get-started/
Persistent Volume (PV)
- 클러스터 레벨의 리소스이다.
- 클러스터 관리자 혹은 외부 프로비저너에 의해서 생성되거나, 스토리지 클래스를 사용하여 동적으로 프로비저닝 된다.
- 노드가 클러스터 리소스인 것처럼 클러스터의 리소스이다.
- PV는 Volumes와 같은 볼륨 플러그인이지만 PV를 사용하는 개별 Pod와 독립적인 수명 주기를 갖는다.
Persistent Volume Claim (PVC)
- 사용자에 의해서 스토리지를 요청한다.
- 이는 Pod와 유사하다.
- Pod는 노드 리소스를 사용하고 PVC는 PV 리소스를 사용한다.
- Pod는 특정 수준의 리소스(CPU 및 메모리)를 요청할 수 있다.
- 클레임은 특정 크기 및 액세스 모드를 요청할 수 있다.
Storage Class
- 스토리지 클래스 객체를 사용하면 클러스터 관리자가 성능, 크기 또는 액세스 아규먼트와 같은 다양한 속성으로 PV를 정의할 수 있다.
- 이를 통해서 스토리지 구현의 세부사항을 추상화 하면서 저장소를 사용자에게 노출할 수 있다.
- Kubernetes에는 미리 정의된 많은 Storage Class가 있으며, 직접 만들 수 있다.
PV 라이프사이클
- PV는 클러스터 리소스이며, PVC를 통해서 PV 리소스를 요청할 수 있다.
- 이는 프로비저닝을 수행하고, 바인딩, 사용, 재요청 의 과정의 라이프사이클을 가진다.
프로비저닝
- 프로비저닝은 스토리지를 생성하는 과정을 말한다.
- 2가지 프로비저닝이 있다.
- 정적 프로비저닝:
- 클러스터 관리자에 의해서 PV를 생성하는 과정이다.
- PV는 쿠버네티스 API에 위치되며, 클러스터 사용자가 사용할 수 있는 스토리지 리소스에 대한 정보를 포함한다.
- 동적 프로비저닝:
- PVC 요청에 대해서 클러스터는 볼륨을 동적으로 생성한다.
- 이는 일반적으로 사용가능한 정적 PV가 PVC와 일치하지 않을때 발생한다.
- 클러스터는 기본적으로 StorageClasses를 이용하기 위해서 선택적으로 설정될 수 있다.
- 정적 프로비저닝:
바인딩
- 바인딩은 PV와 PVC가 서로 연결되는 것이다.
- 이는 다음 과정으로 수행된다.
- 사용자가 스토리지의 특정 양과 접근 모드를 요청한다.
- 컨트롤 루프는 새로운 PVC를 확인하고 다음 과정을 수행한다.
- 정적: 매치되는 정적 PV를 찾는경우 PVC와 바인딩 한다.
- 동적: 매치되는 PV가 없을때 PVC에 대해 동적으로 프로비저닝 한다.
- 이후 PV와 PVC가 바인딩 (연결) 된다.
- PV와 PVC 바인딩은 1:1 매핑이다.
바인딩 상태
- Available: 사용가능한 상태이다. 바인딩은 아직 이루어지지 않았다.
- Bound: PV가 PersistentVolumeClaim 과 매치되었고, 바인딩이 수행되었다.
- Released: 사용자는 자신의 PVC를 삭제한다. 그러나 클러스터에 의해서 재요청 되지는 않았다.
- Failed: PV는 자동적으로 클러스터에 의해서 재요청 될 수 없다.
사용
- POD는 볼룸으로 클레임을 이용한다. 다음과 같이 동작한다.
- 클러스터는 바운드할 볼룸을 찾기위해 클레임한다. 그리고 볼륨을 바운드한다.
- 복수 access 모드를 지원하며 이를 사용하면 사용자는 요구된 모드로 접근할 수 있다.
- 일단 사용자가 볼륨을 프로비져닝 된이후 바운드된 PV는 사용자의 소유가 된다.
- 사용자들은 Pod를 스케줄 할수 있고, 클레임된 pv에 접근한다.
- 이때 volumes 블록에 PersistentVolumeClaim 섹션에 기술된 pv를 이용한다.
Access Mode
- Pod가 볼륨에 접근할때 어떠한 모드로 접근할지를 알려준다.
- ReadWriteOnce: 오직 마운트된 하나의 노드에서만 읽기 쓰기를 수행할 수 있게 한다.
- ReadOnlyMany: 오직 읽기만 가능하며, 여러 노드에 마운트 되어 한꺼번에 접근할 수 있다. 순간 동시에 접근은 불가능하다.
- ReadWriteMany: 읽기 쓰기를 지원하며 여러 노드에 마운트 되어 읽기/쓰기를 할 수 있게 해준다.
리클레임 (재요청)
- 리클레임은 클러스터에 볼륨이 릴리즈 되고 난 이후에 어떻게 할지를 알려주는 것이다.
- 이때 Retained, Recycled, Deleted 의 3가지 옵션이 있다.
- Retained: 명시적으로 삭제하지 않는 이상 그대로 PV를 유지한다.
- Recycled: 데이터를 삭제하며, 나중에 복구 될 수 있다.
- Deleted: 되돌릴수 없게 삭제한다.
정적/동적 프로비저닝
image from : https://rancher.com/docs/rancher/v2.5/en/cluster-admin/volumes-and-storage/how-storage-works/
- 정적 프로비저닝
- 상단 화면과 같이 PVC 요청을 수행하면 매치되는 PV를 검색한다.
- 매치되는 PV를 발견하면 바인딩을 수행하고 사용할 수 있도록 한다.
- 동적 프로비저닝
- 하단 화면과 같이 PVC 요청을 수행하고 매치되는 PV를 찾지 못한경우 수행
- 스토리지 클래스에서 PV를 신규 생성한다.
- 이후 PV와 PVC를 바인딩 하고 사용할 수 있도록 한다.
실습
- 로컬에 PV와 PVC 연동을 수행해 볼 것이다.
Namespace 생성하기.
- namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: storage
Storage Class 생성하기
- storage_class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: my-storage
namespace: storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
- 스토리지 클래스를 생성한다.
- volumeBindingMode: 볼륨 바인딩을 어떻게 수행할지 지정한다.
- WaitForFirstConsumer: 첫번째 컨슈머 즉 Pod가 사용하기 전까지 볼륨 바인딩을 수행하지 않는다.
- Immediate: PVC를 생성하는 즉시 PV와 바인딩 된다.
Persistent Volume 생성하기
- persistent_volume.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
namespace: storage
spec:
storageClassName: my-storage
capacity:
storage: 5Gi
local:
path: /Users/1111489/Documents/01.STUDY/KUBE/local-storage
persistentVolumeReclaimPolicy: Retain
accessModes:
- ReadWriteOnce
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node1
- 로컬 볼륨을 생성한다.
- persistentVolumeReclaimPolicy: 볼륨이 릴리즈 되는 경우 Retain 으로 지정하였으므로 볼륨을 유지한다.
- accessMode: 접근 모드로 ReadWriteOnce로 설정하였으므로 노드 한군데서 읽기/쓰기 모드로 연동된다.
- nodeAffinity: 어떤 노드에 바인딩 될지를 지정한다. 위 내용은 호스트 이름이 node1인 노드에 생성된다.
Persistent Volume Claim 생성하기
- persistent_volume_claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
namespace: storage
spec:
accessModes:
- ReadWriteOnce
storageClassName: my-storage
resources:
requests:
storage: 200Mi
- 볼륨 클레임을 생성한다.
- 요청 볼륨은 200Mi로 요청한다.
볼륨 클레임 사용하기.
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: mynginx
image: nginx
volumeMounts:
- mountPath: "/usr/nginx/html"
name: volume
volumes:
- name: volume
persistentVolumeClaim:
claimName: my-pvc
emptyDir, hostPath, PV
- 개발 및 실제 사용시에 주요 볼륨을 알아보자.
emptyDir
- 처음 pod가 기동되고, 볼륨이 생성될때 비어있는 볼륨을 생성하므로 emptyDir 이라고 한다.
- pod내부에 생성되므로, pod가 종료되면 볼륨의 내용도 함께 제거 된다.
- 일시적인 목적으로 사용하는 경우 이 볼륨을 이용할 수 있다.
- pod내 여러 컨테이너가 있다면, 이 볼륨은 공유 될 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: pod-empty-dir
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: empty-dir
mountPath: /mount1
- name: was
image: my-was
volumeMounts:
- name: empty-dir
mountPath: /mount2
volumes:
- name : empty-dir
emptyDir: {}
hostPath
- 노드 머신의 특정 경로에 볼륨을 지정한다.
- host는 노드, Path는 특정 경로라고 할 수 있다.
- emptyDir과는 다르게 Pod가 종료되어도 볼륨은 유지된다.
- pod가 다른 노드에서 실행된다면 이전 볼륨을 이용할 수 없게 된다.
- hostPath는 사전에 만들어져 있어야 pod가 실행될때 오류가 나지 않는다.
apiVersion: v1
kind: Pod
metadata:
name: pod-hostpath
spec:
nodeSelector:
kubernetes.io/hostname: node01
containers:
- name: my-was
image: my-was
volumeMounts:
- name: host-path
mountPath: /mount1
volumes:
- name : host-path
hostPath:
path: /data/was
type: DirectoryOrCreate
PV
- Persistent Volume 는 클러스터 관리자, 혹은 CSP 등에서 생성해 둔 볼륨(EBS, NFS) 이며, 동적으로 생성될 수 있다.
- PV를 생성하면 POD는 PVC(Persistent Volume Claim)을 통해서 볼륨을 요청하고, 매치되는 적절한 PV를 발견하면 바인딩되어 사용할 수 있게 된다.
- 정적 프로비져닝은 관리자에 의해서 직접 생성된 것을 말한다.
- 동적 프로비저닝은 PVC가 요청할때 매치되는 PV를 찾을 수 없는경우 자동으로 생성되도록 설정된 것을 말한다.
- PV는 Pod가 종료되어도 유지된다.
WrapUP
- 지금까지 Kubernetes에서 볼륨이 왜 필요하고, Persistent Volume, Persistent Volume Claim, Binding 에 대해서 알아 보았다.
- 샘플을 통해서 로컬에 볼륨을 생성하고, 연동하는 방법도 알아 보았다.
'Kubernetes' 카테고리의 다른 글
[Kubernetes] 스케줄러 알아보기 (0) | 2022.05.10 |
---|---|
Local 에서 MariaDB StatefulSet 컨테이너 실행 (0) | 2022.05.06 |
[Kubernetes] apiVersion 알아보기 (0) | 2022.04.18 |
[Kubernetes] ArgoCD 01 설치 (0) | 2022.04.11 |
[Kubernetes] ArgoCD 02 간단한 웹 개발 및 업로드 (0) | 2022.04.11 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- kubectl
- java
- D3
- MySQL
- argocd
- Terraform
- MongoDB
- go
- Spring
- Kafka
- jenkins
- mongo
- AWS
- declative
- docker-compose
- Gorilla
- gitops
- NodeSelector
- tfsec
- docker
- jpa
- CI
- kubernetes
- Database
- mapping
- Golang
- kafka-springboot
- deploy
- CD
- springboot
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함