IT를 공부하자

Kubernetes NFS CSI 드라이버 설치 본문

kubernetes

Kubernetes NFS CSI 드라이버 설치

낭만공돌이 2023. 1. 2. 10:50
반응형

 

Kubernetes의 볼륨 서비스

Kubernetes 환경을 운용하기 위해서는 container 상에 동작하는 데이터에 대한 상태를 영구적으로 저장할 수 있는 외부 스토리지가 필수이다. container 자체의 로컬 볼륨은 container가 종료되면 볼륨의 내용도 초기화되기 때문에 무엇인가를 저장하기 위한 목적이라면 외부의 볼륨 서비스는 필수이다.

 

Kubernetes에 외부 볼륨을 서비스하기 위해서는 해당 스토리지에서 CSI 드라이버를 제공해야 kubernetes와 연동해서 사용할 수 있다. 

 

NFS CSI 드라이버

아래 Kubernetes 공식 홈페이지에서 CSI 드라이버를 제공하는 벤더사 목록을 확인할 수 있는데 가장 쉽게 적용해서 테스트해 볼 수 있는 NFS CSI 드라이버를 설치해 보자. 단, NFS CSI 드라이버는 볼륨스냅샷을 지원하지 않기 때문에 데이터를 백업 솔루션과 연동하여 백업하는 용도로는 적합하지 않으니, 단순 테스트 용도로 사용해 보자.

https://kubernetes-csi.github.io/docs/drivers.html

 

Drivers - Kubernetes CSI Developer Documentation

The following are a set of CSI driver which can be used with Kubernetes: NOTE: If you would like your driver to be added to this table, please open a pull request in this repo updating this file. Other Features is allowed to be filled in Raw Block, Snapsho

kubernetes-csi.github.io

 

NFS CSI 드라이버를 설치하기 위해 참고한 사이트는 아래와 같다.

https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/docs/install-nfs-csi-driver.md

 

GitHub - kubernetes-csi/csi-driver-nfs: This driver allows Kubernetes to access NFS server on Linux node.

This driver allows Kubernetes to access NFS server on Linux node. - GitHub - kubernetes-csi/csi-driver-nfs: This driver allows Kubernetes to access NFS server on Linux node.

github.com

 

 

테스트 구성환경 

테스트를 위한 구성 환경은 다음과 같다. Kubernetes 클러스터 구성은 마스터노드 1대, 워커노드 2대로 구성되어 있다.

구분 OS IP 기타
NFS 서버 Ubuntu 20.04 10.118.99.67 /apt-mirror
k8s master 노드 Ubuntu 20.04 10.118.99.71  

 

external CSI 드라이버 설치

모든 CSI 드라이버를 설치하기 이전에 반드시 external CSI 드라이버를 설치해야 정상적으로 PV, PVC가 생성되어 볼륨을 사용할 수 있다.

 

git 명령어로 아래 사이트의 external snapshotter 소스를 복제한다.

root@kuber01:/home/emc# git clone https://github.com/kubernetes-csi/external-snapshotter/
Cloning into 'external-snapshotter'...
remote: Enumerating objects: 52014, done.
remote: Counting objects: 100% (346/346), done.
remote: Compressing objects: 100% (276/276), done.
remote: Total 52014 (delta 55), reused 303 (delta 41), pack-reused 51668
Receiving objects: 100% (52014/52014), 66.26 MiB | 808.00 KiB/s, done.
Resolving deltas: 100% (27043/27043), done.
Updating files: 100% (6312/6312), done.

복제가 완료되면 버전을 확인하고 원하는 버전의 external snapshotter를 선택하고 설치를 진행한다.

root@kuber01:/home/emc# cd ./external-snapshotter

root@kuber01:/home/emc/external-snapshotter# ls
CHANGELOG  cloudbuild.yaml  code-of-conduct.md  deploy    go.mod  LICENSE   OWNERS          pkg        release-tools      vendor
client     cmd              CONTRIBUTING.md     examples  go.sum  Makefile  OWNERS_ALIASES  README.md  SECURITY_CONTACTS

