[k8s] Longhorn
Longhorn์ ์ฟ ๋ฒ๋คํฐ์ค์ฉ ๋ถ์ฐ "๋ธ๋ก" ์คํ ๋ฆฌ์ง ์์คํ
์ด๋ค.
์คํ์์ค์ด๊ณ , ๋ธ๋ก ์คํ ๋ฆฌ์ง๋ฅผ ์ง์ํ๋ค.
์ด๊ฑธ ์ ๊น๋ฉด ๋ณผ๋ฅจ์ ๋ถ์ฐ ๊ตฌ์ฑ์ผ๋ก ๊ณ ๊ฐ์ฉ์ฑ-๊ณ ์ฑ๋ฅ์ ๋ณด์ฅํ๋ฉด์ ์ฌ์ฉํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋ธ๋ก ์คํ ๋ฆฌ์ง๋ค์ ๋นํด์ ์ฌ์ฉ์ด๋ ๊ตฌ์ฑ์ด ๊ฐํธํ ํธ์ด๋ค.
๊ธฐ๋ณธ ๊ตฌ์กฐ
๊ตฌ์กฐ๋ ๊ฝค ๊ฐ๋จํ ํธ์ ์ํ๋ค.
๋กฑํผ ํด๋ฌ์คํฐ์ ๋
ธ๋๋ง๋ค Manager๋ผ๋ ๊ฒ์ ๋์ฐ๋๋ฐ, ์ด Manager๊ฐ ์ต์ข
์คํ ๋ฆฌ์ง๋ฅผ ๊ด๋ฆฌํ๊ณ , ๋ณผ๋ฅจ ์์ฑ ์์ฒญ ๋ฑ์ ๋ฐ์์ ์ฒ๋ฆฌํ๋ ์ฃผ์ ์์
์ ๋ค ๋ด๋นํ๋ค.
https://longhorn.io/docs/1.12.1/concepts/
๊ทธ ์ธ์๋ ๊ทธ๋ค์ง ๋ณต์กํ ๊ฒ์ ์๋ค.
๋กฑํผ์ ๋ณผ๋ฅจ์ ์์ฑํ๊ณ ํ์ผ์ ์ฐ๋ฉด, ๋์ผํ ๋ณต์ ๋ณธ์ ์ฌ๋ฌ๊ฐ ์์ฑํด์ ์์ค์ ๋ฐฉ์งํ๋ค.
์ด๊ฑด v1/v2๋ง๋ค ๋์ ๋ฐฉ์์ด ํ์ดํ๊ฒ ๋ค๋ฅธ๋ฐ, v1์ ๊ทธ๋ฅ ๊ทธ ๋ธ๋ก์ ํต์งธ๋ก ๋ณต์ ํ์ง๋ง, v2๋ ์ฒญํฌ ๋จ์๋ก ์ชผ๊ฐ์ ๋ถํ ์ ์ฅํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
v2๋ ์ด ๊ธ์ ์ฐ๋ ์์ ์์๋ ์์ง ์คํ ๋จ๊ณ๋ค. ๊ทธ๋์ ์ฌ๊ธฐ์๋ v1์ ๊ธฐ์ค์ผ๋ก ๋ค๋ฃฌ๋ค.
ํ์ฌ ๋กฑํผ์์ ์ ๊ณตํ๋ ์ฃผ์ ๊ธฐ๋ฅ ์์๋ ๋๋ต ์ด ์ ๋๋ค.
- ํธ๋ฆฌํ UI ๊ธฐ๋ฐ ์ ์ด ๊ธฐ๋ฅ
- ๊ณ ๊ฐ์ฉ์ฑ ์ต์
- ์๋ ์ฆ๋ถํ ์ค๋ ์ท (S3 ๋ฑ)
- ๋ฐฑ์ ๊ธฐ๋ฅ
ํนํ ์ค๋ ์ท ๊ธฐ๋ฅ์ ์ฃผ์ํ ๊ฐ์ ์ ๋ด์ธ์ฐ๋ ํธ์ด๋ค. ๋ณ๋ ๊ณต๊ฐ์ ์ค๋ ์ท์ ์ ์ฅํด๋จ๋ค๊ฐ, ์ํ๋ ์์ ์ ์ค๋ ์ท์ผ๋ก ๋ณผ๋ฅจ์ ๋กค๋ฐฑํ ์ ์๋ค.
vs Ceph
๊ตฌ์ฑ์ด๋ ๊ด๋ฆฌ๊ฐ ๊ฐํธํ๋ค๋ ๊ฒ์ด ๊ฐ์ฅ ํฐ ์ฅ์ ์ด์ง๋ง, ๊ณ ์ ์ธ ceph์ ๋นํ๋ฉด ๊ธฐ๋ฅ ๋ฒ์๊ฐ ์ข์ ํธ์ด๋ค.
IOPS ์ ํ์ด๋ผ๋ ๊ฐ ํ๋ ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค, ์ธ๋ถ์ ์ธ ์ต์
๋ค, ๋ค๋
๊ฐ ์ถ์ ๋ ๊ด๋ฆฌ ๊ฒฝํ๋ค์ด ํ์ํ๋ค๋ฉด ceph๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ข๋ค.
ํ์ง๋ง ๋์คํฌ๋ฅผ ๊ทธ๋ ๊ฒ ๋นก์ธ๊ฒ ๊ตด๋ฆด ๊ฒ์ด ์๋๊ณ , ํด๋ฌ์คํฐ ๊ท๋ชจ๊ฐ ๋ง ์์ฒญ ํฌ์ง ์๋ค๊ณ ํ๋ฉด longhorn ์ ๋๋ก๋ ์ถฉ๋ถํ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ ์ ์์ ๊ฒ์ด๋ค. ๋ฑ ๊ฐ๋ณ๊ฒ ์ ๋นํ ๋ณต๊ตฌ๋๋ ๋ณผ๋ฅจ ๋งค๋์ ์ฐ๋ ๋๋์ผ๋ก๋ ์ถฉ๋ถํ๋ค.
๋ง์ด ๊ธธ์๋ค.
์, ๊ทธ๋ผ ์ด์ ์ค์นํด์ ์ฌ์ฉ๊น์ง ํ๋ฒ ํด๋ณด์.
๋ ธ๋์ ๋ผ๋ฒจ ๋ฌ๊ธฐ
์ฐ์ longhorn์ ์คํ์ํฌ ๋ ธ๋๋ฅผ 3๊ฐ ์ด์ ์ ๋ณํด์ ๋ผ๋ฒจ์ ๋จ๋ค.
kubectl label node ๋
ธ๋1 ๋
ธ๋2 ๋
ธ๋3 \
node.longhorn.io/create-default-disk=true \
storage.myyrakle.io/longhorn=true
๊ทธ๋ผ ์ถํ ์ค์นํ ๋ ์ฌ๊ธฐ์ longhorn ์๋ฒ๋ฅผ ๋์ฐ๊ฒ ๋ ๊ฒ์ด๋ค.
์ฌ์ ์ข ์์ฑ (๋ ธ๋ ํธ์คํธ)
iscsid๋ ๊ฒ์ ํฌํจํด ์ด๋ฐ์ ๋ฐ ๋๊ตฌ๋ค์ ํ์๋ก ํ๋ค. longhorn์ด ์คํ๋๋ ๋ชจ๋ ๋ ธ๋๋ง๋ค ์ง์ ๋ค์ด๊ฐ์ ํธ์คํธ์ ์ค์นํด์ค์ผ ํ๋ค.
# ํจํค์ง (๋ฒ์ ๋ฌด๊ด)
sudo apt-get update
sudo apt-get install -y open-iscsi nfs-common jq cryptsetup dmsetup
sudo systemctl enable --now iscsid
systemctl is-active iscsid

