개요
본 문서는 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 생성:
- 인증 파일 생성:
echo "admin:$(openssl passwd -stdin -apr1)" <<<'yourpassword' > auth - 시크릿 생성:
kubectl create secret generic basic-auth --from-file=auth -n longhorn-system - 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