root@kuber01:/home/emc/external-snapshotter# cd CHANGELOG/

root@kuber01:/home/emc/external-snapshotter/CHANGELOG# ls
CHANGELOG-1.1.md  CHANGELOG-2.0.md  CHANGELOG-3.0.md  CHANGELOG-4.1.md  CHANGELOG-5.0.md  CHANGELOG-6.1.md
CHANGELOG-1.2.md  CHANGELOG-2.1.md  CHANGELOG-4.0.md  CHANGELOG-4.2.md  CHANGELOG-6.0.md  README.md

root@kuber01:/home/emc/external-snapshotter/CHANGELOG# cd ..

root@kuber01:/home/emc/external-snapshotter# git checkout release-6.1
Branch 'release-6.1' set up to track remote branch 'release-6.1' from 'origin'.
Switched to a new branch 'release-6.1'

root@kuber01:/home/emc/external-snapshotter# kubectl kustomize client/config/crd | kubectl create -f -
customresourcedefinition.apiextensions.k8s.io/volumesnapshotclasses.snapshot.storage.k8s.io created
customresourcedefinition.apiextensions.k8s.io/volumesnapshotcontents.snapshot.storage.k8s.io created
customresourcedefinition.apiextensions.k8s.io/volumesnapshots.snapshot.storage.k8s.io created


root@kuber01:/home/emc/external-snapshotter# kubectl -n kube-system kustomize deploy/kubernetes/snapshot-controller | kubectl create -f -
serviceaccount/snapshot-controller created
role.rbac.authorization.k8s.io/snapshot-controller-leaderelection created
clusterrole.rbac.authorization.k8s.io/snapshot-controller-runner created
rolebinding.rbac.authorization.k8s.io/snapshot-controller-leaderelection created
clusterrolebinding.rbac.authorization.k8s.io/snapshot-controller-role created
deployment.apps/snapshot-controller created

 

 

NFS CSI 드라이버 설치

아래와 같이 마스터 노드에서 curl 명령어를 통해 설치 스크립트를 원격에서 가져와 직접 실행한다.

curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.1.0/deploy/install-driver.sh | bash -s v4.1.0 --

 

실행 결과는 아래와 같다.

root@kuber01:/home/emc# curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.1.0/deploy/install-driver.sh | bash -s v4.1.0 --
Installing NFS CSI driver, version: v4.1.0 ...
serviceaccount/csi-nfs-controller-sa created
serviceaccount/csi-nfs-node-sa created
clusterrole.rbac.authorization.k8s.io/nfs-external-provisioner-role created
clusterrolebinding.rbac.authorization.k8s.io/nfs-csi-provisioner-binding created
csidriver.storage.k8s.io/nfs.csi.k8s.io created
deployment.apps/csi-nfs-controller created
daemonset.apps/csi-nfs-node created
NFS CSI driver installed successfully.

 

설치가 정상적으로 완료되면 아래와 같이 POD 정보를 확인해서 배포 상태를 모니터링한다.

root@kuber01:/home/emc# kubectl -n kube-system get pod -o wide -l app=csi-nfs-controller
NAME                                  READY   STATUS              RESTARTS   AGE   IP             NODE      NOMINATED NODE   READINESS GATES
csi-nfs-controller-679b6d5754-4pd9c   0/3     ContainerCreating   0          20s   10.118.99.72   kuber02   <none>           <none>


root@kuber01:/home/emc# kubectl -n kube-system get pod -o wide -l app=csi-nfs-node
NAME                 READY   STATUS              RESTARTS   AGE   IP             NODE      NOMINATED NODE   READINESS GATES
csi-nfs-node-67szt   0/3     ContainerCreating   0          25s   10.118.99.71   kuber01   <none>           <none>
csi-nfs-node-cm68z   0/3     ContainerCreating   0          25s   10.118.99.72   kuber02   <none>           <none>
csi-nfs-node-h255x   0/3     ContainerCreating   0          25s   10.118.99.73   kuber03   <none>           <none>

 

