일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- opensearch
- CANARY
- Argo
- blue/green
- operator
- Kubeflow
- mlops
- knative
- opentelemetry
- seldon core
- eBPF
- 카오스 엔지니어링
- kubernetes operator
- serving
- MLflow
- argocd
- CI/CD
- 오퍼레이터
- Pulumi
- Model Serving
- keda
- gitops
- tekton
- xdp
- Kubernetes
- Kubernetes 인증
- Litmus
- Kopf
- Continuous Deployment
- nginx ingress
- Today
- Total
Kubernetes 이야기
OpenEBS 본문
OpenEBS 는 Kubernetes 작업자 노드에서 사용 가능한 모든 스토리지를 로컬 또는 분산 Kubernetes 영구 볼륨으로 바꾼다. OpenEBS는 애플리케이션에서 빠르고 내구성이 뛰어나고 안정적이며 확장 가능한 Container Attached Storage 가 필요한 Kubernetes Stateful Workloads를 쉽게 배포할 수 있도록 지원한다.
OpenEBS는 현재 CNCF 샌드박스 프로젝트이다.
주요특징
- OpenEBS는 온프레미스 및 클라우드의 모든 Kubernetes 배포에서 일관성을 제공한다.
- Kubernetes가 포함된 OpenEBS는 개발자 및 플랫폼 SRE 생산성을 높인다.
- OpenEBS는 다른 솔루션에 비해 사용이 간편하다. 예를 들어 설치가 간단하고 완전히 동적 프로비저닝이 가능하다.
- OpenEBS는 우수한 커뮤니티 지원을 제공한다.
- OpenEBS는 완전히 오픈 소스이며 무료이다.
주요기능
- Container Attached Storage의 선언적 프로비저닝
- 동기식 데이터 복제를 통한 내구성 및 고가용성
- 스냅샷 및 클론을 통한 데이터 보호
- 백업 및 복원을 통한 재해 복구
- Prometheus 메트릭 및 Grafana 대시보드를 사용한 관찰 가능성
아키텍처
데이터 플레인 구성 요소
- cStor – 스냅샷, 클론, 씬 프로비저닝, 데이터 일관성 및 용량 확장성과 같은 엔터프라이즈급 기능을 제공하므로 OpenEBS에 선호되는 스토리지 엔진이다. 그러면 Kubernetes 상태 저장 배포가 고가용성으로 작동할 수 있다. cStor는 3개의 복제본을 갖도록 설계되어 데이터가 복제본에 동기적으로 기록되므로 포드가 종료 및 일정 변경 중에 데이터를 유지할 수 있다.
- Jiva – Jiva는 동기 복제와 같은 블록 스토리지 기능을 통해 사용자 공간에서 독점적으로 실행된다. 이 옵션은 더 많은 블록 저장 장치를 추가할 수 없는 노드에서 실행 중인 응용 프로그램이 있는 상황에 이상적이다. 그러나 이것은 고성능 스토리지 기능이 필요한 미션 크리티컬 애플리케이션에는 적합하지 않다.
- LocalPV – 세 가지 중 가장 간단한 스토리지 엔진이다. 로컬 영구 볼륨은 Kubernetes 노드에 직접 연결된 볼륨이다. OpenEBS는 로컬로 연결된 디스크 또는 경로(마운트 포인트)를 사용하여 k8s 클러스터에 영구 볼륨을 프로비저닝할 수 있다. 이는 스냅샷 및 클론과 같은 고급 스토리지 기능이 필요하지 않은 애플리케이션을 실행하는 상황에 이상적이다.
컨트롤 플레인 구성 요소
OpenEBS 컨트롤 플레인은 API 서버를 통해 외부 세계에 노출된다. 컨트롤 플레인은 볼륨 프로비저닝, 클론 생성, 볼륨 메트릭 내보내기 및 볼륨 정책 시행과 같은 볼륨 작업을 담당한다.
NDM ( Node Disk Manager ) : Kubernetes 노드에 연결된 미디어/디스크의 검색, 모니터링 및 관리에 사용된다.
구성
OpenEBS는 각 Kubernetes 노드에서 사용 가능한 스토리지를 관리하고 해당 스토리지를 사용 하여 Stateful 워크로드에 로컬 또는 분산(일명 복제) 영구 볼륨을 제공한다.
로컬볼륨
- OpenEBS는 원시 블록 장치 또는 파티션을 사용하거나 호스트 경로의 하위 디렉토리를 사용하거나 LVM, ZFS 또는 스파스 파일을 사용하여 영구 볼륨을 생성할 수 있다.
- 로컬 볼륨은 데이터 경로에서 OpenEBS의 추가 오버헤드 없이 Stateful Pod에 직접 탑재되어 대기 시간을 줄인다.
- OpenEBS는 모니터링, 백업/복원, 재해 복구, ZFS 또는 LVM 지원 시 스냅샷, 용량 기반 스케줄링 등을 위한 로컬 볼륨에 대한 추가 도구를 제공한다.
분산(복제)볼륨
- OpenEBS는 엔진(Mayastor, cStor 또는 Jiva) 중 하나를 사용하여 각 분산 영구 볼륨에 대한 마이크로 서비스를 생성한다.
- Stateful Pod는 데이터를 클러스터의 여러 노드에 동기식으로 복제하는 OpenEBS 엔진에 데이터를 쓴다. OpenEBS 엔진 자체는 포드로 배포되고 Kubernetes에 의해 조정된다. Stateful 포드를 실행하는 노드가 실패하면 포드는 클러스터의 다른 노드로 일정이 변경되고 OpenEBS는 다른 노드에서 사용 가능한 데이터 복사본을 사용하여 데이터에 대한 액세스를 제공한다.
- Stateful Pod는 iSCSI(cStor 및 Jiva) 또는 NVMeoF(Mayastor)를 사용하여 OpenEBS 분산 영구 볼륨에 연결한다.
- OpenEBS cStor와 Jiva는 스토리지의 사용 편의성과 내구성에 중점을 둔다. 이러한 엔진은 데이터를 저장소에 쓰기 위해 각각 맞춤형 버전의 ZFS 및 Longhorn 기술을 사용한다.
- OpenEBS Mayator는 최신 엔진으로 내구성과 성능을 설계 목표로 개발되었다. OpenEBS Mayastor는 컴퓨팅(거대한 페이지, 코어) 및 스토리지(NVMe 드라이브)를 효율적으로 관리하여 빠른 분산 블록 스토리지를 제공한다.
설치
OpenEBS를 설치하려면 Kubernetes 클러스터가 다음을 충족해야 한다.
- Kubernetes 1.18 이상을 권장
- 선택한 데이터 엔진을 기반으로 다음과 같은 추가 패키지로 노드를 준비해야 한다.
- ext4, xfs, nfs, lvm, zfs 또는 iscsi, nvme 패키지 설치.
- 파일 시스템이 설치되어 있지 않은지 확인하거나 LVM 볼륨 그룹 또는 ZFS 풀을 생성하거나 필요한 경우 드라이브 파티션을 생성하여 데이터 엔진에서 사용할 장치를 준비한다.
- 업스트림 Kubernetes 클러스터를 사용하는지 아니면 AKS, Rancher, OpenShift, GKE와 같은 관리형 Kubernetes 클러스터를 사용하는지에 따라 추가 단계가 필요할 수 있다.
OpenEBS는 iSCSI 프로토콜을 통해 블록 볼륨 지원을 제공한다. 따라서 모든 Kubernetes 노드에 iSCSI 클라이언트(초기자)가 있어야 한다. 이 부분은 OS 별로 설치/설정 방법이 다르니 문서를 참고한다.
[centos]
- 노드에 iSCSI 이니시에이터가 이미 설치된 경우 다음 명령을 사용하여 이니시에이터 이름이 구성되었는지 확인
cat /etc/iscsi/initiatorname.iscsi
- 다음 명령을 사용하여 iSCSI 서비스가 실행 중인지 확인
systemctl status iscsid
- 상태가 로 표시 Inactive되면 다음 명령을 사용하여 iscsid 서비스를 활성화하고 시작해야 할 수 있다.
sudo systemctl enable --now iscsid
- 노드에 iSCSI 이니시에이터가 설치되어 있지 않으면 iscsi-initiator-utils다음 명령을 사용하여 패키지를 설치한다.
yum install iscsi-initiator-utils -y
준비가 다 되었으면 helm chart를 이용하여 설치해 보자. (cstor 모드)
# helm repo add openebs https://openebs.github.io/charts
# helm repo update
# helm install openebs --namespace openebs openebs/openebs --create-namespace
설치 된 내역을 보자.
# kubectl get pods -n openebs
NAME READY STATUS RESTARTS AGE
openebs-localpv-provisioner-6445497896-w4vhd 1/1 Running 0 2m18s
openebs-ndm-2b9tl 1/1 Running 0 2m18s
openebs-ndm-5grw5 1/1 Running 0 2m18s
openebs-ndm-lvvvv 1/1 Running 0 2m18s
openebs-ndm-operator-66bb9cbbcb-btjjm 1/1 Running 0 2m18s
설치된 storage class를 확인해 보자.
# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
openebs-device openebs.io/local Delete WaitForFirstConsumer false 3m7s
openebs-hostpath openebs.io/local Delete WaitForFirstConsumer false 3m7s
기본적으로 openebs local pv는 /var/openebs/local 아래 저장된다.
이제 local PV를 사용하여 앱을 배포해 보자. 샘플로 Gitea 에서 사용했던 Postgresql 를 사용해 보자.
https://kmaster.tistory.com/36
StatefulSet의 storgeClassName을 아래와 같이 수정하여 배포했다.
# cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app: postgres
name: postgres
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: postgres
serviceName: postgres-svc
template:
metadata:
labels:
app: postgres
spec:
containers:
- env:
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
key: POSTGRES_USER
name: postgres-sec
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
key: POSTGRES_PASSWORD
name: postgres-sec
- name: POSTGRES_DB
value: gitea
image: postgres:12.4-alpine
imagePullPolicy: IfNotPresent
name: postgres
ports:
- containerPort: 5432
protocol: TCP
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgres-pvc
volumeClaimTemplates:
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
labels:
app: postgres
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: openebs-hostpath
EOF
생성 후 pvc 상태는 아래와 같다.
# k get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
postgres-pvc-postgres-0 Bound pvc-be37a671-58d4-4f26-97b5-77abe11cee87 1Gi RWO openebs-hostpath 27s
Pod가 생성된 노드를 확인해 보면 아래와 같이 생성된 것을 볼 수 있다.
# pwd
/var/openebs/local/pvc-be37a671-58d4-4f26-97b5-77abe11cee87
# ls -ltr
total 4
drwx------. 19 70 root 4096 Apr 22 17:00 pgdata
참고
https://thenewstack.io/how-openebs-brings-container-attached-storage-to-kubernetes/
'Kubernetes > 일반' 카테고리의 다른 글
올바른 Kubernetes manifest 작성하기 (0) | 2022.05.05 |
---|---|
Kubestr로 Storage 구성 및 성능 평가 (0) | 2022.04.22 |
nginx ingress를 사용하여 외부 application proxy 설정 (0) | 2022.04.21 |
올바른 Dockerfile 작성하기 (0) | 2022.04.19 |
Nginx ingress - External OAUTH Authentication ( Google ) (0) | 2022.04.17 |