Kubernetes, CSI / Longhorn

Jeonghak Choยท2025๋…„ 4์›” 15์ผ

Kubernetes

๋ชฉ๋ก ๋ณด๊ธฐ
11/20

๐Ÿ“—Longhorn ๊ฐœ์š”

Longhorn์€ Kubernetes ํ™˜๊ฒฝ์—์„œ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ถ„์‚ฐ ๋ธ”๋ก ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ œ๊ณตํ•˜๋Š” ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ์ด๋‹ค. Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋ณ๊ณ , ๊ณ ๊ฐ€์šฉ์„ฑ์˜ ๋ธ”๋ก ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ์œผ๋กœ ์˜๊ตฌ์ ์ธ ์ €์žฅ ๊ณต๊ฐ„(Persistent Volume)์„ ์ œ๊ณตํ•˜์—ฌ Pod ์žฌ์‹œ์ž‘, ๋…ธ๋“œ ์žฅ์•  ์‹œ์—๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ง€๋˜๊ฒŒ ํ•ด์ค€๋‹ค.

์ฃผ์š” ํŠน์ง•

๊ธฐ๋Šฅ์„ค๋ช…
๋ถ„์‚ฐ ๋ณต์ œ๊ธฐ๋ณธ์ ์œผ๋กœ 2~3๊ฐœ์˜ ๋ณต์ œ๋ณธ์„ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์œ ์‹ค ๋ฐฉ์ง€
UI ์ œ๊ณต์›น ๊ธฐ๋ฐ˜ ๋Œ€์‹œ๋ณด๋“œ ์ œ๊ณต (๋ณผ๋ฅจ ์ƒํƒœ, ๋ณต์ œ, ๋ฐฑ์—… ๊ด€๋ฆฌ)
์Šค๋ƒ…์ƒท/๋ฐฑ์—…๋ณผ๋ฅจ ์Šค๋ƒ…์ƒท ๋ฐ ๋ฐฑ์—… ๊ธฐ๋Šฅ ๋‚ด์žฅ (S3/NFS ๋ฐฑ์—… ์ง€์›)
CSI ์ง€์›Kubernetes CSI (Container Storage Interface) ์—ฐ๋™
์˜คํ† ๋ฆฌ์ปค๋ฒ„๋ฆฌ๋…ธ๋“œ ์žฅ์•  ์‹œ ๋ณต์ œ๋ณธ ์ž๋™ ์žฌ๋ฐฐ์น˜
๊ฒฝ๋Ÿ‰ํ™”๋‹ค๋ฅธ ๋ถ„์‚ฐ ์Šคํ† ๋ฆฌ์ง€์— ๋น„ํ•ด ์„ค์น˜ ๋ฐ ์šด์˜์ด ๋‹จ์ˆœ

๐Ÿณ๏ธโ€๐ŸŒˆ [๊ถ๊ธˆํ•œ์ ]

  • hostpath ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ CSI ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ผ๊นŒ
  • CSI ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๋ณผ๋ฅจ์˜ ์งœํˆฌ๋ฆฌ ์šฉ๋Ÿ‰์„ ํ•ฉ์ณ์„œ ์„œ๋น„์Šค๊ฐ€ ๊ฐ€๋Šฅํ• ๊นŒ
  • ๋ณผ๋ฅจ์„ ๊ตฌ์„ฑํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ ์Šคํ† ๋ฆฌ์ง€ ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅํ• ๊นŒ

๐Ÿ”—[๋ชฉ์ฐจ]

์•„ํ‚คํ…์ฒ˜ ์ปดํฌ๋„ŒํŠธ

Longhorn Manager (longhorn-manager)

  • ๊ฐ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ๋ฐ๋ชฌ.
  • Longhorn ๋ฆฌ์†Œ์Šค(CR)์„ ๊ฐ์‹œํ•˜๊ณ , ๋ณผ๋ฅจ, ๋ณต์ œ๋ณธ, ์—”์ง„ ๋“ฑ์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์ œ์–ด๋ฅผ ์ˆ˜ํ–‰.
  • Pod ํ˜•ํƒœ๋กœ ์‹คํ–‰๋˜๋ฉฐ, Kubernetes API Server์™€ ์ƒํ˜ธ์ž‘์šฉ.

