Search
Duplicate
📒

[Kubernetes Infra] 05-2. Storage Class, kubestr

상태
완료
수업
Kubernetes Infra
주제
4 more properties
참고

쿠버네티스 스토리지

NOTE
쿠버네티스에서 스토리지 클래스는 다양한 스토리지 유형을 추상화하고, 동적 프로비저닝을 통해 PVC 요구사항에 맞는 PV를 자동생성할 수 있게 해준다!
SC가 PV를 자동생성 해준다. (HELM 설치시 매우 유용)
PV: 실제 데이터가 저장되는 스토리지의 일부, 정적으로 생성하거나 운영환경에서는 스토리지 클래스를 이용해 동적으로 할당
PVC: 실제 데이터가 저장되는 영구 볼륨과 분리해서 액세스모드, 용량에 대한 설정을 분리
SC: 스토리지 솔루션, 클라우드 서비스에서 제공하는 여러 스토리지 중 동일한 속성(IOPS, 레이턴시, 백업정책 등)을 가지는 집합 리소스이다.
사용자는 원하는 스토리지 클래스를 지정해 PVC에서 요청하면 스토리지 클래스에서 해당 볼륨을 동적으로 할당한다.

스토리지 클래스 리소스

NOTE
스토리지 클래스에는 해당 스토리지 클래스에 속하는 PV를 동적으로 프로비저닝할 때 provisioner, parameters, reclaimPolicy 필드가 사용된다!
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: standard provisioner: kubernetes.io/aws-ebs parameters: type: gp2 reclaimPolicy: Retain allowVolumeExpansion: true mountOptions: - debug volumeBindingMode: Immediate
YAML
복사
프로비저너는 각 스토리지클래스에서 어떠한 볼륨 플러그인을 결정하는 프로비저너를 설정한다.
내부 프로비저너, 외부 프로비저너가 나뉘는데 쿠버네티스 자체에서 프로비저너를 제공해주냐의 차이이다.
ex) AWS EBS, NFS, CephFS …
리클레임 정책은 스토리지 클래스에 의해 동적으로 생성된 PV가 자동으로 삭제되는지 여부이다.
Delete: 삭제
Reatain: 유지
파라미터는 프로비저너에 따라 다른 파라미터를 사용하며, 사용된 프로비저너를 설정할 수 있다.

OpenEBS 로컬 호스트패스 설치

NOTE
쿠버네티스는 자체 스토리지 클래스를 제공하지 않는다. 퍼블릭 클라우드에서는 기본적으로 제공하나 온프레미스 환경에서는 별도 솔루션으로 구현해야 한다!
로컬 호스트패스 스토리지의 구성
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: openebs-hostpath provisioner: openebs.io/local # openebs의 local모드 volumeBindingMode: WaitForFirstConsumer # PVC 관련 모드 parameters: # 스토리지 타입, 기본경로 storageType: "hostpath" basePath: "/var/openebs/local"
YAML
복사
예시코드
현업에서 온프레미스를 위한 솔루션으로는 Ceph, 글러스터FS, OpenEBS등이 있다.
k create ns openebs k ns openebs k apply -f https://openebs.github.io/charts/openebs-operator.yaml k get svc
Bash
복사
설치코드
OpenEBS 호스트패스는 파드가 실행되는 호스트 노드의 특정 디렉터리를 파드의 볼륨으로 할당합니다.
OpenEBS 솔루션 없이도 호스트 노드의 원하는 경로를 직접 볼륨으로 사용할 수 있습니다. 그러나 스토리지 클래스를 사용하지 않으므로, 영구 볼륨을 생성한 후 수동으로 삭제해야 합니다.
openebs-deviceopenebs-hostpath라는 2가지 스토리지 클래스가 생성된다.
openebs-device: 노드에서 마운트하지 않은 별도의 디스크 다비아스에 파드의 데이터 저장
openebs-hostpath: 특정 디렉토리에 할당하는 방법, 기본설정은 /var/openebs/local
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: default-pvc namespace: default spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: "openebs-hostpath"
YAML
복사
date-pvc.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: date-pod namespace: default labels: app: date spec: replicas: 1 selector: matchLabels: app: date template: metadata: labels: app: date spec: containers: - name: date-pod image: busybox command: - "/bin/sh" - "-c" - "while true; do date >> /data/pod-out.txt; cd /data; sync; sync; sleep 30; done" volumeMounts: - name: date-vol # Volume 이름 mountPath: /data # Mount 이름 volumes: # 어떤 Volume을 사용할 것인지 - name: date-vol persistentVolumeClaim: claimName: default-pvc
YAML
복사
date-pvc-deploy.yaml
k ns default k apply -f date-pvc.yaml k apply -f date-pvc-deploy.yaml kgp
Bash
복사
실제 노드에 저장된 값
Storage Class가 자동으로 PV를 생성해서 할당해준다.
이후에 deploy가 삭제되면 PV는 재요구정책에 따라 상태가 나뉜다.
Delete: PVC 삭제시 PV도 삭제
Retain: PVC 삭제시 PV는 삭제되지 않음

