쿠버네티스 일반/Diamanti

Diamanti - NVMe over Ethernet PVC

Jerry_이정훈 2021. 7. 6. 10:15
728x90

오늘은 디아만티의 2가지 핵심 기능(SR-IOV, NVMe) 중 NVMe PVC를 소개해 드리 겠습니다.

 

디아만티는 별도 외장 스토리지를 사용하지 않고 Local NVMe Disk를 Kubernetes Storage Class로 사용합니다. Native 환경에서 Kube Storage를 구성하시려면 별도 상용 스토리지(NVMe 스토리지는 아주 고가 입니다.)를 구입 하시던지 혹은 OpenSource Storage를 사용하셔야 합니다.

Local 서버에 장착된 NVMe Disk는 디아만티에서 자체 개발한 NVMe Storage Controller 카드(PCIe Type)에 연결됩니다. 외부 분산 환경 네트워크 스토리지가 아니라 로컬 디스크를 사용하므로 노드 당 1M IOPS 및 under 100 us latency의 탁월한 성능을 발휘합니다. 이는 네트워크 지연 및 분산 파일 시스템에 따른 overhead가 없기 때문입니다.

 

로컬 디스크를 사용하므로 로컬 노드 장애에 대한 대비가 필수적입니다. 디아만티는 (disk가 아닌) 노드 간 2 Copy 혹은 3 Copy Mirroring 기능을 제공합니다. 노드 간 Data Copy는 NVMe Over Ethernet 기능을 이용하여 지연 시간을 최소화 하였습니다. 

 

먼저 Diamanti는 아래와 같이 별도 추가 구성 없이 기본 Storage Class를 제공합니다. 해당 Storage Class를 바로 사용 하시면 됩니다. 

k[spkr@erdia22 04.yelb (spkcluster:default)]$ k get sc
NAME                       PROVISIONER            RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
best-effort (default)      dcx.csi.diamanti.com   Delete          Immediate           true                   76d
high                       dcx.csi.diamanti.com   Delete          Immediate           true                   76d
medium                     dcx.csi.diamanti.com   Delete          Immediate           true                   76d
snapshot-promoter          dcx.csi.diamanti.com   Delete          Immediate           false                  76d
snapshot-promoter-backup   dcx.csi.diamanti.com   Delete          Immediate           false                  76d
spektra-storage-class      dcx.csi.diamanti.com   Retain          Immediate           true                   76d

이에 반하여 Native Kube Storage는 아래와 같이 별도의 Storage Class를 추가 설치 하셔야 합니다. 참고로 ceph 등의 오픈소스 스토리지는 설치는 물론 관리 하기가 쉽지 않습니다. 보통 별도의 스토리지 담당자를 두고 Kube 스토리지만 전담으로 관리합니다.

[spkr@erdia22 04.yelb (ubuns:default)]$ k get sc
NAME               PROVISIONER                  RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
openebs-device     openebs.io/local             Delete          WaitForFirstConsumer   false                  25h
openebs-hostpath   openebs.io/local             Delete          WaitForFirstConsumer   false                  25h
rook-ceph-block    rook-ceph.rbd.csi.ceph.com   Delete          Immediate              true                   7d7h

추가로 Mirroring을 지원하는 Storage Class를 아래와 같이 생성이 가능합니다.

spkr@erdia22:~/02.k8s_code/11.Storage$ cat sc_high2m.yml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: high2m
parameters:
  fsType: xfs
  mirrorCount: "2"
  perfTier: high
provisioner: dcx.csi.diamanti.com ## DIAMANTI CSI Driver
reclaimPolicy: Delete

위와 같이 DIAMANTI는 mirrorCount 라는 옵션을 사용하여 최대 3 Copy까지 노드 간 Mirroring 구성이 가능한 자체 Storage Class를 제공합니다. 사용자는 추가 설정없이 Diamanti가 제공하는 Storage Class를 사용하시면 됩니다. 

 

그럼 생성한 “high2m” Storage Class 로 PVC(Persistent Volume Claim)을 생성하고 해당 PVC를 POD에 할당 하겠습니다.

