[NCP] 쿠버네티스에서 NAS(Network Attached Storage) 볼륨과 연결할 수 있는 방법들 (nas-csi, nfs-provisionor)

NewNewDaddy·2024년 2월 2일
0

Ncloud

목록 보기
6/8
post-thumbnail

🔹 0. INTRO

  • 쿠버네티스는 배포된 서비스의 데이터를 저장 할 수 있는 다양한 옵션들을 제공한다. "쿠버네티스에서 Volume을 공유하기 위한 방법들" 이라는 예전 글에서 데이터 저장소로 사용할 수 있는 옵션들에 대해서 다뤄보았다.
  • kubectl 명령을 내리는 bastion 혹은 master 서버에 hostpath 옵션 등으로 볼륨을 mount하여 사용해도 되지만 이는 서비스가 많아질시 안정성이나 용량 제한 등의 리스크가 있기 때문에 운영 상황에서는 거의 사용되지 않는 선택지인 것 같다.
  • 일반적으로는 Storage Class를 만들고 서비스 배포시 해당 서비스의 볼륨과 연결될 저장소에 대한 PVC 리소스를 요청하여 PV를 생성하여 볼륨에 마운팅하는 방식으로 많이 사용하게 되는데 이때 선택할 수 있는 저장소 옵션으로 NAT(Network Attached Storage)가 있다.
  • 이번 글에서는 NKS에서 NAT 저장소를 사용하며 선택할 수 있는 두 가지 옵션들에 대한 사용방법 및 차이점에 대해서 다뤄볼 것이다.

🔹 1. NAS(Network Attached Storage)란 무엇인가?

  • 정의

    네트워크에 연결된 저장소(Network Attached Storage, NAS)는 데이터를 공유하기 위해 네트워크에 연결된 스토리지 장치를 말합니다. NAS는 파일 서버의 형태로 동작하며, 다양한 사용자가 파일에 접근할 수 있도록 하고, 파일을 저장하고 검색하는 기능을 제공합니다.

  • 특징

  1. 네트워크 공유

    • NAS는 일반적으로 이더넷 또는 무선 네트워크를 통해 컴퓨터 및 기타 장치에 연결됩니다.
    • 사용자들은 네트워크를 통해 NAS에 접근하여 파일을 공유하고 저장할 수 있습니다.
  2. 중앙 집중화된 저장

    • NAS는 중앙에서 데이터를 저장하므로 여러 사용자가 동일한 파일이나 리소스에 쉽게 액세스할 수 있습니다.
    • 이는 중복을 피하고 데이터를 효율적으로 관리할 수 있도록 합니다.
  3. 간단한 설정과 관리

    • 대부분의 NAS 시스템은 사용자 친화적인 웹 기반 인터페이스를 통해 간단하게 설정 및 관리될 수 있습니다.
    • 파일 및 사용자 권한 설정, 보안 기능 등을 손쉽게 구성할 수 있습니다.
  4. 데이터 백업 및 복구

    • NAS는 데이터를 중앙에서 저장하므로 데이터를 백업하고 복구하기가 편리합니다.
    • 많은 NAS 시스템은 자동 백업 및 복구 기능을 제공하여 데이터 손실을 방지할 수 있습니다.
  5. 접근 권한 관리

    • NAS는 다양한 사용자나 그룹에 대한 접근 권한을 관리할 수 있습니다.
    • 파일 또는 디렉토리에 대한 읽기, 쓰기, 실행 등의 권한을 조정하여 보안을 강화할 수 있습니다.
  6. 확장성

    • 대부분의 NAS 시스템은 필요에 따라 스토리지를 확장할 수 있는 기능을 제공합니다.
    • 새로운 하드 드라이브를 추가하거나 네트워크에서 다른 NAS 시스템을 연결하여 스토리지를 확장할 수 있습니다.

🔹 2-1. nks-nas-csi 에 대하여

  • nks-nas-csi는 NKS 클러스터 생성시 자동으로 생성되는 리소스이다.
  • CSI는 Container Storage Interface의 줄임말로 쿠버네티스 클러스터와 외부 저장소 간의 표준 인터페이스를 제공해준다. 즉, ALB Controller와 비슷하게 클러스터에서 외부 저장소 관련 요청이 들어왔을 때 저장소를 자동 생성해준다던지, 연결해주는 등의 역할을 수행한다.
  • nks-nas-csi는 해당 Storage Class에 대해서 PVC 요청이 들어오면 요청을 받은 스펙에 맞도록 Ncloud쪽에 NAS 서비스를 생성해주고 연결까지 시켜준다. 그림으로 표현하자면 아래와 같다.

  • 만약 SERVICE-B에서 PVC 요청을 SERVICE-A와 동일한 이름인 PVC-A로 하게 되면 SERVICE-A가 만들어지면서 생긴 NAS-A에 연결되어 두 서비스가 동일한 볼륨을 공유하게된다.

  • 즉, nks-nas-csi를 통한 NAS 볼륨 생성의 경우 하나의 서비스에 1:1로 매칭되어 생성이 되며, 다른 서비스들이 동일한 이름의 PVC로 볼륨 연결 요청을 하게되면 하나의 NAS로 볼륨을 공유하게 된다.

