참고
쿠버네티스 스토리지
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-device와 openebs-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
복사
결과