OpenEBS Multinode 검증
로컬 디스크를 Kube PVC 환경으로 사용하기 위하여 OpenEBS 사용 중이다. 노드에 지정된 로컬 디스크를 사용하므로 다른 Node에서는 다른 노드의 Volume을 볼 수 없다. Kube Deployment 환경에서도 동일하므로 Kube 환경에서 어떻게 적용되는지 검증해 보았다.
먼저, local pv(persistent volume)를 가지는 Deploy를 생성한다.
Pod Anti Affinity 설정이 되어 있어 다른 Node에 실행되어야 하는데 같은 Node ‘node1’에 2개 POD가 실행되었다.
[spkr@erdia22 ~ (ksp01:default)]$ k get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
date-pvc-mirror-5cf6bf8f4b-hv829 1/1 Running 0 33m 10.233.90.58 node1 <none> <none>
date-pvc-mirror-5cf6bf8f4b-tlkvz 1/1 Running 0 33m 10.233.90.59 node1 <none> <none>
Deploy가 안되어야 좀 더 맞는 구성인 것 같은데 deploy 된다. (Diamanti 환경에서는 error 나고 deploy 되지 않는다. 서로 다른 노드에서 실행이 필요하면 Deployment가 아닌 Statefulset으로 실행이 필요하다.)
POD가 2개 생성되었는데 PV(Persistent Volume)는 여전히 하나이다.
[spkr@erdia22 ~ (ksp01:default)]$ k get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REAS
ON AGE
pvc-1f6b79ce-1515-42cc-b206-bf7f6ee8ad5e 5G RWO Delete Bound default/local-hostpath-pvc openebs-hostpath
8d
즉, 2개의 POD가 서로 다른 PV를 가지는 것이 아니라 동일 PV, Volume을 가진다. 좀 더 자세히 PVC를 확인하면 Annotation에 “node1” 이라고 명시되었다.
[spkr@erdia22 ~ (ksp01:default)]$ k describe pvc local-hostpath-pvc
Name: local-hostpath-pvc
Namespace: default
StorageClass: openebs-hostpath
Status: Bound
Volume: pvc-1f6b79ce-1515-42cc-b206-bf7f6ee8ad5e
Labels: <none>
Annotations: pv.kubernetes.io/bind-completed: yes
pv.kubernetes.io/bound-by-controller: yes
volume.beta.kubernetes.io/storage-provisioner: openebs.io/local
volume.kubernetes.io/selected-node: node1
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 5G
Access Modes: RWO
VolumeMode: Filesystem
Used By: date-pvc-mirror-5cf6bf8f4b-hv829
date-pvc-mirror-5cf6bf8f4b-tlkvz
Events: <none>
즉 이 PVC는 node1 이라는 특정 노드에서만 실행 가능한 PVC다.
조금 더 확인이 필요한 것은 Access Modes이다. Mode가 RWO, Read Write Once 이다. 해석을 하면 해당 Volume은 하나의 POD에서만 실행이 가능하다. (일반 iSCSI Volume 과 동일) 하지만 2개의 POD를 실행하면 2개 POD 모두 Read Write가 가능하다. 파드에서 간단히 Write 작업을 해 보았다.
[spkr@erdia22 ~ (ksp01:default)]$ k exec -it date-pvc-mirror-5cf6bf8f4b-tlkvz — sh
/ # echo hihi01 >> /data/pod-out.txt[spkr@erdia22 ~ (ksp01:default)]$ k exec -it date-pvc-mirror-5cf6bf8f4b-hv829 — sh
/ # echo hihi02 >> /data/pod-out.txt
해당 Volume이 마운트 된 node1에서 확인하면 아래와 같이 정상적으로 각각의 POD에서 Write 작업이 된 걸 확인 가능하다.
[spkr@node1 local]$ cat pvc-1f6b79ce-1515-42cc-b206-bf7f6ee8ad5e/pod-out.txt
Tue Jan 19 17:10:17 UTC 2021
hihi01
Tue Jan 19 17:10:23 UTC 2021
Tue Jan 19 17:10:27 UTC 2021
Tue Jan 19 17:10:33 UTC 2021
Tue Jan 19 17:10:37 UTC 2021
hihi02
Tue Jan 19 17:10:43 UTC 2021
로컬 Disk를 2개의 POD에 마운트 하였으니 어떻게 보면 당연하다. 서버 입장에서는 2개의 Process가 같은 file에 write 작업을 한 것이다. RWO 모드임에도 서로 다른 POD에서 Write 작업이 가능한 것이다. 이건 좀 주의를 해야 할 것 같다.
아니면 복수의 POD에서 같은 Volume으로 Read, Write 작업이 필요한 경우(NAS 처럼) 유용한 케이스 일 수 있다.
정리하면 Local PV를 사용하면 복수의 Deployment POD가 같은 PVC를 사용 가능하다. 그런데, Local PV를 사용하므로 다른 Node에서 실행되지 않고 같은 Node에서만 POD가 실행된다.
이 경우 PVC가 RWO(ReadWriteOnce) 모드이지만 서로 다른 POD에서 Read Write가 가능한 걸 확인 할 수 있다.
개인적으로 Local PVC를 사용하면 Deployment 환경에서 Replica 증가가 안 되는게 좀 더 이해가 쉬운 구성이라 생각한다.