๊ทธ๋ฆฌ๊ณ ์ปค๋ ๋ชจ๋๋ ๋ก๋ํด์ค๋ค.
sudo modprobe nfs
sudo modprobe dm_crypt
echo -e "nfs\ndm_crypt" | sudo tee /etc/modules-load.d/longhorn.conf
์ฌ๊ธฐ๊น์ง ๋๋ค๋ฉด, ๊ทธ ๋ค์๋ถํฐ๋ ํด๋ฌ์คํฐ ๋ ๋ฒจ์์ ์ค์ ์ด ๊ฐ๋ฅํ๋ค.
์ ์ฉ CLI ์ค์น & ๊ฒ์ฆ (optional)
์ด๋ฐ์ ๋ฐ ํธ์์ฑ ๊ธฐ๋ฅ์ ์ ์ฉ CLI๋ก ์ ๊ณตํ๋ค.
์ค์น ์ ์ต์ข
๊ฒ์๋ ์ก๋คํ ์ ํธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์ฌ๊ธฐ์๋ ์ค์น ์ ์ ์๊ฑด์ด ๋ค ๊ฐ์ถฐ์ก๋์ง ๊ฒ์ฌํ๋ ์ฉ๋๋ก๋ง ์ฐ๊ฒ ๋ค.
๋ฏฟ์์ด ์ถฉ๋ถํ๋ค๋ฉด ์คํตํด๋ ๋๋ค.
curl -sSfL -o longhornctl https://github.com/longhorn/cli/releases/download/v1.12.1/longhornctl-linux-amd64
chmod +x longhornctl
sudo mv longhornctl /usr/local/bin/
KUBECONFIG ํ์ผ์ ๋๊ฒจ์ preflight๋ฅผ ํ๋ฒ ๋ ๋ฆฌ๋ฉด
sudo longhornctl check preflight --kubeconfig /etc/rancher/k3s/k3s.yaml