SC - Helm MySQL 설치

NOTE
스토리지 클래스를 지정해 헬름차트 MYSQL설치해보자!
헬름 스토리지 클래스 지정
OpenEBS 호스트패스를 스토리지 클래스로 지정해 헬름 차트로 MySQL 애플리케이션 설치
helm search repo mysql helm pull bitnami/mysql --untar cp values.yaml my-values.yaml
Bash
복사
helm 설치
architecture: replication ... primary: ... persistence: storaceClass: "openebs-hostpath" secondary: ... persistence: storageClass: "openebs-hostpath"
YAML
복사
my-values.yaml
k create ns mysql k ns mysql helm install mysql -f my-values.yaml helm ls kgp k get pvc # 정상적으로 올라올때 까지 기다리기 helm delete mysql helm ls kgp k get pvc k delete pvc --all
Bash
복사

디폴트 스토리지 클래스 지정하기

patch 명령어로 디폴트 스토리지 클래스를 지정한다. 이는 나중에 Helm설치시 StorageClass를 공백으로 두었을때 자동으로 설정된다.
# 'kubectl patch' 명령어를 사용하여 기존 Kubernetes 리소스를 부분적으로 수정합니다. # 이 경우, 'storageclass'라는 리소스 유형 중에서 'openebs-hostpath'라는 이름을 가진 리소스를 대상으로 합니다. kubectl patch storageclass openebs-hostpath \ # '-p' 플래그는 패치를 적용할 내용을 JSON 형식의 문자열로 받습니다. # 여기서는 'metadata.annotations' 필드에 변경을 적용합니다. -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' # JSON 문자열 내부에서, 'metadata.annotations'에 'storageclass.kubernetes.io/is-default-class' 어노테이션을 추가하거나 수정하고, # 그 값을 'true'로 설정합니다. 이는 Kubernetes에게 이 스토리지 클래스를 기본 스토리지 클래스로 사용하도록 지시합니다. # 즉, 사용자가 Persistent Volume Claim(PVC)을 생성할 때 명시적으로 스토리지 클래스를 지정하지 않으면, # 이 'openebs-hostpath' 스토리지 클래스가 자동으로 사용됩니다.
Bash
복사

kubestr을 이용한 성능 측정

NOTE
쿠버네티스환경에서 kubestr을 통해 IOPS 측정이 가능하다!
wget https://github.com/kastenhq/kubestr/releases/download/v0.4.31/kubestr_0.4.31_Linux_amd64.tar.gz tar xvfz kubestr_0.4.31_Linux_amd64.tar.gz sudo mv kubestr /usr/local/bin/ sudo chmod +x /usr/local/bin/kubestr
Bash
복사
iops 테스트
[global] ioengine=libaio direct=1 bs=4k runtime=120 time_based=1 iodepth=16 numjobs=4 # numjobs=16 size=1g group_reporting rw=randrw rwmixread=100 rwmixwrite=0 [read]
Bash
복사
READ IOPS 측정 스크립트
kubestr fio -f fio-read.fio -s openebs-hostpath
Bash
복사
결과