자체 구축 K8S 클러스터에서 Alibaba Cloud 분산 스토리지 사용

서론

이 글은 2024.06.14에 작성되었으며, Alibaba Cloud에서 자체 구축한 클러스터에서 Alibaba Cloud 분산 스토리지를 사용하는 방법을 소개합니다. 마지막에 문서 링크를 첨부하였으며, Alibaba Cloud 공식 문서는 중국어로 제공되지만, Alibaba Cloud 스토리지 플러그인 설치는 GitHub에서만 영문 문서로 제공됩니다. 가능하면 원문을 직접 읽어보시길 권장합니다.

스토리지 플러그인 설치

  1. 사용자 정의 권한 정책 생성: https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/master/docs/ram-policies/disk.json
  2. RAM 역할 생성 및 사용자 정의 권한 정책 부여, 임시로 accesskeysecret을 보관
    1. kubectl create secret -n kube-system generic csi-access-key --from-literal=id='{id}' --from-literal=secret='{secret}'
  3. CSI 드라이버 설치, helm chart는 없으며 로컬 설치만 가능(20240613).
    1. git clone https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver.git
    2. cd alibaba-cloud-csi-driver/deploy
    3. Alibaba Cloud ECS에 구축한 자체 클러스터인 경우 바로 다음 명령어 실행, 그렇지 않은 경우: https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/master/docs/install.md 직접 확인
    4. helm upgrade --install alibaba-cloud-csi-driver ./chart --values chart/values-ecs.yaml --namespace kube-system
  4. 확인, watch kubectl get pods -n kube-system -l app=csi-plugin

스토리지 타입 선택 기준

  • ECS 클라우드 디스크 최소 용량은 20GB, IOPS 3000이며, 비교적 큰 용량으로 비용 효율성이 떨어집니다.
    • 클라우드 디스크 동적 스토리지 볼륨
      • 공식 문서:
        • 클라우드 디스크는 가용 영역을 초월해 사용할 수 없으며, 공유되지 않는 스토리지이며 하나의 Pod만 마운트 가능.(실제 테스트 결과 동일 deployment의 여러 Pod에 마운트 가능)
        • 클라우드 디스크 타입과 ECS 타입이 일치해야만 마운트 가능하며, 그렇지 않으면 마운트 실패합니다. 클라우드 디스크 타입과 ECS 타입의 호환성 관계는 인스턴스 사양군을 참조하십시오.
        • 애플리케이션 배포 시 StorageClass를 통해 PV 자동 생성으로 클라우드 디스크 구매 가능. 이미 클라우드 디스크를 구매한 경우 정적 스토리지 볼륨 사용을 권장합니다.
        • 요청하는 클라우드 디스크 크기는 단일 디스크 용량 범위를 초과할 수 없습니다.
        • Pod 재생성 시 원본 클라우드 디스크를 재마운트 합니다. 다른 제한으로 인해 원래 가용 영역에 스케줄링할 수 없는 경우 Pod는 Pending 상태가 됩니다.
        • 동적으로 생성된 클라우드 디스크는 과금 방식이 사용량 기반입니다.
      • 기타 테스트 요약:
        • 클라우드 디스크는 여러 Pod에 마운트 가능하지만, 하나의 Pod만 읽기/쓰기 가능하고 다른 Pod는 읽기/쓰기 불가능합니다. 따라서 PVC의 accessModesReadWriteOnce로만 설정 가능하며, 변경해도 올바른 결과를 얻을 수 없습니다.
        • StorageClass의 reclaimPolicyDelete로 설정된 경우 PVC 삭제 시 클라우드 디스크도 자동 삭제됩니다.
        • StorageClass의 reclaimPolicyRetain으로 설정된 경우 PVC 삭제 시 클라우드 디스크는 자동 삭제되지 않으며, 수동으로 클러스터 및 Alibaba Cloud 콘솔에서 삭제해야 합니다.
      • 적절한 사용 사례를 찾기 어렵습니다.
    • 클라우드 디스크 정적 스토리지 볼륨
      • 공식 문서:
        • 수동으로 PV 및 PVC 생성
        • 클라우드 디스크는 가용 영역을 초월해 사용할 수 없으며, 공유되지 않는 스토리지이며 하나의 Pod만 마운트 가능.
        • 클라우드 디스크 타입과 ECS 타입이 일치해야만 마운트 가능하며, 그렇지 않으면 마운트 실패합니다.
        • 클러스터와 동일한 지역 및 가용 영역에서 마운트 대기 상태인 클라우드 디스크를 선택할 수 있습니다.
  • NAS는 작업 지연 시간이 크며, 최고 성능은 2ms, 깊은 스토리지는 10ms이며, 사용량 기반 과금이며, 객체 스토리지 OSS 대비 읽기/쓰기 성능이 높습니다.
  • OSS 스토리지 볼륨, https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/oss-volume-overview-1?spm=a2c4g.11186623.0.0.43166a351NbtvU
    • OSS는 공유 스토리지로 여러 Pod에 동시에 공유 스토리지 서비스를 제공할 수 있습니다.
    • (20240613) 현재 CentOS, Alibaba Cloud Linux, ContainerOS 및 Longxin 운영체제를 지원합니다.
    • 데이터 볼륨 사용 시 각 애플리케이션은 독립적인 PV 이름을 사용합니다.
    • OSS 데이터 볼륨은 ossfs 파일을 통해 마운트되는 FUSE 파일 시스템입니다.
      • 구성 파일, 비디오, 이미지 파일 등 파일 읽기 시나리오에 적합합니다.
      • 파일 쓰기 애플리케이션 시나리오에는 적합하지 않습니다. 파일 쓰기가 필요하면 SDK를 통한 쓰기 작업 구현이나 NAS 스토리지 볼륨 서비스 사용을 권장합니다.
    • ossfs는 구성 매개변수를 조정하여 캐시, 권한 등에서 성능을 최적화할 수 있습니다.
    • ossfs 사용 제한
      • 임의 쓰기 또는 파일 추가 작업 시 모든 파일이 재작성됩니다.
      • 원격으로 OSS 서버에 접근해야 하므로 list directory 등의 메타데이터 작업 성능이 낮습니다.
      • 파일, 폴더의 rename 작업이 원자적이지 않습니다.
      • 여러 클라이언트가 동일한 OSS Bucket에 마운트될 때는 사용자가 각 클라이언트의 동작을 직접 조정해야 하며, 예를 들어 여러 클라이언트가 동일 파일에 쓰기 작업을 수행하지 않도록 해야 합니다.
      • 하드 링크(Hard Link)는 지원하지 않습니다.
      • CSI plugin 버전이 v1.20.7 미만인 경우 로컬 변경만 감지하고 다른 클라이언트나 도구의 외부 변경은 감지하지 못합니다.
      • 시스템 부하 증가를 방지하기 위해 고병렬 읽기/쓰기 시나리오에서는 사용하지 마십시오.
  • 혼합 클러스터(일부 노드가 Alibaba Cloud에 속하지 않는 경우)인 경우 NAS와 OSS 정적 볼륨만 사용 가능.
  • 클라우드 디스크, NAS, OSS 모두 지역 제한이 있습니다.

