오늘은 디아만티의 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 |