[k8s] Longhorn

[์›๋ณธ ๋งํฌ]

Longhorn์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์šฉ ๋ถ„์‚ฐ "๋ธ”๋ก" ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ์ด๋‹ค.
์˜คํ”ˆ์†Œ์Šค์ด๊ณ , ๋ธ”๋ก ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ง€์›ํ•œ๋‹ค.

์ด๊ฑธ ์ž˜ ๊น”๋ฉด ๋ณผ๋ฅจ์„ ๋ถ„์‚ฐ ๊ตฌ์„ฑ์œผ๋กœ ๊ณ ๊ฐ€์šฉ์„ฑ-๊ณ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ๋ธ”๋ก ์Šคํ† ๋ฆฌ์ง€๋“ค์— ๋น„ํ•ด์„œ ์‚ฌ์šฉ์ด๋‚˜ ๊ตฌ์„ฑ์ด ๊ฐ„ํŽธํ•œ ํŽธ์ด๋‹ค.




๊ธฐ๋ณธ ๊ตฌ์กฐ

๊ตฌ์กฐ๋„ ๊ฝค ๊ฐ„๋‹จํ•œ ํŽธ์— ์†ํ•œ๋‹ค.
๋กฑํ˜ผ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋…ธ๋“œ๋งˆ๋‹ค Manager๋ผ๋Š” ๊ฒƒ์„ ๋„์šฐ๋Š”๋ฐ, ์ด Manager๊ฐ€ ์ตœ์ข… ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ๋ณผ๋ฅจ ์ƒ์„ฑ ์š”์ฒญ ๋“ฑ์„ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฃผ์š” ์ž‘์—…์„ ๋‹ค ๋‹ด๋‹นํ•œ๋‹ค.

https://longhorn.io/docs/1.12.1/concepts/
๊ทธ ์™ธ์—๋Š” ๊ทธ๋‹ค์ง€ ๋ณต์žกํ•œ ๊ฒƒ์€ ์—†๋‹ค.

๋กฑํ˜ผ์€ ๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•˜๊ณ  ํŒŒ์ผ์„ ์“ฐ๋ฉด, ๋™์ผํ•œ ๋ณต์ œ๋ณธ์„ ์—ฌ๋Ÿฌ๊ฐœ ์ƒ์„ฑํ•ด์„œ ์†์‹ค์„ ๋ฐฉ์ง€ํ•œ๋‹ค.
์ด๊ฑด v1/v2๋งˆ๋‹ค ๋™์ž‘ ๋ฐฉ์‹์ด ํŒ์ดํ•˜๊ฒŒ ๋‹ค๋ฅธ๋ฐ, v1์€ ๊ทธ๋ƒฅ ๊ทธ ๋ธ”๋ก์„ ํ†ต์งธ๋กœ ๋ณต์ œํ•˜์ง€๋งŒ, v2๋Š” ์ฒญํฌ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ์„œ ๋ถ„ํ•  ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.
v2๋Š” ์ด ๊ธ€์„ ์“ฐ๋Š” ์‹œ์ ์—์„œ๋Š” ์•„์ง ์‹คํ—˜ ๋‹จ๊ณ„๋‹ค. ๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์„œ๋„ v1์„ ๊ธฐ์ค€์œผ๋กœ ๋‹ค๋ฃฌ๋‹ค.

ํ˜„์žฌ ๋กฑํ˜ผ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ฃผ์š” ๊ธฐ๋Šฅ ์š”์†Œ๋Š” ๋Œ€๋žต ์ด ์ •๋„๋‹ค.

  1. ํŽธ๋ฆฌํ•œ UI ๊ธฐ๋ฐ˜ ์ œ์–ด ๊ธฐ๋Šฅ
  2. ๊ณ ๊ฐ€์šฉ์„ฑ ์˜ต์…˜
  3. ์ž๋™ ์ฆ๋ถ„ํ˜• ์Šค๋ƒ…์ƒท (S3 ๋“ฑ)
  4. ๋ฐฑ์—… ๊ธฐ๋Šฅ

ํŠนํžˆ ์Šค๋ƒ…์ƒท ๊ธฐ๋Šฅ์„ ์ฃผ์š”ํ•œ ๊ฐ•์ ์„ ๋‚ด์„ธ์šฐ๋Š” ํŽธ์ด๋‹ค. ๋ณ„๋„ ๊ณต๊ฐ„์— ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ด๋†จ๋‹ค๊ฐ€, ์›ํ•˜๋Š” ์‹œ์ ์˜ ์Šค๋ƒ…์ƒท์œผ๋กœ ๋ณผ๋ฅจ์„ ๋กค๋ฐฑํ•  ์ˆ˜ ์žˆ๋‹ค.




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/

Search