Longhorn Engine (longhorn-engine)

  • ๊ฐ ๋ณผ๋ฅจ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์กด์žฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ.
  • ๋ณต์ œ๋ณธ๋“ค๊ณผ ํ†ต์‹ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ I/O ์ฒ˜๋ฆฌ.
  • Read/Write ํŠธ๋ž˜ํ”ฝ์„ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์„œ ๊ฐ ๋ณต์ œ๋ณธ์— ์ „๋‹ฌํ•˜๊ณ , ์ƒํƒœ๋ฅผ ๊ฐ์‹œ.

Longhorn Replica (longhorn-replica)

  • ๊ฐ ๋…ธ๋“œ์— ์žˆ๋Š” ๋ณต์ œ๋ณธ Pod.
  • ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๋ณผ๋ฅจ์ด๋ฉฐ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณต์ œ๋ณธ์ด ํ•˜๋‚˜์˜ ๋ณผ๋ฅจ์„ ๊ตฌ์„ฑ.
  • Replica๋Š” ๋””์Šคํฌ์— ํŒŒ์ผ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ ์ €์žฅ.

Longhorn UI

  • ์›น ๋Œ€์‹œ๋ณด๋“œ ์ œ๊ณต.
  • ๋ณผ๋ฅจ, ๋ฐฑ์—…, ์Šค๋ƒ…์ƒท, ๋…ธ๋“œ ์ƒํƒœ ๋“ฑ์„ ์‹œ๊ฐ์ ์œผ๋กœ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ.

Instance Manager

  • ํ•˜๋‚˜์˜ Pod์—์„œ ์—ฌ๋Ÿฌ Engine ๋ฐ Replica๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒฝ๋Ÿ‰ ๋Ÿฐํƒ€์ž„.
  • ๋ณผ๋ฅจ๋‹น Pod์ด ๋งŽ์•„์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž….

CSI Driver

  • Kubernetes์˜ PersistentVolumeClaim(PVC) ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋“œ๋ผ์ด๋ฒ„.
  • Longhorn ๋ณผ๋ฅจ์„ Kubernetes Pod์— ์ž๋™์œผ๋กœ ๋งˆ์šดํŠธ ๋ฐ ์–ธ๋งˆ์šดํŠธ.

Longhorn ํ™œ์šฉ

  • ๊ฐ€๋ฒผ์šด ๋ถ„์‚ฐ ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ํ•„์š”ํ•œ ํด๋Ÿฌ์Šคํ„ฐ
  • ๋กœ์ปฌ ๋””์Šคํฌ๋ฅผ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๊ณ  ์‹ถ์€ ํ™˜๊ฒฝ
  • Rook/Ceph ๊ฐ™์€ ๋ณต์žกํ•œ ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ๋ถ€๋‹ด์Šค๋Ÿฌ์šด ๊ฒฝ์šฐ
  • NFS๋ณด๋‹ค ๊ฐ•๋ ฅํ•œ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์›ํ•˜์ง€๋งŒ ๊ด€๋ฆฌ๊ฐ€ ์‰ฌ์šด ๊ฒƒ์„ ์›ํ•  ๋•Œ
  • ๊ณ ์„ฑ๋Šฅ ์›Œํฌ๋กœ๋“œ์—๋Š” Ceph๋ณด๋‹ค ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ์Œ
  • ๋™์ผ ๋ณผ๋ฅจ์˜ ReadWriteMany(RWX) ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜์ง€ ์•Š์Œ (๋‹จ, NFS๋‚˜ shared RWX ์ง€์› ๋ชจ๋“œ ์„ค์ • ๊ฐ€๋Šฅ)
  • ๋””์Šคํฌ ์žฅ์• ๋ณด๋‹ค ๋…ธ๋“œ ์žฅ์•  ๋ณต๊ตฌ๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๋น ๋ฆ„

CSI ๋“œ๋ผ์ด๋ฒ„๋ณ„ ๋””์Šคํฌ ํ•ฉ์นจ ๊ฐ€๋Šฅ ์—ฌ๋ถ€

๋‘ ๋””์Šคํฌ์— ๊ฐ๊ฐ 5GB ๋‚จ์•„ ์žˆ๋Š” ๊ฒฝ์šฐ, CSI๊ฐ€ ์ด๋ฅผ ํ•ฉ์ณ์„œ 10GB ๋ณผ๋ฅจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€๋Š” ํ•ด๋‹น CSI ๋“œ๋ผ์ด๋ฒ„์™€ ๋ฐฑ์—”๋“œ ์Šคํ† ๋ฆฌ์ง€์˜ ๋Šฅ๋ ฅ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.

