[Home-K8S] #22 FluxCD 계층과 분리 / 다중 클러스터 리소스 공유와 설정 분리
FluxCD - yaml 앞서 fluxcd 를 이용해서 helm chart 를 구성했습니다. 그 외에 일반적인 yaml
기존에는 local-host-provisioner 를 기본 storage class 로 사용했었습니다.
이제 좀 Reliable 한 스토리지를 사용하고 싶어서 Talos Linux 로 Rook-ceph와 longhorn 중에 고민했는데, Rook-ceph 는 파일 시스템과 파티션 모두 없는 raw disk 가 필요하더라고요.
그래서 longhorn 으로 결정했습니다.
longhorn에도 extension이 필요합니다. 필요한 확장은 2개 이지만, longhorn-rwx 가 nfs를 사용한다고 해서 같이 넣어 줬습니다. 확장 설치 방법은 아래 글을 참조하면 됩니다.
https://dogring.kr/ghost/#/editor/post/687bd76c35feaa0001385926
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 로 설정이 됩니다.

헬름 레포지토리를 연결해주고, values.yaml 을 가져옵니다.
helm repo add longhorn https://charts.longhorn.io
helm repo update
helm show values longhorn/longhorn > values.yamlvalues 에 원하는 설정들을 적용해 줍니다.
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 으로는 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>helm에서 설치할 때 설정할 수도 있고, ui에 접속해서 설정할 수도 있습니다.
defaultBackupStore:
backupTarget: azblob://<blob storage name>@core.windows.net/<path>/
backupTargetCredentialSecret: longhorn-azblob-secret
# backupTarget 의 마지막엔 '/' 를 반드시 추가해줘야 합니다. 다시 helm 으로 구성하면 됩니다.


이제 Volume 에서 스냅샷을 만들고 백업을 할 수 있습니다.
ui 를 사용하는 이유를 알겠어요. pvc 는 yaml 로 만들고 ui 는 잘 사용하지는 않지만 가끔 사용해야 할 때 편하네요.
스냅샷을 만들고 백업을 하고 하는 것도 편하고, 제대로 된 sc 도 사용하고 편했습니다.
Comments