ํด๋ฌ์คํฐ์ ์์๋ ๋ชจ๋ ๋
ธ๋๋ค์ ๋ํด์ ๊ฒ์ฌ๋ฅผ ๋๋ ค์ค๋ค.
์๋ฌ๋ง ์์ผ๋ฉด ๋๋ค. ์๋๋ ์ข ๋ค์ด์ฃผ๋ฉด ์ข๊ณ .
์ค์น (with helm)
๊ฐ์ฅ ํธ๋ฆฌํ ์ค์น ๋ฐฉ๋ฒ์ helm์ ์ฐ๋ ๊ฒ์ด๋ค.
์ฐจํธ ๊ฐ์ ธ์์ ์
๋ฐ์ดํธํ๊ณ
helm repo add longhorn https://charts.longhorn.io
helm repo update

values๋ฅผ ์ ์ ํ ์ค๋นํ๋ค. ๋ด ๊ฒฝ์ฐ์๋ ์ด๋ ๊ฒ ๊ตฌ์ฑํ๋ค.
defaultSettings:
# ๊ธฐ๋ณธ ๋ณต์ ์ = 2 (3 ๋
ธ๋ ์ค 2๊ฐ์ ์ ์ฅ)
defaultReplicaCount: 2
# ๋ผ๋ฒจ ๋ถ์ ๋
ธ๋์๋ง default disk ์๋ ์์ฑ (storage.myyrakle.io/longhorn=true)
createDefaultDiskLabeledNodes: true
# Degraded ๋ณผ๋ฅจ ์๋ ์ฌ๊ตฌ์ถ โ ๋
ธ๋ ๋ณต๊ท ์ ์๋ sync
replicaAutoBalance: least-effort
# ๋
ธ๋ ๋ค์ด ์ ๋ณต์ ๋ณธ ์ฌ๊ตฌ์ถ ์ง์ฐ (5๋ถ) โ ์ฌ๋ถํ
์ ์ปค๋ฒ
replicaReplenishmentWaitInterval: 300
# ๋์คํฌ ๊ฐ๋์ฐธ ๋ฐฉ์ง (25% ์์ฝ)
storageReservedPercentageForDefaultDisk: 25
# V2 Data Engine (SPDK) ๋นํ์ฑํ
v2DataEngine: false
# Guaranteed engine CPU โ ๋ณต์ ์ฑ๋ฅ ์์ ํ
guaranteedInstanceManagerCPU: 12
# Longhorn ์ปดํฌ๋ํธ๋ค์ ์คํ ๋ฆฌ์ง ๋
ธ๋์๋ง ๋ฐฐ์น (macmini ์ ์ธ)
longhornManager:
nodeSelector:
storage.myyrakle.io/longhorn: "true"
longhornDriver:
nodeSelector:
storage.myyrakle.io/longhorn: "true"
longhornUI:
replicas: 2
nodeSelector:
storage.myyrakle.io/longhorn: "true"
# CSI ์ปดํฌ๋ํธ
csi:
kubeletRootDir: /var/lib/kubelet
attacherReplicaCount: 2
provisionerReplicaCount: 2
resizerReplicaCount: 2
snapshotterReplicaCount: 2
# UI Ingress ๋นํ์ฑ (cloudflared ๋ก ๋
ธ์ถ ์์ )
ingress:
enabled: false
# StorageClass
persistence:
# default SC ์๋ โ ๊ธฐ์กด local-path ์ ์ถฉ๋ ๋ฐฉ์ง, Longhorn ์ธ ๋ ๋ช
์
defaultClass: false
defaultClassReplicaCount: 2
# PVC ์ญ์ ๋ผ๋ PV ์ ์ง (์ค์๋ก ๋ฐ์ดํฐ ๋ ์๊ฐ๋ ๊ฑฐ ๋ฐฉ์ง)
reclaimPolicy: Retain
๊ทธ๋ฆฌ๊ณ ์ค์น๋ฅผ ๋ ๋ฆฐ๋ค.
helm install longhorn longhorn/longhorn \
--namespace longhorn-system \
--create-namespace \
--version 1.12.1 \
-f /Users/myyrakle/orca/k8s/longhorn/values.yaml