🔹 2-2. nks-nas-csi를 통한 NAS 생성 및 연결

📍 1. Storage Class 확인

  • 명령을 통해 nks-nas-csi 이름의 storage class가 있는지 확인한다. NKS에서는 클러스터 생성시 자동으로 생성되기 때문에 무조건 있을 것이다.
> kubectl get sc

    NAME                   PROVISIONER                                     RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
    nks-block-storage      blk.csi.ncloud.com                              Delete          WaitForFirstConsumer   true                   2d7h
    nks-nas-csi            nas.csi.ncloud.com                              Delete          WaitForFirstConsumer   true                   2d7h

📍 2. PVC 파일 작성

  • nks-nas-csi Storage Class를 통해 PV를 생성할 수 있도록 PVC를 작성해준다. (storageClassName에 명시)

pvc-csi.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nas-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Gi
  storageClassName: nks-nas-csi

📍 3. Deployment의 volume과 연결

  • Deployment를 통해 생성되는 서비스의 volume 부분에 위에서 만든 PVC가 연결될 수 있도록 작성해준다.

deployment-csi.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nas-deployment
  namespace: default
spec:
  selector:
    matchLabels:
      app: nas
  replicas: 1
  template:
    metadata:
      labels:
        app: nas
    spec:
      containers:
      - name: nas-container
        image: hyunsoolee0506/scalaspark:3.5.0
        ports:
          - containerPort: 8888
        volumeMounts:
        - name: nas-vol
          mountPath: /workspace/spark
      volumes:
      - name: nas-vol
        persistentVolumeClaim:
          claimName: nas-pvc

📍 4. Deployment apply 후 NAS 볼륨 생성 확인

kubectl apply -f pvc-csi.yaml
kubectl apply -f deployment-csi.yaml

  • 위 명령어로 리소스들을 생성해주면 Ncloud 콘솔의 NAS > Volume에서 아래와 같이 랜덤한 이름으로 요청한 크기의 NAS 볼륨이 생성된 것을 확인할 수 있다.

🔹 3-1. NFS Client Provisioner 에 대하여

  • 이는 쿠버네티스 클러스터에서 NFS 서버와 연동하여 동적으로 PV(Persistent Volume)를 프로비저닝하는 프로비저너로 PVC 요청이 생성되었을 때, Provisioner가 이에 맞추어 NFS 서버에 새로운 디렉토리를 생성하고 해당 디렉토리를 PV로 할당하여 PVC와 연결한다.
  • NAT 볼륨을 서비스와 자동으로 연결해준다는 목적으로만 본다면 nks-nas-csi와 역할이 비슷하지만 결정적인 차이점들이 몇가지 있다.
  • 우선 helm을 통해 클러스터에 따로 설치가 필요하며 최초에 NAT 볼륨도 수동으로 생성을 해줘야한다. 또한 여러 서비스가 동일한 Storage Class로 PVC 요청을 생성해도 NAT가 새롭게 만들어지지 않고 최초에 생성한 NAT 내부에 디렉토리로 분리가 되어 볼륨 마운트가 된다.
  • 즉, 최초에 NAT 볼륨 수동 생성 후 서비스와 연결을 하면 NAT 볼륨 내부에 배포된 서비스의 볼륨과 연결된 디렉토리가 [namespace]-[pvc name]-[pvc id] 명명 규칙에 따라 생성된다.

  • 이때, 다른 서비스가 동일한 Storage Class로 PVC 요청 생성하게되면 아래 그림과 같이 NAS 볼륨이 새로 만들어지는게 아니라 내부 디렉토리로 구분되어 연결된다.

  • nks-nas-csi 와 NFS Client의 차이점을 표로 정리하면 아래와 같다.

    내용nks-nas-csiNFS Client
    설치클러스터 생성시 자동 생성Helm을 통한 설치
    최초 생성자동 생성수동 생성
    볼륨 구분새로운 NAS 볼륨으로 구분동일한 NAS 볼륨 내 디렉토리로 구분
    볼륨 연결자동자동
    개인적인 의견서비스마다 매번 새로운 NAS가 생성되어 불편하나의 NAS로 여러 볼륨을 디렉토리로 나누어 구분 가능하여 편함

🔹 3-2. NFS Client Provisioner를 통한 NAS 생성 및 연결

📍 1. NAS 볼륨 생성

  • Ncloud 콘솔에 접속하여 NAS > Volume > NAS 볼륨 생성 탭을 클릭하여 새로운 NAS 볼륨을 생성해줄 수 있다.
  • 생성할 NAS 볼륨에 대한 이름과 용량을 입력 후 해당 NAS에 접근 할 서버를 선택해서 우측으로 옮겨준다. 나의 경우에는 쿠버네티스 클러스터의 Worker Node 서버Bastion 서버를 선택하였다.
  • 접근 서버 설정까지 끝나면 NAS 생성을 완료해준다.

