k3s(혹은 k8s) 클러스터 내부의 여러 노드에 배포되어있는 pod들에서 동시에 접근가능한 폴더를 설정해 사용하고 싶을 때가 있다.
NFS, Ceph, JuiceFS 등 여러 옵션이 있지만 OpenEBS 가 light하게 쓸 수 있는 것 같아 이방법을 사용해본 후기를 정리하고자 한다.
OpenEBS의 NFS Provisioner를 사용하면 내부적으로 NFS를 통해 여러 노드에서 접근 가능하도록 설정된다.
https://github.com/openebs-archive/dynamic-nfs-provisioner/blob/develop/docs/intro.md#quickstart 를 참고하였다.
Prerequisite
배포된 Pod이 할당된 노드에서 NFS 통신을 하기위해서 NFS 관련툴이 설치되어 있어야 한다.
따라서, nfs사용이 가능하도록 만든 노드들에 label을 달아두자. (내 경우엔 blueberrypi 와 mango 서버에 nfs관련 툴을 설치해 두었다.)
kubectl label nodes blueberrypi nfs-ready=true
kubectl label nodes mango nfs-ready=true
참고로 nfs 관련툴은 ubuntu이면 nfs-common 이고, centos면 nfs-utils이다. 다음과 같이 노드에 들어가 nfs관련 툴들을 설치해줘야한다
ssh blueberrypi && apt-get install nfs-common
Helm을 통한 OpenEBS 설치
내가 원하는건 다중노드에서 접근 가능한 nfs-provisioner이기 떄문에 localprovisioner 기능은 disable 시킨채로 다음과 같이 설치한다.
helm install openebs openebs/openebs -n openebs --create-namespace \
--set ndm.enabled=false \
--set ndmOperator.enabled=false \
--set localprovisioner.enabled=false \
--set nfs-provisioner.enabled=true
설치하고 나면 다음과 같이 openebs-nfs-provisioner가 배포된다.
(base) ➜ ~ k get deployment -n openebs
NAME READY UP-TO-DATE AVAILABLE AGE
nfs-pvc-8ef68ab6-d541-42ab-9956-16591ac29874 1/1 1 1 13m
OpenEBS NFS pvc 생성 및 Pod 연결
이제 다음과 같이 nfs-provisioner에 의해 pvc가 배포되도록 manifest를 설정한다.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: openebs-kernel-nfs
provisioner: openebs.io/nfsrwx
reclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
storageClassName: openebs-kernel-nfs
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10G
위 설정을 통해 openebs namespace에는 pvc deployment(nfs-pvc-8ef68ab6-d541-42ab-9956-16591ac29874
)가 배포된다.
(base) ➜ ~ k get deployment -n openebs
NAME READY UP-TO-DATE AVAILABLE AGE
openebs-nfs-provisioner 1/1 1 1 65m
nfs-pvc-8ef68ab6-d541-42ab-9956-16591ac29874 1/1 1 1 23m
이제 Pod에서 해당 NFS 폴더를 Mount하도록 배포만 해주면 끝이다.
apiVersion: v1
kind: Pod
metadata:
name: nfs-app
spec:
containers:
- name: app-container
image: busybox
command: ["/bin/sh", "-c", "while true; do echo $(date) >> /mnt/data/log.txt; sleep 5; done"]
volumeMounts:
- mountPath: /mnt/data
name: nfs-volume
volumes:
- name: nfs-volume
persistentVolumeClaim:
claimName: nfs-pvc
/mnt/data
폴더를 확인해보면 로그가 찍히고 있을 것이다.