Kubernetes 이야기

OpenEBS 본문

Kubernetes/일반

OpenEBS

kmaster 2022. 4. 22. 18:16
반응형

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 대시보드를 사용한 관찰 가능성

아키텍처

 

https://thenewstack.io/how-openebs-brings-container-attached-storage-to-kubernetes/

데이터 플레인 구성 요소

  • cStor – 스냅샷, 클론, 씬 프로비저닝, 데이터 일관성 및 용량 확장성과 같은 엔터프라이즈급 기능을 제공하므로 OpenEBS에 선호되는 스토리지 엔진이다. 그러면 Kubernetes 상태 저장 배포가 고가용성으로 작동할 수 있다. cStor는 3개의 복제본을 갖도록 설계되어 데이터가 복제본에 동기적으로 기록되므로 포드가 종료 및 일정 변경 중에 데이터를 유지할 수 있다.
  • Jiva – Jiva는 동기 복제와 같은 블록 스토리지 기능을 통해 사용자 공간에서 독점적으로 실행된다. 이 옵션은 더 많은 블록 저장 장치를 추가할 수 없는 노드에서 실행 중인 응용 프로그램이 있는 상황에 이상적이다. 그러나 이것은 고성능 스토리지 기능이 필요한 미션 크리티컬 애플리케이션에는 적합하지 않다.
  • LocalPV – 세 가지 중 가장 간단한 스토리지 엔진이다. 로컬 영구 볼륨은 Kubernetes 노드에 직접 연결된 볼륨이다. OpenEBS는 로컬로 연결된 디스크 또는 경로(마운트 포인트)를 사용하여 k8s 클러스터에 영구 볼륨을 프로비저닝할 수 있다. 이는 스냅샷 및 클론과 같은 고급 스토리지 기능이 필요하지 않은 애플리케이션을 실행하는 상황에 이상적이다.

https://thenewstack.io/how-openebs-brings-container-attached-storage-to-kubernetes/

컨트롤 플레인 구성 요소

 

OpenEBS 컨트롤 플레인은 API 서버를 통해 외부 세계에 노출된다. 컨트롤 플레인은 볼륨 프로비저닝, 클론 생성, 볼륨 메트릭 내보내기 및 볼륨 정책 시행과 같은 볼륨 작업을 담당한다. 

 

NDM ( Node Disk Manager ) : Kubernetes 노드에 연결된 미디어/디스크의 검색, 모니터링 및 관리에 사용된다.

구성

 

OpenEBS는 각 Kubernetes 노드에서 사용 가능한 스토리지를 관리하고 해당 스토리지를 사용 하여 Stateful 워크로드에 로컬 또는 분산(일명 복제) 영구 볼륨을 제공한다.

 

https://openebs.io/docs/

로컬볼륨

  • 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

 

Kubernetes에서 Gitea 사용하기

형상관리 도구 git 이전에 SVN (subversion)을 많이 사용하던 시기가 있었다. 현재는 대부분의 프로젝트가 git 형상관리 툴을 사용하여 진행되고 있다. 보통 github나 bitbucket, gitlab (클라우드형) 를 많이

kmaster.tistory.com

 

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://openebs.io/docs/

https://thenewstack.io/how-openebs-brings-container-attached-storage-to-kubernetes/

 

반응형
Comments