random_image

k3s에서 NFS 로 공유 폴더 사용법

tony | Jan. 4, 2025, 10:08 a.m. | tool | kubernetes

OpenEBS NFS 를 사용법 정리

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 폴더를 확인해보면 로그가 찍히고 있을 것이다.

Last updated on Jan. 6, 2025, 2:43 p.m.

LEAVE A COMMENT

tony | 3 months, 2 weeks ago

다음과 같이 속도 테스트를 해볼 수 있으니 참고

# 쓰기 속도 측정 (1GB 파일 쓰기)
dd if=/dev/zero of=/mnt/data/testfile bs=1M count=1024 oflag=direct

# 읽기 속도 측정 (위에서 생성한 파일 읽기)
dd if=/mnt/data/testfile of=/dev/null bs=1M count=1024 iflag=direct