์๋ฃ์๋ ์๊ฐ์ด ์ฝ๊ฐ ๊ฑธ๋ฆฐ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ pod๊ฐ ์ค๋ฅ ์์ด ์คํ๋๋ฉด ์ธํ
์ ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฉด ์ฌ๊ธฐ์ frontend๋ฅผ ํตํด์ ๊ด๋ฆฌ ํ์ด์ง์ ์ ์ํ ์ ์๋ค.
ํฌํธํฌ์๋ฉ์ ํ๋ ํฐ๋์ ์ด๋ ํด์ ์ ์ ํ ๋ด๋ถ๋ง์์ ๋ค์ด๊ฐ๊ฒ ํ๋ค.
๊ด๋ฆฌ์ฉ UI ์ฌ์ฉํ๊ธฐ
์๊ธฐํ longhorn-frontend๋ก ๋ค์ด๊ฐ๋ฉด, ๋ก๊ทธ์ธ ์์ด ๋์๋ณด๋์ ์ง์ ํ ์ ์๋ค.
์ฌ๊ธฐ์ ์ ๋ฐ์ ์ธ ์ํ๋ ์ ์ฅ๊ณต๊ฐ ๋ฑ์ ๋น ๋ฅด๊ฒ ๋ณผ ์๋ ์๊ณ
๋
ธ๋ ๋ชฉ๋ก์ด๋ ๋
ธ๋ ์ค์ ๋ฑ์ ์์ ํ ์๋ ์๋ค.
์, ์ผ๋จ ๋ ธ๋๋ณ๋ก ๋์คํฌ๋ฅผ ์ผ๋ง๋ ์ธ๊ฑด์ง๋ถํฐ ๋ช ํํ๊ฒ ์ง์ ํด์ค์ผ ํ๋ค.
์ค๋ฅธ์ชฝ์ ๋
ธ๋์ ๋์คํฌ ์์ ๋ฒํผ์ด ์๋๋ฐ
์ฌ๊ธฐ์ ์ด๋ฐ๊ฑธ ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.
์ฝ๊ฐ ์ฌ์ ๋ฅผ ๋๊ณ ํ์ค์ ์ธ ๊ฐ์ผ๋ก ์ ๋ฃ์ด์ค๋ค.
๋ณผ๋ฅจ ์ฌ์ฉํ๊ธฐ
์, ๊ทธ๋ฌ๋ฉด ์ด์ ๋ฐ์์
์ ๋ค ๋ ๊ฒ์ด๋ค.
๊ฐ๋ค์ฐ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
spec:
accessModes: [ReadWriteOnce]
storageClassName: longhorn
resources:
requests:
storage: 2Gi
---
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: busybox
image: busybox
command: ["sh", "-c", "echo hello > /data/hello.txt && sleep 3600"]
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: test-pvc
์ด๋ ๊ฒ PVC๋ฅผ ๋ง๋ค์ด์ pod์ ๋ถ์ด๋ฉด, longhorn์ด ์์์ ๊ทธ๋งํผ์ ๋ผ์ ๋ถ์ฌ์ค๋ค.

๊ทธ๋ฆฌ๊ณ UI์์๋ ๋ณผ๋ฅจ์ ์ฌ์ฉ๋์ด๋ ์ค์ ๋
ธ๋ ๋ฐฐ์น ๋ฑ๊น์ง ํ์ธํ ์ ์๋ค.
์ฐธ์กฐ
https://longhorn.io/
https://longhorn.io/docs/1.12.1/
https://longhorn.io/docs/1.12.1/concepts/