데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      AKS 상용 서비스 적용기 (4) - Volume 설정 (부제: Azure에서 BlobStorage를 PV/PVC로 설정하는 방법)

      dragonpipe 24.08.13
      1,980 5 0
      DEVOTEE 요약
      Azure Kubernetes Service(AKS)에서 파일을 영구적으로 저장하기 위해 PV/PVC를 사용하는 방법을 설명합니다. PV와 PVC를 사용해 외부 볼륨을 설정해 데이터 유실을 방지하며, 이를 위해 Secret, StorageClass, PersistentVolume, PersistentVolumeClaim를 생성하고 Pod에 마운트하는 과정을 다룹니다. AKS에서 BlobStorage와 FileStorage 설정의 차이점도 포함되어 있습니다.
      DEVOTEE 추천 블로그

      안녕하세요, dragonpipe입니다.

      이 번에는 AKS(Azure Kubernetes Service) 상용 서비스에 적용한 후기 네 번째 내용으로,

      k8s 환경에서 파일을 영구적으로 저장할 수 있게 해주는 Volume(PV/PVC)에 대해 소개드리려고 합니다.


      K8S 환경에서의 Volume

      쿠버네티스에서는 왜 외부 볼륨을 사용해야 할까요?

      쿠버네티스에서는 모든 어플리케이션이 파드안에 컨테이너로 실행되는데요.

      컨테이너는 언제라도 사라질 수 있기 때문에 컨테이너가 사라지면 당연히 내부 볼륨도 없어지고 그럴 경우 소중한 데이터를 잃어 버릴 수 있습니다.

      따라서 쿠버네티스는 외부 볼륨을 사용해야 하는데요.

      보통 아래 이미지와 같이 PV와 PVC를 사용하여 구성합니다.

      간략히 구조를 설명드리자면

      1) 필요한 파일 스토리지를 생성하고

      2) PV로 정적 프로비저닝한 뒤

      3) PVC로 동적 프로비저닝하여

      4) 컨테이너에서 Volume형태로 mount해서 사용합니다.

      pv(1).png

      그렇다면 쿠버네티스 환경에서는 왜 PV/PVC 리소스가 필요할까요?

      이 질문에 답을 하기 위해선 어떻게 파드가 볼륨을 사용하는지 알아야 하는데요.

      파드는 파드내에 볼륨을 ‘마운트'함으로써 어떤 유형의 볼륨이든 상관 없이 마치 파드 내부의 파일 시스템인것처럼 사용 가능하게 합니다.

      pv(2).png

      하지만 위 아키텍처의 치명적인 문제가 있는데요. 바로 쿠버네티스와 스토리지 인프라스트럭처가 Tightly Coupled 된다는 점 입니다.

      강결합으로 인해 스토리지 제품의 변화나 스토리지 서버의 변화가 파드에 직접적인 영향을 미치게 되는데요.

      예를 들어 ‘nfs’라는 네트워크 볼륨을 파드에 마운트 하려면 nfs 서버의 IP나 호스트를 지정해야 하는데 nfs서버의 IP가 변경되면 서비스에 문제가 발생할 수 있습니다.

      이 문제를 해결하기 위해 쿠버네티스와 인프라스트럭처를 Loosly Coupled한 구조로 구성해야 하는데요.

      퍼시스턴트 볼륨PV(Persistent Volume)과 퍼시스턴트 볼륨 클레임PVC(Persistent Volume Claim)

      그리고 CSI(Container Storage Interface)가 중계자 역할을 해줌으로써 느슨한 결합을 가능하게 합니다.

      pv(3).png

      참고자료 : https://happycloud-lee.tistory.com/256


      AKS에서 PV/PVC 설정하는 방법

      그럼 이제 본격적으로 AKS(Azure Kubernetes Service)에서 PV/PVC를 어떻게 사용하였는지 알아보겠습니다.

      1. Secret 생성

      우선 File Storage는 필요하신 유형으로 생성해주시면 됩니다.

      Azure에서 File Storage의 종류와 생성하는 방법은 Azure의 공식 문서를 참고해주시길 바랍니다.

      https://learn.microsoft.com/ko-kr/azure/storage/common/storage-account-create?tabs=azure-portal

      Azure File Storage 생성이 완료되었으면 이제 k8s와 연결하면 되는데요.

      연결하기 위해서는 인증 정보가 필요하고 k8s에서는 이 인증 정보를 Secret으로 관리합니다.

      이 Secret을 생성하는 방법을 알아보겠습니다.

      1. 인증 정보 조회: Azure 포탈 > 스토리지 계정 > 액세스 키(access key) 탭에서 확인 가능

        pv(5).png

      2. Secret 생성 명령어 실행

        • $AKS_PERS_STORAGE_ACCOUNT_NAME : azure 포탈에서 '스토리지 계정 이름' 입력

        • $STORAGE_KEY : azure 포탈에서 '키' 값 복사 후 입력

        • namespace : PVC가 사용하려면 해당 namespace에 secret을 생성해야 함

        kubectl create secret generic {secret명} --from-literal=azurestorageaccountname=$AKS_PERS_STORAGE_ACCOUNT_NAME --from-literal=azurestorageaccountkey=$STORAGE_KEY -n {namespace명}


      2. StorageClass(SC) 생성 : 스토리지 유형을 정의해주는 오브젝트

      AKS Cluster 생성 시 기본 스토리지 유형에 대한 Storage Class는 미리 생성되어 있어서 만약 기본 스토리지 유형을 사용할 경우 별도로 SC를 추가하지 않으셔도 됩니다.

      pv(6).png

      '-premium'으로 끝나는 스토리지 유형은 PREMIUM_LRS를 사용합니다.

      따라서 만약 파일 스토리지가 Premium_LRS일 경우에는 '-premium'으로 끝나는 스토리지 유형을 사용하는 것을 권장합니다.

      물론 premium으로 설정하여도 파일 스토리지가 standard_LRS일 경우 standard의 성능으로 사용 가능합니다.

      이름

      이유

      managed-csi

      Azure StandardSSD LRS(로컬 중복 스토리지)를 사용하여 관리 디스크를 만듭니다. 회수 정책은 사용된 영구 볼륨이 삭제되면 기본 Azure Disk도 삭제되도록 합니다. 또한 스토리지 클래스는 영구 볼륨을 확장 가능하도록 구성하므로 사용자는 영구적 볼륨 클레임을 새 크기로 편집하기만 하면 됩니다.

      managed-csi-premium

      Azure Premium LRS(로컬 중복 스토리지)를 사용하여 관리 디스크를 만듭니다. 또 다시 회수 정책은 사용된 영구 볼륨이 삭제되면 기본 Azure Disk도 삭제되도록 합니다. 마찬가지로, 이 스토리지 클래스는 영구 볼륨을 확장할 수 있도록 합니다.

      azurefile-csi

      Azure Standard 스토리지를 사용하여 Azure 파일 공유를 만듭니다. 회수 정책은 사용된 영구 볼륨이 삭제되면 기본 Azure 파일 공유도 삭제되도록 합니다.

      azurefile-csi-premium

      Azure Premium Storage를 사용하여 Azure 파일 공유를 만듭니다. 회수 정책은 사용된 영구 볼륨이 삭제되면 기본 Azure 파일 공유도 삭제되도록 합니다.

      만약 기본 FileStorage(예: NAS)가 아닌 BlobStorage를 mount해야 할 경우에는 SC를 추가해주어야 합니다.

      Azure 포탈에서 연결하려는 스토리지 계정이 FileStorage인지 BlobStorage인지 확인하는 방법은 아래와 같습니다.

      pv(8).png


      Blob storage 관련 스토리지 클래스를 생성하기 위해서는 aks에 Blob storage 관련 driver를 활성화하여 합니다.

      Azure 포탈에서 az 명령어를 통해 가능하며 방법은 아래와 같습니다.

      1. 구독 계정 설정 (AKS가 포함되어 있는 구독계정으로 설정 후 enable 명령어 실행해야 함. 설정하지 않으면 resource not found 에러가 발생)

        #구독 계정 리스트 조회
        az account list --output table
        
        #구독 계정 변경
        az account set --subscription <SubscriptionId>
      2. --enable-blob-driver 명령으로 blob 관련 driver가 활성화 되도록 변경

        az aks update --enable-blob-driver -n myAKSCluster -g myResourceGroup
      3. BlobStorage 관련 스토리지클래스(SC)가 추가되었는지 확인pv(7).png


      3. PersistentVolume(PV) 생성

      이제 PV(Persistent Volume)을 생성해보겠습니다.

      1. pv.yaml 파일 작성

        • capacity.storage : 최대 얼마만큼 사용할 지 결정 (PV는 정적 프로비저닝 이므로 한 번 결정하면 변경 불가, 변경 필요 시 삭제하고 다시 만들어야 함)

        • accessMode : 아래 옵션 중 요건에 맞게 선택

          1. ReadWriteOnce(RWO) : 하나의 노드가 볼륨을 Read/Write 가능하도록 마운트

          2. ReadOnlyMany(ROX) : 여러개의 노드가 Read 전용으로 사용하도록 마운트

          3. ReadWriteMany(RWX) : 여러개의 노드가 Read/Write 가능하도록 마운트

        • storageClassName : 사용할 StorageClass 이름 입력

        • azureFile 설정

          • secretName : 생성한 secret 이름 입력

          • shareName : azure file 스토리지의 path 입력 (저장 혹은 파일을 읽을 경로 입력)

        kind: PersistentVolume
        apiVersion: v1
        metadata:
          name: {pv명}
        spec:
          capacity:
            storage: 10Gi
          accessModes:
            - ReadOnlyMany
          persistentVolumeReclaimPolicy: Retain
          storageClassName: azurefile-csi # storage kind by azure files
          mountOptions:
            - dir_mode=0777
            - file_mode=0777
            - uid=1000
            - gid=1000
            - mfsymlinks
            - nobrl
          azureFile:
            secretName: azure-secret-oavatarstg # secret to connect azure preminum files
            shareName: {filepath}  # azure files' path
            readOnly: true  # to read
      2. FileStorage가 아닌 BlobStorage를 PV로 프로비저닝 하고 싶은 경우

        • storageClassName: azureblob-fuse-premium로 설정

        • azureblob-fuse-premium을 사용하는 이유: azureblob-nfs-premium을 사용할 경우 secret을 이용하지 못하고 resource group과 container name을 명시해서 사용해야 함 (보안에 취약)

          azureblob-fuse-premium을 사용하면 스토리지 access key와 계정 name을 사용하여 secret을 만들어서 사용할 수 있어 보안에 유리

        • volumeHandle은 클러스터 내에서 해당 볼륨을 구분하기 위한 ID로 사용자가 자유롭게 정의

        • volumeAttributes.containerName은 컨테이너 이름

        • nodeStageSecretRef.name은 미리 만들어 놓은 시크릿 이름

        apiVersion: v1
        kind: PersistentVolume
        metadata:
          annotations:
            pv.kubernetes.io/provisioned-by: blob.csi.azure.com
          name: {pv명}
        spec:
          capacity:
            storage: 10Gi
          accessModes:
            - ReadWriteMany
          persistentVolumeReclaimPolicy: Retain  # If set as "Delete" container would be removed after pvc deletion
          storageClassName: azureblob-fuse-premium
          mountOptions:
            - -o allow_other
            - --file-cache-timeout-in-seconds=120
          csi:
            driver: blob.csi.azure.com
            readOnly: false
            # volumeid has to be unique for every identical storage blob container in the cluster
            # character `#` is reserved for internal use and cannot be used in volumehandle
            volumeHandle: {자유롭게 정의}
            volumeAttributes:
              containerName: {container명}
            nodeStageSecretRef:
              name: {사용하고자 하는 secret명}
              namespace: {namespace명}
      3. kubectl로 PV 생성 및 확인

        • PV 생성 : k apply -f pv.yaml

        • PV 확인 : k get pv


      4. PersistentVolumeClaim(PVC) 생성

      이 번에는 PVC(Persistent Volume Claim)을 생성해보겠습니다.

      1. pvc.yaml 파일 작성

        • namespace : pvc를 적용할 pod의 namespace 입력 (없으면 PVC를 찾지 못하므로 반드시 입력)

        • accessModes : access 모드 설정

        • storageClassName : 스토리지 유형(SC) 입력

        • requests.storage : PVC가 얼마만큼 사용할지 용량 입력 (PV의 capacity보다 크면 안됨)

        kind: PersistentVolumeClaim
        apiVersion: v1
        metadata:
          name: {pvc명} # pvc naming
          namespace: {pod명} # pod's namespace
        spec:
          accessModes:
            - ReadOnlyMany  # access mode
          storageClassName: azurefile-csi # created by AKS
          resources:
            requests:
              storage: 1Gi
      2. 기본 FileStorage가 아닌 BlobStorage를 PVC로 프로비저닝 하고 싶은 경우

        • storageClassName: azureblob-fuse-premium로 설정 필요

        kind: PersistentVolumeClaim
        apiVersion: v1
        metadata:
          name: {pvc명} # pvc naming
          namespace: {namespace명}
        spec:
          accessModes:
            - ReadWriteMany  # access mode
          storageClassName: azureblob-fuse-premium # created by AKS
          volumeName: {사용하고자 하는 pv명}
          resources:
            requests:
              storage: 10Gi
      3. kubectl로 PVC 생성 및 확인

        • PVC 생성 : k apply -f pvc.yaml

        • PVC 확인 : k get pvc -n {namespace명}


      5. POD에 PVC Mount

      마지막으로 pod에 생성한 PVC를 volume으로 mount하는 방법을 알아보겠습니다.

      1. deployment.yaml에 volume mount 설정 추가

        • volumeMounts : containers 밑에 생성

          • name : 바깥 volumes의 name 중 일치하는 volume을 mount 하겠다는 의미로 volumes의 name과 일치하면 되고 자율적으로 네이밍 가능

          • mountPath : 컨테이너에서 mount 할 경로

        • volumes : containers와 같은 레벨에 생성

          • name : volumeMounts의 name과 일치해야 함

          • persistentVolumeClaim.claimName : pvc name 추가

        ...
          volumeMounts:
          - name: azurefile
            mountPath: {mount할 storage의 file path}
        volumes:
        - name: azurefile
          persistentVolumeCl
            claimName: {pvc명}
        ...


      마치는 글

      이 번 글에서는 파일을 영구적으로 저장할 수 있도록 도와주는 SC/PV/PVC 설정에 대해 알아보았습니다.

      다음에는 k8s에서 로그를 통합적으로 관리 및 모니터링 해주는 여러 기술스택 중 EFK에 대해 공유드리겠습니다.


      지금까지 긴 글을 읽어주셔서 감사합니다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      dragonpipe 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기