Longhorn 기반 클라우드 네이티브 컨테이너 스토리지 솔루션 설치 및 구성

개요

본 문서는 Longhorn v1.1.2 기준으로 Kubernetes 환경에 분산 블록 스토리지를 구축하기 위한 설치, 접근 제어, 업그레이드 및 제거 절차를 설명합니다. 공식 매뉴얼을 기반으로 하되, 실무 중심의 재구성과 코드 최적화를 반영했습니다.

시스템 요구 사항

Kubernetes 클러스터 내 모든 워커 노드는 다음 조건을 충족해야 합니다:

  • 컨테이너 런타임: Docker 1.13+ 또는 containerd 1.3.7+
  • Kubernetes 버전: v1.16 이상 (v1.17+ 권장)
  • iscsiadm 클라이언트 및 iscsid 데몬 활성화
  • NFSv4 클라이언트 설치 (RWX 볼륨 지원 시 필요)
  • 파일 시스템: ext4 또는 XFS (file extents 기능 필요)
  • 필수 바이너리: curl, findmnt, grep, awk, blkid, lsblk
  • 마운트 전파(Mount propagation) 활성화

특정 플랫폼 설정

GKE, K3s, RKE(CoreOS) 등은 추가 설정이 필요합니다. 예를 들어 GKE에서는 Ubuntu 게스트 이미지를 선택하는 것이 좋으며, open-iscsi가 기본 포함되어 있습니다.

사전 준비 체크스크립트 실행

환경 점검 자동화 스크립트를 사용해 필수 조건을 확인할 수 있습니다:

curl -sSfL https://raw.githubusercontent.com/longhorn/longhorn/v1.1.2/scripts/environment_check.sh | bash

스크립트 출력에서 MountPropagation 활성화 여부 등을 확인하세요.

필수 컴포넌트 설치

iSCSI 클라이언트 배포

노드별로 iscsi-initiator-utils 설치가 필요합니다. OS별 명령어:

  • Ubuntu/Debian: apt-get install open-iscsi
  • RHEL/CentOS/Amazon Linux: yum install iscsi-initiator-utils
  • SUSE/openSUSE: zypper install open-iscsi

또는 쿠버네티스 디먼셋을 통한 자동 배포:

kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.1.2/deploy/prerequisite/longhorn-iscsi-installation.yaml

설치 상태 확인:

kubectl get pods -l name=longhorn-iscsi-installation -n longhorn-system

NFS 클라이언트 배포

RWX 볼륨 사용 시 각 노드에 NFS 클라이언트 필요:

  • Ubuntu/Debian: apt-get install nfs-common
  • RHEL 계열: yum install nfs-utils

자동 설치 디먼셋:

kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.1.2/deploy/prerequisite/longhorn-nfs-installation.yaml

설치 방법

kubectl을 통한 배포

가장 간단한 방식으로, 전체 컴포넌트를 YAML로 적용:

kubectl create namespace longhorn-system
kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.1.2/deploy/longhorn.yaml

배포 상태 모니터링:

kubectl get pods -n longhorn-system -w

Helm을 통한 설치

Helm 3 기준 설치 절차:

helm repo add longhorn https://charts.longhorn.io
helm repo update
kubectl create namespace longhorn-system
helm install longhorn longhorn/longhorn --namespace longhorn-system

Rancher Catalog 앱으로 설치

Rancher UI에서 Catalog Apps → Longhorn 선택 후 설치. 장점은 UI 접근 시 Rancher 인증이 자동 적용됩니다. 업그레이드 알림도 UI에서 직접 제공됩니다.

UI 접근 설정

기본적으로 Longhorn UI는 ClusterIP 서비스로만 제공되며 외부 접근을 위해선 Ingress 설정이 필요합니다.

기본 인증 기반 Ingress 구성

nginx-ingress-controller 기준, HTTP 기본 인증을 적용한 Ingress 생성:

  1. 인증 파일 생성:
    echo "admin:$(openssl passwd -stdin -apr1)" <<<'yourpassword' > auth
  2. 시크릿 생성:
    kubectl create secret generic basic-auth --from-file=auth -n longhorn-system
  3. Ingress 리소스 배포:
    <apiVersion> networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: longhorn-ingress
      namespace: longhorn-system
      annotations:
        nginx.ingress.kubernetes.io/auth-type: basic
        nginx.ingress.kubernetes.io/auth-secret: basic-auth
        nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
        nginx.ingress.kubernetes.io/ssl-redirect: 'false'
    spec:
      rules:
      - http:
          paths:
          - path: "/"
            pathType: Prefix
            backend:
              service:
                name: longhorn-frontend
                port:
                  number: 80

업그레이드 절차

매니저 컴포넌트 업그레이드

kubectl 기반 업그레이드:

kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.1.2/deploy/longhorn.yaml

Helm 기반:

helm upgrade longhorn longhorn/longhorn --namespace longhorn-system

엔진 자동 업그레이드 설정

v1.1.1부터는 엔진 자동 업그레이드 기능 제공. 설정 항목 concurrent-automatic-engine-upgrade-per-node-limit 값을 1 이상으로 설정하면:

  • 연결된 볼륨: 실시간 업그레이드
  • 분리된 볼륨: 오프라인 업그레이드
  • 재해복구(DR) 볼륨: 수동 업그레이드 권장 (전체 복구 유발 가능)

문제 해결

업그레이드 중 provisioner: Forbidden: updates to provisioner are forbidden 오류 발생 시 기존 StorageClass 삭제 후 재시도:

kubectl delete -f https://raw.githubusercontent.com/longhorn/longhorn/v1.1.2/examples/storageclass.yaml

Longhorn 제거

Helm 사용 시

helm uninstall longhorn -n longhorn-system

kubectl 사용 시

CRD 정리 작업 먼저 수행:

kubectl create -f https://raw.githubusercontent.com/longhorn/longhorn/v1.1.2/uninstall/uninstall.yaml
kubectl get job/longhorn-uninstall -w

완료 후 나머지 리소스 제거:

kubectl delete -f https://raw.githubusercontent.com/longhorn/longhorn/v1.1.2/deploy/longhorn.yaml
kubectl delete -f https://raw.githubusercontent.com/longhorn/longhorn/v1.1.2/uninstall/uninstall.yaml

남은 CRD 강제 정리

일부 리소스가 남아 있을 경우 아래 스크립트로 정리:

for crd in $(kubectl get crd | grep longhorn.rancher.io | awk '{print $1}'); do
  kubectl patch crd/$crd -p '{"metadata":{"finalizers":[]}}' --type=merge
  kubectl delete crd $crd
done

태그: Longhorn kubernetes 분산스토리지 CSI helm

6월 9일 01:42에 게시됨