배포가 완료되면 최종적으로 아래와 같이 모든 POD가 Running 상태이다.

root@kuber01:/home/emc# kubectl -n kube-system get pod -o wide -l app=csi-nfs-controller
NAME                                  READY   STATUS    RESTARTS   AGE     IP             NODE      NOMINATED NODE   READINESS GATES
csi-nfs-controller-679b6d5754-4pd9c   3/3     Running   0          4m48s   10.118.99.72   kuber02   <none>           <none>


root@kuber01:/home/emc# kubectl -n kube-system get pod -o wide -l app=csi-nfs-node
NAME                 READY   STATUS    RESTARTS   AGE     IP             NODE      NOMINATED NODE   READINESS GATES
csi-nfs-node-67szt   3/3     Running   0          4m54s   10.118.99.71   kuber01   <none>           <none>
csi-nfs-node-cm68z   3/3     Running   0          4m54s   10.118.99.72   kuber02   <none>           <none>
csi-nfs-node-h255x   3/3     Running   0          4m54s   10.118.99.73   kuber03   <none>           <none>

 

볼륨 할당 테스트

이제 모든 드라이버가 설치가 완료되었으므로 샘플 App을 배포하여 실제로 NFS 서버에 볼륨이 생성되고 앱에 할당되는지를 테스트해보자. nginx 웹서버를 기동하고 웹서버에 10Gi 볼륨을 NFS CSI 스토리지 클래스를 호출하여 동적으로 할당하도록 설정하고 배포를 진행한다. 그리고 nginx 웹서버가 할당된 볼륨에 로그를 찍도록 하였다.

root@kuber01:/home/emc# vi nginx-deployment.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-deployment-nfs
spec:
  accessModes:
    - ReadWriteMany  # In this example, multiple Pods consume the same PVC.
  resources:
    requests:
      storage: 10Gi
  storageClassName: nfs-csi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-nfs
spec:
  replicas: 1
  selector:
    matchLabels:
      name: deployment-nfs
  template:
    metadata:
      name: deployment-nfs
      labels:
        name: deployment-nfs
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
        - name: deployment-nfs
          image: mcr.microsoft.com/oss/nginx/nginx:1.19.5
          command:
            - "/bin/bash"
            - "-c"
            - set -euo pipefail; while true; do echo $(hostname) $(date) >> /mnt/nfs/outfile; sleep 1; done
          volumeMounts:
            - name: nfs
              mountPath: "/mnt/nfs"
      volumes:
        - name: nfs
          persistentVolumeClaim:
            claimName: pvc-deployment-nfs


root@kuber01:/home/emc# kubectl create -f nginx-deployment.yaml
persistentvolumeclaim/pvc-deployment-nfs created
deployment.apps/deployment-nfs created

 

할당된 pv, pvc 정보를 확인한다. 정상적으로 할당된 것을 확인할 수 있다.

root@kuber01:/home/emc# kubectl get pvc
NAME                 STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-deployment-nfs   Bound    pvc-eb866fed-9dd6-49c9-89d3-f8af14cc43d4   10Gi       RWX            nfs-csi        4s

root@kuber01:/home/emc# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                        STORAGECLASS   REASON   AGE
pvc-eb866fed-9dd6-49c9-89d3-f8af14cc43d4   10Gi       RWX            Delete           Bound    default/pvc-deployment-nfs   nfs-csi                 6s

 

NFS 서버에서 생성된 볼륨 정보를 확인한다.

root@ubuntu2204:/apt-mirror# ls -la
total 12
drwxrwxrwx  3 emc    emc     4096 Dec 27 04:04 .
drwxr-xr-x 20 root   root    4096 Dec 17 06:25 ..
drwxrwxrwx  2 nobody nogroup 4096 Dec 27 04:04 pvc-eb866fed-9dd6-49c9-89d3-f8af14cc43d4
root@ubuntu2204:/apt-mirror#

 

간단하게 NFS CSI 드라이버를 활용하여 container 환경에 볼륨을 할당하여 구성하는 방법을 살펴보았다.

Comments