CSI ๋“œ๋ผ์ด๋ฒ„๋””์Šคํฌ ํ•ฉ์นจ ๊ฐ€๋Šฅ ์—ฌ๋ถ€์„ค๋ช…
Longhorn๊ฐ€๋Šฅ์—ฌ๋Ÿฌ ๋…ธ๋“œ ๋””์Šคํฌ๋ฅผ ๋ฌถ์–ด ๋ณผ๋ฅจ ๊ตฌ์„ฑ
Ceph RBD๊ฐ€๋Šฅ๋ฐฑ์—”๋“œ์— OSD ์—ฌ๋Ÿฌ ๊ฐœ โ†’ ํ’€ ๊ตฌ์„ฑ
LVM-CSI๊ฐ€๋ŠฅPhysical Volume ๋ฌถ์–ด์„œ Logical Volume ์ƒ์„ฑ
Local Path CSI๋ถˆ๊ฐ€๋‹จ์ผ ๋…ธ๋“œ, ๋‹จ์ผ ๊ฒฝ๋กœ์—์„œ๋งŒ ํ• ๋‹น
HostPath๋ถˆ๊ฐ€ํ…Œ์ŠคํŠธ ์ „์šฉ, ๋””์Šคํฌ ํ•ฉ์นจ ๊ธฐ๋Šฅ ์—†์Œ

hostPath vs CSI ๋“œ๋ผ์ด๋ฒ„ ๋น„๊ต

MinIO์ฒ˜๋Ÿผ ๋””์Šคํฌ I/O๊ฐ€ ๋งŽ์€ S3 ์›Œํฌ๋กœ๋“œ์—๋Š” hostPath ์„ฑ๋Šฅ์ด ์ข‹๊ธด ํ•˜์ง€๋งŒ, ์šด์˜ ๋ณต์žก๋„์™€ ์žฅ์•  ๋‚ด๊ตฌ์„ฑ์„ ๊ณ ๋ คํ•ด Longhorn ๊ฐ™์€ CSI ๋ฐฉ์‹์„ ๋งŽ์ด ์“ด๋‹ค.

์–ธ์ œ hostPath๋ฅผ ์จ์•ผ ํ•˜๋‚˜?

  • Dev/PoC ํ™˜๊ฒฝ
  • ๊ณ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•˜๊ณ , ๋…ธ๋“œ/๋””์Šคํฌ ์žฅ์•  ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ
  • ์ธํ”„๋ผ๊ฐ€ ๋‹จ์ˆœํ•˜๊ณ  ์ˆ˜๋™ ์„ค์ •์ด ๊ดœ์ฐฎ์€ ๊ฒฝ์šฐ
  • ๋…ธ๋“œ์— ๋””์Šคํฌ๋ฅผ ์ง์ ‘ ๋ถ™์—ฌ ์“ฐ๋Š” ๋กœ์ปฌ ๊ณ ์† ์Šคํ† ๋ฆฌ์ง€ ๋ชฉ์ 
volumeMounts:
- name: data
  mountPath: /data
volumes:
- name: data
  hostPath:
    path: /mnt/minio1

์–ธ์ œ CSI(Local PV, Longhorn ๋“ฑ)๋ฅผ ์จ์•ผ ํ•˜๋‚˜?

  • ์šด์˜ ํ™˜๊ฒฝ์—์„œ ์Šคํ† ๋ฆฌ์ง€ ๊ด€๋ฆฌ ์ž๋™ํ™”, ๋ฐฑ์—…, ๋ณต๊ตฌ, ํ™•์žฅ์„ฑ ํ•„์š”ํ•  ๋•Œ
  • ์žฅ์•  ๋ณต๊ตฌ, HA, ์œ ์—ฐํ•œ Pod ์ด๋™์„ฑ์ด ์ค‘์š”ํ•  ๋•Œ
  • Kubernetes ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐฉ์‹์œผ๋กœ ์Šคํ† ๋ฆฌ์ง€ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ
ํ•ญ๋ชฉhostPath ์‚ฌ์šฉCSI ๋“œ๋ผ์ด๋ฒ„ (์˜ˆ: Longhorn, local-static-provisioner)
๊ฐœ๋…Pod์—์„œ ๋…ธ๋“œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง์ ‘ ๋งˆ์šดํŠธ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ‘œ์ค€ ์Šคํ† ๋ฆฌ์ง€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋””์Šคํฌ ์‚ฌ์šฉ
์Šคํ† ๋ฆฌ์ง€ ํด๋ž˜์Šค ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ถˆ๊ฐ€๊ฐ€๋Šฅ (storageClassName ์ง€์ • ๊ฐ€๋Šฅ)
๋™์  ํ”„๋กœ๋น„์ €๋‹๋ถˆ๊ฐ€๋Šฅ (์ˆ˜๋™ YAML ํ•„์š”)๊ฐ€๋Šฅ (Longhorn ๋“ฑ์€ ๋™์  PVC ์ƒ์„ฑ ์ง€์›)
๋ฐ์ดํ„ฐ ๊ฐ€์šฉ์„ฑ๋””์Šคํฌ๊ฐ€ ๋ถ™์€ ๋…ธ๋“œ์—๋งŒ ์กด์žฌ (๋…ธ๋“œ ์žฅ์•  ์‹œ ์†์‹ค ๊ฐ€๋Šฅ)Replica, Snapshot, Self-healing ๋“ฑ์œผ๋กœ ๋‚ด๊ตฌ์„ฑโ†‘
Pod ์ด๋™ ๊ฐ€๋Šฅ์„ฑํ•ด๋‹น ๋…ธ๋“œ์—๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅ (AntiAffinity ํ•„์ˆ˜)Replica ๊ธฐ๋ฐ˜์ด๊ฑฐ๋‚˜ volumeAttachment๋กœ ์Šค์ผ€์ค„ ์œ ์—ฐ์„ฑโ†‘
๋ฐฑ์—…/๋ณต์› ๊ธฐ๋Šฅ์—†์Œ (์ง์ ‘ ๊ด€๋ฆฌํ•ด์•ผ ํ•จ)๋Œ€๋ถ€๋ถ„ CSI๋Š” ์ž์ฒด ๋ฐฑ์—…/์Šค๋ƒ…์ƒท API ์ œ๊ณต (Longhorn UI ํฌํ•จ)
์šด์˜ ๊ด€๋ฆฌ UI์—†์Œ์žˆ์Œ (Longhorn, OpenEBS ๋“ฑ์€ ๋Œ€์‹œ๋ณด๋“œ ์ œ๊ณต)
์„ฑ๋Šฅ๊ฐ€์žฅ ๋น ๋ฆ„ (๋””์Šคํฌ ์ง์ ‘ ์—ฐ๊ฒฐ)์•ฝ๊ฐ„ ๋А๋ฆด ์ˆ˜ ์žˆ์Œ (๋„คํŠธ์›Œํฌ ๋ณต์ œ overhead)

MinIO + Longhorn ์กฐํ•ฉ

์—ญํ• ์„ค๋ช…
MinIO๊ณ ์„ฑ๋Šฅ ๋ถ„์‚ฐ ์˜ค๋ธŒ์ ํŠธ ์ €์žฅ์†Œ (S3 compatible)
Longhorn์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„ค์ดํ‹ฐ๋ธŒ ๋ถ„์‚ฐ ๋ธ”๋ก ์Šคํ† ๋ฆฌ์ง€ ์†”๋ฃจ์…˜

MinIO Pod์˜ PVC๋ฅผ Longhorn์œผ๋กœ ์ œ๊ณต

volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      storageClassName: longhorn
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 100Gi

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Longhorn์ด ์ž๋™์œผ๋กœ ๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•˜๊ณ , MinIO๊ฐ€ ๊ทธ ์œ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค.

