July 27, 2025

[Home-K8S] #12 longhorn 설치 (w.Talos Linux)

[Home-K8S] #12 longhorn 설치 (w.Talos Linux)

기존에는 local-host-provisioner 를 기본 storage class 로 사용했었습니다.
이제 좀 Reliable 한 스토리지를 사용하고 싶어서 Talos Linux 로 Rook-ceph와 longhorn 중에 고민했는데, Rook-ceph 는 파일 시스템과 파티션 모두 없는 raw disk 가 필요하더라고요.

그래서 longhorn 으로 결정했습니다.

Talos 설정

longhorn에도 extension이 필요합니다. 필요한 확장은 2개 이지만, longhorn-rwx 가 nfs를 사용한다고 해서 같이 넣어 줬습니다. 확장 설치 방법은 아래 글을 참조하면 됩니다.
https://dogring.kr/ghost/#/editor/post/687bd76c35feaa0001385926

  • iscsi-tools
  • util-linux-tools
  • nfsd # nfs 사용 용도

PodSecurity 도 꺼달라니까 longhorn 을 구성할 namespace 의 PodSecurity 를 예외해줍니다.

cluster:
  apiServer:
    admissionControl:
      - name: PodSecurity
          exemptions:
            namespaces:
              - kube-system
              - longhorn        # 여기에 추가해 줍니다. 
              # 아니면 namespace를 생성할 때 설정해 줄 수 있습니다. 

이제 longhorn 이 사용할 경로도 설정해 줘야 합니다.
여기서 그냥 설치해도 OS 디스크를 공유해서 사용할 수 있습니다.
저는 파티션을 나눠서 따로 longhorn 경로를 지정해 줬습니다.

   # ... talos config ...
---
apiVersion: v1alpha1
kind: VolumeConfig
name: EPHEMERAL
provisioning:
    diskSelector:
        match: disk.transport == 'nvme'
    maxSize: 200GB              # OS disk 는 200GB 만
---
apiVersion: v1alpha1
kind: UserVolumeConfig
name: data-disk
provisioning:
    diskSelector:
        match: disk.transport == 'nvme'
    minSize: 200GiB
    grow: true                  # 부팅 시 전부 provisioning
filesystem:
    type: xfs

이렇게 설정하면 기본적으로 /var/mnt/data-disk 로 설정이 됩니다.

💡
extraMounts 로 경로를 설정해줘도 의미가 없습니다.
extraMounts 의 경우 kubelet 안(별도의 namespace)에 경로를 매핑시키는 것입니다.
longhorn 은 노드의 경로를 사용합니다.

Longhorn 설치 (Helm)

헬름 레포지토리를 연결해주고, values.yaml 을 가져옵니다.

helm repo add longhorn https://charts.longhorn.io
helm repo update

helm show values longhorn/longhorn > values.yaml

values 에 원하는 설정들을 적용해 줍니다.

service:
  ui:
    type: LoadBalancer
    loadBalancerIP: 192.168.0.240
persistence:
  defaultClassReplicaCount: 1
  defaultDataPath: /var/mnt/data-disk/

ui 를 LB 로 서비스하고, Talos 에서 설정한 경로를 넣어줬습니다.
기본적으로 Replica 가 3개로 되어 있는데, 용량이 적은 homelab 으로써 기본은 1개로 설정해 줬습니다.
필요한 서비스만 복제본 적용할 예정입니다.

master node 에도 적용하기 위해서 toleration 을 적용해 줍니다.

global:
  tolerations:
    - key: "node-role.kubernetes.io/control-plane"
      operator: "Exists"
      effect: "NoSchedule"
longhornManager:
  tolerations: 
    - key: "node-role.kubernetes.io/control-plane"
      operator: "Exists"
      effect: "NoSchedule"
longhornDriver:
  tolerations: 
    - key: "node-role.kubernetes.io/control-plane"
      operator: "Exists"
      effect: "NoSchedule"

helm 으로 설치해 줍시다.

helm upgrade --install longhorn longhorn/longhorn --namespace longhorn-system --create-namespace -f values.yaml

레플리카, 공유 스토리지 설정

위에서 설정한 longhorn 의 default SC(storage class) 는 단일 스토리지를 사용합니다.
이제 레플리카를 사용하는 SC 와 공유할 수 있는 SC(rwx) 를 사용할 수 있게 설정을 해줍니다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: longhorn-rc2               # 레플리카가 있는 스토리지
provisioner: driver.longhorn.io
parameters:
  numberOfReplicas: "2"            # 레플리카 갯수
reclaimPolicy: Delete
volumeBindingMode: Immediate
---
apiVersion: storage.k8s.io/v1
kind: StorageClass 
metadata:
  name: longhorn-rwx               # 공유 스토리지
provisioner: driver.longhorn.io
parameters:
  numberOfReplicas: "2"
  fsType: "ext4"
  migratable: "false"
  nfsOptions: "vers=4.1,softerr,timeo=600,retrans=5"
allowVolumeExpansion: true
volumeBindingMode: Immediate

이제 스토리지를 필요에 따라 선택해서 사용할 수 있습니다.

longhorn backup (Azure)

longhorn 으로는 volume 의 스냅샷을 찍을 수도 있고, 그 스냅샷을 백업할 수도 있습니다.

backup 은 s3 api 를 사용하는 Object Storage 가 필요한데, 저는 Azure 의 blob storage 를 사용하도록 하겠습니다.

Azure 에 접속할 수 있는 키를 포함한 Secret 을 생성합니다.

apiVersion: v1
kind: Secret
metadata:
  name: longhorn-azblob-secret
  namespace: longhorn-system
type: Opaque
stringData:
  AZBLOB_ACCOUNT_NAME: <storage account name>
  AZBLOB_ACCOUNT_KEY: <Azure Storage Key>

backup 설정 (helm)

helm에서 설치할 때 설정할 수도 있고, ui에 접속해서 설정할 수도 있습니다.

defaultBackupStore:
  backupTarget: azblob://<blob storage name>@core.windows.net/<path>/
  backupTargetCredentialSecret: longhorn-azblob-secret
# backupTarget 의 마지막엔 '/' 를 반드시 추가해줘야 합니다. 

다시 helm 으로 구성하면 됩니다.

backup 설정 (ui)

  1. 설정 -> backup target 으로 들어갑니다.
  1. default 를 edit 하거나 Create 해서 위의 설정을 넣어줍니다.

이제 Volume 에서 스냅샷을 만들고 백업을 할 수 있습니다.

마무리

ui 를 사용하는 이유를 알겠어요. pvc 는 yaml 로 만들고 ui 는 잘 사용하지는 않지만 가끔 사용해야 할 때 편하네요.

스냅샷을 만들고 백업을 하고 하는 것도 편하고, 제대로 된 sc 도 사용하고 편했습니다.

Comments