[DIAMANTI] Local NVMe PVC
오늘은 디아만티의 2가지 핵심 기능(SR-IOV, Local NVMe) 중 Local NVMe PVC를 소개해 드리 겠습니다.
디아만티는 별도 외장 스토리지를 사용하지 않고 Local NVMe Disk를 Kubernetes PVC 바로 사용합니다. 유사한 솔루션으로 OpenEBS Local PV 및 local-path-provisioner가 있습니다.
관련 링크 : https://github.com/rancher/local-path-provisioner
Local NVMe Disk는 디아만티 자체 개발한 NVMe Storage Controller에 연결되고 다른 노드 Disk는 NVMe Over Ethernet Protocol를 이용하여 연결되었습니다.
외부 네트워크 스토리지가 아니라 로컬 디스크를 사용하므로 노드 당 1M IOPS 및 under 100 us latency의 탁월한 성능을 발휘합니다. 이는 네트워크 지연 및 분산 파일 시스템에 따른 overhead가 없기 때문입니다.
로컬 디스크를 사용하므로 로컬 노드 장애에 대한 대비가 필수적입니다. 디아만티는 (disk가 아닌) 노드 간 2 Copy 혹은 3 Copy Mirroring 기능을 제공하여 대비합니다. 노드 간 Data Copy는 NVMe Over Ethernet 기능을 이용하여 빠르게 처리 합니다.
시연을 통하여 해당 기능을 좀 더 자세히 소개 드리 겠습니다.
먼저, 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까지 구성 가능합니다.
그럼 생성한 “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/2Plexes:
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$ kc 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$ kc 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 evictedspkr@erdia22:~/02.k8s_code/01.POD$ kc 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되고 있어 해당 데이터 복구 가능합니다.
이번 포스팅에서는 DIAMANTI 스토리지 CSI 및 Mirroring 기능을 Demo를 통하여 알아 보았습니다. 노드 & POD 별 IOPS 성능 정보는 다른 포스팅으로 전달해 드리 겠습니다.
감사합니다.
DIAMANTI 제품 문의 : sales@spkr.co.kr