📍 2. NFS Client Provisioner 설치 및 확인

  • Helm을 통해 따로 설치를 해주어야 하며 공공존/민간존에 따라 설정하는 yaml 파일이 다르므로 유의한다.
  • Docs에 설치 방법이 친절히 나와있어 순서대로 따라해주면 어렵지 않게 설치가 가능하다
    1. Helm repo에 nfs-subdir-external-provisioner 추가
    2. 생성한 NAS의 IP와 Path를 설정값에 넘겨주어 helm install 진행
  • 설치 후 storage class에 잘 표시되는지 확인한다.
> kubectl get sc

    NAME                   PROVISIONER                                     RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
    nfs-client (default)   cluster.local/nfs-subdir-external-provisioner   Delete          Immediate              true                   5h
    nks-block-storage      blk.csi.ncloud.com                              Delete          WaitForFirstConsumer   true                   2d7h
    nks-nas-csi            nas.csi.ncloud.com                              Delete          WaitForFirstConsumer   true                   2d7h

📍 3. PVC 파일 작성

  • 새로 생성된 nfs-client Storage Class를 통해 PV를 생성할 수 있도록 PVC를 작성해준다. (default storage class일 경우 storageClassName 부분 생략 가능)

pvc-nfs.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Gi
  storageClassName: nfs-client

📍 4. Deployment 파일 작성 및 리소스 생성

  • Deployment를 통해 생성되는 서비스의 volume 부분에 위에서 만든 PVC가 연결될 수 있도록 작성해준다.

deployment-nfs.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nas-deployment
  namespace: default
spec:
  selector:
    matchLabels:
      app: nfs
  replicas: 1
  template:
    metadata:
      labels:
        app: nfs
    spec:
      containers:
      - name: nfs-container
        image: hyunsoolee0506/scalaspark:3.5.0
        ports:
          - containerPort: 8888
        volumeMounts:
        - name: nfs-vol
          mountPath: /workspace/spark
      volumes:
      - name: nfs-vol
        persistentVolumeClaim:
          claimName: nfs-pvc

kubectl apply -f pvc-nfs.yaml
kubectl apply -f deployment-nfs.yaml

📍 5. 서버에 NAS 볼륨 마운트 후 디렉토리 생성 확인

  • NKS 클러스터에 kubectl 명령을 내리는 bastion 호스트의 디렉토리에 NAS 볼륨 마운팅을 해준다.
## 1) nfs 관련 패키지 설치
> apt-get install nfs-common -y

## 2) 마운트 할 디렉토리 생성
> mkdir /mnt/nas

## 3) 마운트 진행
> sudo mount -t nfs [NAS IP]:[NAS PATH] /mnt/nas

## 4) 마운트 확인
> df -Th

  Filesystem                                    Type      Size  Used Avail Use% Mounted on
  udev                                          devtmpfs  3.9G     0  3.9G   0% /dev
  tmpfs                                         tmpfs     793M  724K  792M   1% /run
  /dev/xvda1                                    ext4       49G  4.5G   42G  10% /
  tmpfs                                         tmpfs     3.9G     0  3.9G   0% /dev/shm
  tmpfs                                         tmpfs     5.0M     0  5.0M   0% /run/lock
  tmpfs                                         tmpfs     3.9G     0  3.9G   0% /sys/fs/cgroup
  169.254.***.***:/n009998_*******              nfs4      100G  208M  100G   1% /mnt/nas
  • 마운팅된 /mnt/nas 디렉토리 내부 분기 구조를 tree 명령어로 확인해보면 각 서비스별 볼륨이 NAS 내부에 디렉토리로 분리가 되어 마운트 된 것을 볼 수 있다.
## 1) tree 명령어 install
> sudo apt install tree

## 2) 디렉토리 구조 확인
> tree -d /mnt/nas/

    /mnt/nas/
    ├── archived-default-nfs-pvc-pvc-6d4cfe61-a7c7-49b3-a7b1-aceaa5b20aaf
    ├── jupyter-jupyter-pvc-pvc-72c5156f-96bb-4f5e-837d-c7e1ee3fe920
    └── trino-mysql-pvc-pvc-e2b41553-33d5-439a-aca2-2188ecf76df3

4. OUTRO

  • NKS에서 NAS 를 볼륨으로 연결할 수 있는 두 가지 선택지에 대해서 알아보았다. nks-nas-csi의 경우 YAML 리소스에 명시만 해주면 완전 자동으로 생성해준다는 장점이 있지만 일반적으로 NAS가 만들어 질때 적게는 100GB, 많게는 몇 테라까지 용량을 설정하여 생성하기 때문에 자동으로 생성되더라도 서비스별로 하나씩 생성이 되는 것은 큰 메리트가 아닐 것이라 생각된다.
  • 큰 용량의 NAS 볼륨 하나를 여러개의 서비스가 나눠쓸 수 있도록 하는 nfs-client를 사용하여 PV를 생성하는 것이 관리적으로나 리소스적으로 더 현명한 선택지가 아닐까 생각된다.

5. 참고자료

NAS 볼륨 CSI
NFS Client Provisioner 설정

profile
데이터 엔지니어의 작업공간 / #PYTHON #CLOUD #SPARK #AWS #GCP #NCLOUD

0개의 댓글