요약하면, 클라우드 디스크는 전체 디스크 형태로 요청 및 마운트되며 공유가 어렵습니다. OSS는 파일 단위로 작업하며 고병렬 읽기/쓰기 시 성능 문제가 있으며 지원 시스템이 제한됩니다.

  • 클라우드 디스크는 대용량과 고성능이 필요한 데이터베이스 등 시나리오에 적합
  • 성능 요구가 높지 않은 다른 모든 시나리오는 NAS를 선택할 수 있습니다.
  • OSS는 Alibaba Cloud 클러스터의 고병렬 쓰기 시나리오에는 적합하지 않으며 병렬 읽기 시나리오에 적용 가능합니다.

Alibaba Cloud 공식 문서는 위치가 일관되지 않고 서로 모순되는 경우가 있으니 독자는 문서 날짜를 기반으로 직접 판단해야 합니다. 지원하지 않는다고 명시된 기능이 버전 업데이트로 이미 지원될 수 있으니 직접 시도해 보는 것이 필요합니다.

작업 절차

이것은 Alibaba Cloud 공식 가이드 문서이며, 위 안내에 따라 Alibaba Cloud 스토리지 플러그인 설치 후 NAS 정적 스토리지 볼륨 사용에 따라 배포 및 테스트를 진행할 수 있습니다.

주의: k3s 사용자는 local-path-storage 문제를 겪을 수 있으며, 오류 메시지 예시는 다음과 같습니다.

  • failed to provision volume with StorageClass “local-path”: claim.Spec.Selector is not supported
  • Waiting for a volume to be created either by the external provisioner ’localplugin.csi.alibabacloud.com’ or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.

persistentVolumeClaimstorageClassName을 빈값으로 설정하여 k3s 기본 local-path-storage 사용을 피해야 합니다.

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc-nas
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 2Gi
  selector:
    matchLabels:
      alicloud-pvname: pv-nas
  storageClassName: ""

참고