spkr@erdia22:~/02.k8s_code/01.POD$ cat pvc-pod.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: date-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
  storageClassName: high2m
---
spkr@erdia22:~/02.k8s_code/01.POD$ cat pvc-deploy-only.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: date-mirror-deploy
  labels:
    app: date-mirror
spec:
  replicas: 1
  selector:
    matchLabels:
      app: date-mirror
  template:
    metadata:
      labels:
        app: date-mirror
    spec:
      containers:
      - name: date-pod
        image: centos:7.5.1804
        command:
        - "/bin/sh"
        - "-c"
        - "while true; do date >> /data/pod-out.txt; cd /data; sync; sync; sleep 10; done"
        volumeMounts:
        - name: date-pvc
          mountPath: /data
      volumes:
      - name: date-pvc
        persistentVolumeClaim:
          claimName: date-pvc

“high2m” Storage Class 에 PVC를 생성하고 해당 PVC를 POD 에 할당 하였습니다. POD 접속하여 정상적으로 volume이 생성되었는지 확인해 보겠습니다.

spkr@erdia22:~/02.k8s_code/01.POD$ kc exec -it date-mirror-deploy-578c7dcdb9-xxhnf bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.

[root@date-mirror-deploy-578c7dcdb9-xxhnf /]# df -Th
Filesystem                        Type     Size  Used Avail Use% Mounted on
overlay                           overlay  447G   24G  424G   6% /
tmpfs                             tmpfs     63G     0   63G   0% /dev
tmpfs                             tmpfs     63G     0   63G   0% /sys/fs/cgroup
/dev/nvme1n1                      xfs       21G   33M   20G   1% /data
/dev/mapper/centos_diamanti-var   xfs       64G  317M   64G   1% /etc/hosts
/dev/mapper/docker--vg-docker--lv xfs      447G   24G  424G   6% /run/secrets
shm                               tmpfs     64M     0   64M   0% /dev/shm
tmpfs                             tmpfs     63G   12K   63G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                             tmpfs     63G     0   63G   0% /proc/acpi
tmpfs                             tmpfs     63G     0   63G   0% /proc/scsi
tmpfs                             tmpfs     63G     0   63G   0% /sys/firmware

[root@date-mirror-deploy-578c7dcdb9-xxhnf /]# cat /data/pod-out.txt
Tue May 19 01:49:08 UTC 2020
Tue May 19 01:49:18 UTC 2020
Tue May 19 01:49:28 UTC 2020
(이하 생략)

신규 생성한 POD에 /data 디렉토리로 PVC가 마운트 되었으며, “date” 명령어 결과가 정상적으로 해당 볼륨으로 Write 되고 있습니다.

 

그럼, Mirror 구성이 정상적으로 동작하는지 확인해 보겠습니다.

spkr@erdia22:~/02.k8s_code/11.Storage$ dctl volume describe pvc-e08727fd-7685-4d15-b7a5-3105f16e47ee
Name                                          : pvc-e08727fd-7685-4d15-b7a5-3105f16e47ee
Size                                          : 21.51GB
Node                                          : [dia04 dia01]
Label                                         : diamanti.com/pod-name=default/date-pod
Node Selector                                 : <none>
Phase                                         : Available
Status                                        : Attached
Attached-To                                   : dia04
Device Path                                   : /dev/nvme1n1
Age                                           : 6m
Perf-Tier                                     : high
Fs-Type                                       : xfs
Scheduled Plexes / Actual Plexes              : 2/2
Plexes:
          NAME                                          NODES     STATE     CONDITION   OUT-OF-SYNC-AGE   RESYNC-PROGRESS
          ----                                          -----     -----     ---------   ---------------   ---------------
          pvc-e08727fd-7685-4d15-b7a5-3105f16e47ee.p0   dia04     Up        InUse
          pvc-e08727fd-7685-4d15-b7a5-3105f16e47ee.p1   dia01     Up        InUse

