TheKoguryo's 기술 블로그

 Version 2024.11.15
1.2.3.2.1 File Storage 사용하기(CSI Driver 기반) - 있는 File System 쓰기

컨테이너의 내부 스토리지는 기본적으로 컨테이너가 삭제, 종료되면 사라집니다. 데이터가 사라지는 것을 막고 보존이 필요한 데이터를 저장하기 위해 별도의 Persistent Volume을 사용합니다.

Persistent Volume으로 파일 공유를 위해 저장소로 많이 사용하는 NFS(Network File System)를 사용할 수 있습니다. 네트워크 파일 시스템인 NFS의 경우 동시 쓰기를 지원하기에 Kubernetes에서 멀티 노드상의 멀티 POD에서 동시에 읽고 쓰는 용도로 사용할 수 있습니다. OCI에서는 OCI File Storage Service(FSS)가 OCI에서 제공하는 NFS 서비스입니다. 이제 OKE에서 OCI File Storage을 Persistent Volume으로 사용하는 방법, RWX 접근 모드로 사용하는 방법을 확인해 보겠습니다.

업데이트

Jan. 13, 2022일자 기준 업데이트 Support for provisioning Kubernetes Persistent Volume Claims (PVCs) on File Storage service로 OKE에서 File Storage Service에 대한 CSI Driver 공식적으로 출시되었으며, OKE 공식 문서에도 사용가이드가 포함되었습니다. 이전에 OCI 블로그를 통해 설명된 Flex Volume Driver가 아닌 공식지원하는 CSI Driver 기준으로 사용할 것을 권장합니다.
File System 만들기

관련 문서를 참고하여 File System을 만듭니다.

  1. OCI 콘솔에서 내비게이션 메뉴를 엽니다. Storage > File Storage > File Systems 항목으로 이동합니다.

  2. Create File System 클릭

  3. 생성정보 입력

    • 기본값을 그대로 사용해도 되지만 편의상 이름을 변경합니다.

    • File System Information

      • Name: 우측 Edit Details를 클릭하여 원하는 이름으로 변경, oke-fss-system 입력
    • Export Information : 기본값 사용

    • Mount Target Information

      • Create New Mount Target 선택
      • New Mount Target Name: 우측 Edit Details를 클릭하여 원하는 이름으로 변경, oke-fss-mount-target 입력
      • Virtual Cloud Network: OKE 클러스터가 사용하는 VCN 선택
      • Subnet: Subnet 선택, 예, oke-svclbsubnet-~~~

      image-20230517101840512

  4. 생성 후 File System 화면에서 Mount Target을 클릭하여 생성된 Mount Target 상세 정보로 이동하여 다음 정보를 확인합니다.

    • Mount Target OCID: …wtcaaa

    • IP Address: 예) 10.0.20.12**

    • Export Path: 예) /oke-fss-system

      image-20230517102219937

  5. Security List 설정

    Mount Target의 속한 서브넷에 Security List에 File Storage 서비스를 위한 규칙을 추가합니다.

    • OKE Worker Nodes Subnet -> 생성한 Mount Target으로 접근 허용

    image-20230517102740024

File Storage 서비스를 이용하여 Persistent Volume 사용하기
  1. Persistent Volume (PV) 만들기

    • spec.csi.driver: fss.csi.oraclecloud.com를 사용
    • spec.csi.volumeHandle: <FileSystemOCID>:<MountTargetIP>:<path> 형식으로 아래와 같이 설정
    • spec.accessModes: FFS CSI Driver는 RWX - ReadWriteMany를 지원하므로 테스트를 위해 ReadWriteMany 접근 모드로 지정
    # oke-fss-pv.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: oke-fss-pv
    spec:
      capacity:
        storage: 50Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      csi:
        driver: fss.csi.oraclecloud.com
        volumeHandle: ocid1.filesystem.oc1.ap_chuncheon_1.aaaaa_____wtcaaa:10.0.20.12:/oke-fss-system
    
  2. Persistent Volume Claim(PVC) 만들기

    • storageClassName: ““로 설정
    • volumeName: 앞서 만든 PV의 이름 지정
    # oke-fss-pvc.yaml 
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: oke-fss-pvc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: ""
      resources:
        requests:
          storage: 50Gi
      volumeName: oke-fss-pv
    
  3. PVC를 사용하는 POD 배포하기

    생성한 PVC를 볼륨으로 등록하여 마운트합니다.

    ReadWriteMany 접근모드를 사용하므로 앞선 Block Volume을 PV 사용하는 예제와 달리 replica를 복수개로 지정할 수 있습니다.

    # nginx-deployment-fss-pvc.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx-fss-pvc
      name: nginx-fss-pvc
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx-fss-pvc
      template:
        metadata:
          labels:
            app: nginx-fss-pvc
        spec:
          containers:
          - name: nginx
            image: nginx:latest
            volumeMounts:
            - name: data
              mountPath: /usr/share/nginx/html
          volumes:
          - name: data
            persistentVolumeClaim:
              claimName: oke-fss-pvc
    
  4. 실행 및 결과 예시

    3개 POD가 각각 서로 다른 3개의 Worker Node에 위치하지만 정상 기동된 것을 볼 수 있습니다.

    $ kubectl apply -f oke-fss-pv.yaml 
    persistentvolume/oke-fss-pv created
    $ kubectl apply -f oke-fss-pvc.yaml 
    persistentvolumeclaim/oke-fss-pvc created
    $ kubectl get pv,pvc
    NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   REASON   AGE
    persistentvolume/oke-fss-pv                                 50Gi       RWX            Retain           Bound    default/oke-fss-pvc                           24s
    
    NAME                                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    persistentvolumeclaim/oke-fss-pvc   Bound    oke-fss-pv                                 50Gi       RWX                           18s
    $ kubectl apply -f nginx-deployment-fss-pvc.yaml 
    deployment.apps/nginx-fss-pvc created
    $ kubectl get pod -o wide
    NAME                                READY   STATUS    RESTARTS   AGE   IP             NODE          NOMINATED NODE   READINESS GATES
    nginx-fss-pvc-cc4d6b798-s9jrl       1/1     Running   0          27s   10.244.1.4     10.0.10.39    <none>           <none>
    nginx-fss-pvc-cc4d6b798-snr2t       1/1     Running   0          27s   10.244.0.134   10.0.10.143   <none>           <none>
    nginx-fss-pvc-cc4d6b798-wcvpl       1/1     Running   0          27s   10.244.0.6     10.0.10.107   <none>           <none>
    
  5. 파일 쓰기 테스트

    • 아래와 같이 첫번째 POD에서 PV로 파일쓰기를 했지만, 모든 POD에서 동일내용을 확인할 수 있습니다.

      $ kubectl exec -it nginx-fss-pvc-cc4d6b798-s9jrl -- bash -c 'echo "Hello FSS from 10.0.10.39" >> /usr/share/nginx/html/hello_world.txt'
      $ kubectl exec -it nginx-fss-pvc-cc4d6b798-s9jrl -- cat /usr/share/nginx/html/hello_world.txt
      Hello FSS from 10.0.10.39
      $ kubectl exec -it nginx-fss-pvc-cc4d6b798-snr2t -- cat /usr/share/nginx/html/hello_world.txt
      Hello FSS from 10.0.10.39
      $ kubectl exec -it nginx-fss-pvc-cc4d6b798-wcvpl -- cat /usr/share/nginx/html/hello_world.txt
      Hello FSS from 10.0.10.39
      
참고 문서


이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.

Last updated on 10 Jan 2024