Longhorn 은 노드에 붙은 로컬 디스크를 모아 쿠버네티스용 블록 스토리지로 제공하는 CSI 드라이버다. SAN 이나 별도 스토리지 장비 없이 PersistentVolume 을 쓰고 싶을 때 고르는 선택지이고, Rancher 계열 배포판과 함께 쓰이는 일이 많다. CNCF 프로젝트다.
| 구성 요소 | 역할 |
|---|---|
| Longhorn Manager | 노드마다 하나씩 돌며 볼륨 생성 · 복제 · attach 를 제어하고 CSI 로 쿠버네티스와 통신한다 |
| Longhorn Engine | 볼륨 하나당 하나씩 뜨는 프로세스. 실제 읽기 · 쓰기를 처리하고 복제본에 동기 기록한다 |
| Replica | 데이터를 담는 복제본. 서로 다른 노드에 분산 배치된다 |
| UI | 볼륨 상태와 스냅샷 · 백업을 다루는 웹 화면 |
쓰기는 엔진이 모든 복제본에 동시에 보내고 전부 성공해야 완료된다. 따라서 복제본이 있는 노드 사이의 네트워크 지연과 대역폭이 그대로 성능에 반영된다.
open-iscsi 와 iscsid 가 설치돼 동작해야 한다. Longhorn 은 iSCSI 로 볼륨을 노드에 붙인다.nfs-utils 계열 패키지가 필요하다. RWX 볼륨은 내부적으로 NFS 공유를 쓴다./var/lib/longhorn 이고, 별도 디스크를 마운트해 지정하는 편이 낫다.apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mydata
namespace: app
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 10Gi
복제본 수나 디스크 선택 같은 값은 StorageClass 파라미터로 준다.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: longhorn-r2
provisioner: driver.longhorn.io
allowVolumeExpansion: true
parameters:
numberOfReplicas: "2"
staleReplicaTimeout: "30"
fsType: "ext4"
Longhorn 볼륨은 두 가지 값으로 상태를 표현한다. 둘을 함께 봐야 한다.
| 값 | 의미 |
|---|---|
State |
detached · attached — 지금 어느 노드에 붙어 있는가 |
Robustness |
healthy · degraded · faulted — 복제본이 성한가 |
kubectl get volumes.longhorn.io -n longhorn-system
kubectl get replicas.longhorn.io -n longhorn-system
degraded 는 복제본 일부가 빠진 상태다. 데이터는 읽고 쓸 수 있고, 여유 노드가 있으면 Longhorn 이 스스로 복제본을 다시 만든다. faulted 는 성한 복제본이 하나도 없다는 뜻이고, 이 상태에서는 attach 요청이 거부되어 파드 쪽에 다음이 찍힌다.
rpc error: code = Aborted desc = Volume pvc-xxxx is not ready for workloads
이때 쿠버네티스의 PVC 는 여전히 Bound 로 보인다. PVC 상태만 보고 정상이라고 판단하면 안 된다.
kubectl get nodes.longhorn.io -n longhorn-system -o wide
df -h /var/lib/longhorn
스냅샷은 같은 디스크 안의 시점 기록이라 디스크가 죽으면 함께 사라진다. 백업은 S3 나 NFS 같은 외부 대상에 올리는 것이고, 재해 복구는 백업으로만 가능하다. 둘을 혼동하지 않는다.
백업 대상은 Longhorn 설정의 Backup Target 에 등록한다. S3 호환 저장소를 쓰면 자격증명을 Secret 으로 만들어 지정한다. 등록 후 볼륨마다 되풀이 백업 일정을 걸 수 있다.
kubectl drain 으로 워크로드를 비우고, Longhorn 쪽에서도 복제본 재배치가 끝났는지 확인한다. 바로 내리면 degraded 가 된다./var/lib/longhorn 아래의 마운트가 남아 있으면 디렉터리가 지워지지 않는다. 마운트를 먼저 푼다.