Longhorn ๊ธฐ๋ฐ˜ MinIO ๊ตฌ์„ฑ ์žฅ์ 

  • ์Šคํ† ๋ฆฌ์ง€ ๊ณ ๊ฐ€์šฉ์„ฑ

    • Longhorn์€ ์ž์ฒด์ ์œผ๋กœ replica, self-healing, snapshot, backup ๊ธฐ๋Šฅ ์ œ๊ณต
    • ์˜ˆ: ๋…ธ๋“œ๊ฐ€ ์ฃฝ์–ด๋„ ๋‹ค๋ฅธ ๋…ธ๋“œ์˜ replica๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€
  • PVC ๊ด€๋ฆฌ ๊ฐ„ํŽธ

    • Longhorn์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์™„์ „ํžˆ ํ†ตํ•ฉ๋˜์–ด PVC๋งŒ ๋งŒ๋“ค๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • MinIO๋Š” ๋ณ„๋„ ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ ์—†์ด Longhorn๋งŒ์œผ๋กœ ๊ณ ๊ฐ€์šฉ ์šด์˜ ๊ฐ€๋Šฅ
  • ์Šคํ† ๋ฆฌ์ง€ UI ๋ฐ ๋ฐฑ์—…

    • Longhorn UI์—์„œ ์‹ค์‹œ๊ฐ„ ๋ณผ๋ฅจ ์ƒํƒœ ํ™•์ธ, ์Šค๋ƒ…์ƒท/๋ฐฑ์—…๋„ ๊ฐ„๋‹จํ•จ

Longhorn ๊ธฐ๋ฐ˜ MinIO ๊ตฌ์„ฑ ์‹œ ๊ณ ๋ ค์‚ฌํ•ญ

ํ•ญ๋ชฉ์„ค๋ช…
์„ฑ๋ŠฅLonghorn์€ ๋ถ„์‚ฐ ์Šคํ† ๋ฆฌ์ง€์ด๋ฏ€๋กœ ๋””์Šคํฌ + ๋„คํŠธ์›Œํฌ I/O๊ฐ€ ๊ฒฐํ•ฉ๋จ. ๊ณ ์„ฑ๋Šฅ MinIO ๊ตฌ์„ฑ์—์„  ๋กœ์ปฌ ๋””์Šคํฌ๊ฐ€ ๋” ๋น ๋ฆ„
๋ ˆ์ดํ„ด์‹œS3 ์›Œํฌ๋กœ๋“œ์—์„œ ๋Œ€๊ทœ๋ชจ ๋ณ‘๋ ฌ ์š”์ฒญ์ด ๋งŽ์œผ๋ฉด, Longhorn latency๊ฐ€ ์˜ํ–ฅ ์ค„ ์ˆ˜ ์žˆ์Œ
์ค‘๋ณต ๊ด€๋ฆฌMinIO ์ž์ฒด๊ฐ€ erasure coding/replica๋ฅผ ํ•˜๋ฏ€๋กœ, Longhorn๊ณผ ์ค‘๋ณต๋œ ๋‚ด๊ตฌ์„ฑ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ (์ฃผ์˜ํ•ด์„œ ์„ค์ • ํ•„์š”)

Longhorn ์„ค์น˜ / ์‚ญ์ œ

helm repo add longhorn https://charts.longhorn.io
helm repo update
kubectl create namespace longhorn-system

helm install longhorn longhorn/longhorn \
  --namespace longhorn-system \
  --set defaultSettings.defaultReplicaCount=2 \
  --set defaultSettings.recreateFailedPod=true
  • ์‚ญ์ œ
kubectl -n longhorn-system patch -p '{"value": "true"}' --type=merge lhs deleting-confirmation-flag
helm uninstall longhorn -n longhorn-system
kubectl delete namespace longhorn-system
  • (์ฐธ๊ณ ) Longhorn ์„ค์น˜ ํ›„ ์ƒ์„ฑ๋˜๋Š” ๋ฆฌ์†Œ์Šค
    replica๋ฅผ 2๋กœ ์ค„์—ฌ๋„ ๋งŽ์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.