DIAMANTI는 Volume 관련된 자체 명령어 Set(dctl volume <option>)를 지원합니다. 확인 결과, 위와 같이 2개의 Node (dia04, dia01)에 정상적으로 Mirroring 구성 되었습니다. 그럼, dia04 노드를 내려서(drain) 하여 해당 POD의 volume이 다른 노드 dia01에서 정상적으로 Mirroring 되고 있는지 검증 해 보겠습니다.

spkr@erdia22:~/02.k8s_code/01.POD$ k get pod -o wide
NAME                                  READY   STATUS    RESTARTS   AGE     IP             NODE    NOMINATED NODE   READINESS GATES
date-mirror-deploy-578c7dcdb9-xxhnf   1/1     Running   0          3m23s   10.10.100.12   dia04   <none>           <none>
spkr@erdia22:~/02.k8s_code/01.POD$ k drain dia04 --force --ignore-daemonsets
node/dia04 cordoned
WARNING: ignoring DaemonSet-managed Pods: diamanti-system/collectd-v0.8-hs62k, diamanti-system/csi-diamanti-driver-g5mvk, diamanti-system/nfs-csi-diamanti-driver-4kr27
evicting pod default/date-mirror-deploy-578c7dcdb9-xxhnf
pod/date-mirror-deploy-578c7dcdb9-xxhnf evicted
node/dia04 evicted
spkr@erdia22:~/02.k8s_code/01.POD$ k get pod -o wide date-mirror-deploy-578c7dcdb9-5shqr
NAME                                  READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
date-mirror-deploy-578c7dcdb9-5shqr   1/1     Running   0          97s   10.10.100.12   dia01   <none>           <none>

위와 같이 정상적으로 date-mirror POD가 dia04 노드에서 dia01 노드로 Fail-over 되었습니다.

spkr@erdia22:~/02.k8s_code/01.POD$ kc exec -it date-mirror-deploy-578c7dcdb9-5shqr bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
[root@date-mirror-deploy-578c7dcdb9-5shqr /]# df -Th
Filesystem                        Type     Size  Used Avail Use% Mounted on
overlay                           overlay  447G   40G  408G   9% /
tmpfs                             tmpfs     63G     0   63G   0% /dev
tmpfs                             tmpfs     63G     0   63G   0% /sys/fs/cgroup
/dev/nvme1n1                      xfs       21G   33M   20G   1% /data
/dev/mapper/centos_diamanti-var   xfs       64G  574M   64G   1% /etc/hosts
/dev/mapper/docker--vg-docker--lv xfs      447G   40G  408G   9% /run/secrets
shm                               tmpfs     64M     0   64M   0% /dev/shm
tmpfs                             tmpfs     63G   12K   63G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                             tmpfs     63G     0   63G   0% /proc/acpi
tmpfs                             tmpfs     63G     0   63G   0% /proc/scsi
tmpfs                             tmpfs     63G     0   63G   0% /sys/firmware
[root@date-mirror-deploy-578c7dcdb9-5shqr /]# cat /data/pod-out.txt
Tue May 19 01:49:08 UTC 2020
Tue May 19 01:49:18 UTC 2020
Tue May 19 01:49:28 UTC 2020

POD 접속하여 확인하면 기존 노드 dia04 에서 생성한 Data(Tue May 19 01:49:08 UTC 2020)가 Failover 된 노드 dia01 POD에서도 정상적으로 보여집니다. 운영 환경 상황이라면 Node가 Fail 되어도 정상적으로 다른 Node에서 데이터는 Copy되고 있어 POD가 다른 노드에서 실행되면 정상적으로 데이터 복구가 가능합니다.

이번 포스팅에서는 DIAMANTI 스토리지 CSI 및 Mirroring 기능을 Demo를 통하여 알아 보았습니다. 

 

감사합니다.

 

DIAMANTI 제품 문의 : leejunghoon@spkr.co.kr

반응형

'쿠버네티스 일반 > Diamanti' 카테고리의 다른 글

Diamanti 특별 프로모션  (0) 2021.07.27
Diamanti 핵심 기능 - SR-IOV  (0) 2021.07.06
Diamanti 기능 및 제공 서비스 내역  (0) 2021.07.04
Diamanti 제품 소개  (0) 2021.07.02