vagrant@master:~$ k get po -n longhorn-system -w
NAME                                                READY   STATUS    RESTARTS   AGE
csi-attacher-647d7767b9-6kf65                       1/1     Running   0          26s
csi-attacher-647d7767b9-7xxdb                       1/1     Running   0          26s
csi-attacher-647d7767b9-hbjz5                       1/1     Running   0          26s
csi-provisioner-76bc4b5886-4pkvl                    1/1     Running   0          26s
csi-provisioner-76bc4b5886-jrccb                    1/1     Running   0          26s
csi-provisioner-76bc4b5886-rzc9z                    1/1     Running   0          26s
csi-resizer-78cd7545b7-5bplx                        1/1     Running   0          25s
csi-resizer-78cd7545b7-m6mt2                        1/1     Running   0          25s
csi-resizer-78cd7545b7-md299                        1/1     Running   0          25s
csi-snapshotter-7b7db78f9-j4q7f                     1/1     Running   0          25s
csi-snapshotter-7b7db78f9-pdr92                     1/1     Running   0          25s
csi-snapshotter-7b7db78f9-t8cc6                     1/1     Running   0          25s
engine-image-ei-db6c2b6f-2krkx                      1/1     Running   0          74s
engine-image-ei-db6c2b6f-7lmcc                      1/1     Running   0          74s
engine-image-ei-db6c2b6f-gb725                      1/1     Running   0          74s
instance-manager-3ea5b7589af1189d2443a9741d58a959   1/1     Running   0          40s
instance-manager-4fbef9fc9af28ebef2cc1437097b6d51   1/1     Running   0          43s
instance-manager-d883d45a264cebf998825ad3072d756e   1/1     Running   0          44s
longhorn-csi-plugin-q72pw                           3/3     Running   0          25s
longhorn-csi-plugin-qffqz                           3/3     Running   0          25s
longhorn-csi-plugin-w5d65                           3/3     Running   0          25s
longhorn-driver-deployer-85c5f4ff6f-wf62g           1/1     Running   0          82s
longhorn-manager-8d4cm                              2/2     Running   0          82s
longhorn-manager-cl8s4                              2/2     Running   0          82s
longhorn-manager-thxqs                              2/2     Running   0          83s
longhorn-ui-5984465c7b-jx8vt                        1/1     Running   0          83s
longhorn-ui-5984465c7b-wcpdt                        1/1     Running   0          82s

vagrant@master:~$ k get svc -n longhorn-system
NAME                          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
longhorn-admission-webhook    ClusterIP   10.233.8.248    <none>        9502/TCP   4m37s
longhorn-backend              ClusterIP   10.233.28.119   <none>        9500/TCP   4m37s
longhorn-conversion-webhook   ClusterIP   10.233.62.195   <none>        9501/TCP   4m37s
longhorn-frontend             ClusterIP   10.233.11.227   <none>        80/TCP     4m37s
longhorn-recovery-backend     ClusterIP   10.233.59.91    <none>        9503/TCP   4m37s

vagrant@master:~$ k get sc
NAME                 PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
longhorn (default)   driver.longhorn.io   Delete          Immediate           true                   5m50s
longhorn-static      driver.longhorn.io   Delete          Immediate           true                   14m

longhorn ํ…Œ์ŠคํŠธ

PVC ์ƒ์„ฑ

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: longhorn-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 5Gi

๋ณผ๋ฅจ ์ƒ์„ฑ

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: busybox
    command: ["/bin/sh"]
    args: ["-c", "sleep 3600"]
    volumeMounts:
    - mountPath: "/data"
      name: myvol
  volumes:
  - name: myvol
    persistentVolumeClaim:
      claimName: longhorn-pvc

ํผ์‹œ์Šคํ„ด์Šค ํ…Œ์ŠคํŠธ

/data ์— ๋ณผ๋ฅจ์ด ๋งˆ์šดํŠธ ๋˜์–ด ์žˆ๋‹ค. mypod ์ปจํ…Œ์ด๋„ˆ์˜ /data ์— hi.txt ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ ํ›„ mypod๋ฅผ ์‚ญ์ œ ํ•œ๋‹ค. ์ƒˆ๋กœ์šด pod ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ /data ์— ์ ‘๊ทผํ•˜๋ฉด ์ข€ ์ „์— ์ƒ์„ฑํ•œ hi.txt ํŒŒ์ผ์ด ๋‚จ์•„ ์žˆ๋‹ค.

vagrant@master:~$ k exec -it mypod -- sh
/ # cd /data
/data # echo "hi" > hi.txt
/data # cat hi.txt
hi
/data # exit


vagrant@master:~$ k delete po mypod
pod "mypod" deleted
vagrant@master:~$ k apply -f mypod.yml
pod/mypod created
vagrant@master:~$ k exec -it mypod -- sh
/ # ls /data
hi.txt      lost+found

์˜ค๋ธŒ์ ํŠธ ์Šคํ† ๋ฆฌ์ง€์™€ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ดํ•ด

์˜ค๋ธŒ์ ํŠธ ์Šคํ† ๋ฆฌ์ง€(Object Storage) ๋Š” ํŒŒ์ผ์‹œ์Šคํ…œ์„ ์ง์ ‘ ํฌ๋งทํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๊ณ , MinIO ๊ฐ™์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์†Œํ”„ํŠธ์›จ์–ด) ์ด ๊ธฐ์กด ๋””์Šคํฌ ์œ„์—์„œ ์˜ค๋ธŒ์ ํŠธ ์ €์žฅ ๋ฐฉ์‹์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐœ๋…์ด๋‹ค.

  • ํŒŒ์ผ ๋Œ€์‹  "์˜ค๋ธŒ์ ํŠธ" ๋‹จ์œ„๋กœ ์ €์žฅ
  • ๊ฐ ์˜ค๋ธŒ์ ํŠธ์—๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ + ๊ณ ์œ  ID๊ฐ€ ๋ถ™์Œ
  • ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ํ•„์š” ์—†์Œ (ํ•˜์ง€๋งŒ ๊ฐ€์ƒ์œผ๋กœ ํ‰๋‚ด ๋‚ผ ์ˆ˜ ์žˆ์Œ)
  • REST API(S3)๋กœ ์ ‘๊ทผ
  • ์˜ค๋ธŒ์ ํŠธ ์Šคํ† ๋ฆฌ์ง€๋Š” ์†Œํ”„ํŠธ์›จ์–ด์  ๊ฐœ๋…
  • MinIO๋งŒ ์„ค์น˜ํ•˜๋ฉด ๊ตฌํ˜„ ๊ฐ€๋Šฅ, ๋””์Šคํฌ ํฌ๋งท์€ ๊ธฐ์กด ํŒŒ์ผ์‹œ์Šคํ…œ์ด๋ฉด ์ถฉ๋ถ„
  • ์‹ค์ œ ๋””์Šคํฌ์— ์ €์žฅ์€ ํŒŒ์ผ ๋‹จ์œ„์ง€๋งŒ, ์™ธ๋ถ€์—์„œ๋Š” ์˜ค๋ธŒ์ ํŠธ์ฒ˜๋Ÿผ ๋™์ž‘
ํ•ญ๋ชฉ์„ค๋ช…
ํŒŒ์ผ์‹œ์Šคํ…œ ํฌ๋งท ํ•„์š” ์—ฌ๋ถ€๋ถˆ๊ฐ€. ์ผ๋ฐ˜์ ์ธ ext4, xfs ๊ฐ™์€ ํŒŒ์ผ์‹œ์Šคํ…œ ์œ„์—์„œ ์ž‘๋™
MinIO ์„ค์น˜๋งŒ์œผ๋กœ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๊ฐ€๋Šฅ. MinIO๊ฐ€ ์˜ค๋ธŒ์ ํŠธ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์†Œํ”„ํŠธ์›จ์–ด์ ์œผ๋กœ ์ œ๊ณต
OS ์ธ์‹ ๋ฐฉ์‹OS๋Š” ๋‹จ์ˆœํžˆ "๋””๋ ‰ํ† ๋ฆฌ+ํŒŒ์ผ"๋กœ ๋ณด์ง€๋งŒ, MinIO๋Š” ๊ทธ๊ฒƒ์„ ์˜ค๋ธŒ์ ํŠธ์ฒ˜๋Ÿผ ๊ด€๋ฆฌ
ํ•˜๋“œ์›จ์–ด์™€์˜ ๊ด€๊ณ„๋กœ์ปฌ ๋””์Šคํฌ, SAN, ํ˜น์€ PVC(์ฟ ๋ฒ„๋„คํ‹ฐ์Šค) ๋“ฑ ์–ด๋–ค ์ €์žฅ์†Œ๋“  ์œ„์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅ

MinIO ์˜ˆ์‹œ

  • ๋””์Šคํฌ๋ฅผ ext4๋กœ ํฌ๋งทํ•˜๊ณ  /mnt/data1์— ๋งˆ์šดํŠธ
  • MinIO ์„ค์น˜ํ•˜๊ณ  /mnt/data1์„ ๋ฐ์ดํ„ฐ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ง€์ •
  • MinIO๋Š” /mnt/data1์— ์‹ค์ œ ํŒŒ์ผ์„ ์ €์žฅํ•˜์ง€๋งŒ, ํด๋ผ์ด์–ธํŠธ์—๋Š” S3 API๋ฅผ ํ†ตํ•ด ์˜ค๋ธŒ์ ํŠธ์ฒ˜๋Ÿผ ๋ณด์ž„

0๊ฐœ์˜ ๋Œ“๊ธ€