ํด๋ฌ์คํฐ ๊ตฌ์ถ์ด ์ด๋ ๊ฒ ํ๋ํ ์ค์ ๋ชฐ๋์ต๋๋ค. ๊ณต์ ๋ฌธ์๋๋ก ๋ช ๋ น์ด๋ฅผ ๋ฐ๋ผ ์น๋ฉด ๊ธ๋ฐฉ ๋ ๊ฒ ๊ฐ์๋๋ฐ, ํ์ค์ ๋ฌ๋์ด์. SSD๊ฐ ์์คํ ์ ํต์งธ๋ก ์ผ๋ ค๋ฒ๋ฆฌ๊ณ , ๋คํธ์ํฌ๊ฐ 5๋ถ๋ง๋ค ๋๊ธฐ๊ณ , Worker ๋ ธ๋๊ฐ ์๋ฑํ IP๋ก ๋ถ๊ณ , Longhorn ๋งค๋์ ๊ฐ ์์ ๋จ์ง๋ฅผ ์๊ณ . ์ด ํฌ์คํ ์ ๊ทธ ์ฝ์ง์ ๊ธฐ๋ก์ ๋๋ค.
๐ K3s ์ํค ์์ธ ๋ฌธ์: GitHub Wiki โ Kubernetes(K3s) | Longhorn HA
๐ฅ๏ธ ํ๋์จ์ด ๊ตฌ์ฑ
๋ณธ๊ฒฉ์ ์ธ ์ด์ผ๊ธฐ์ ์์ ๋ฌผ๋ฆฌ ํ๊ฒฝ์ ๊ฐ๋จํ ์๊ฐํ๋ฉด, ๋ ธ๋ ์ธ ๋๋ ์ด๋ ๊ฒ ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
| ๋ ธ๋ | ์ญํ | RAM | ์ ์ฅ์ | ๋คํธ์ํฌ |
|---|---|---|---|---|
| Master | Control Plane ์ ์ฉ | 4GB | SSD 128GB | ์ด๋๋ท(eth0) |
| Worker 1 | ๋ฐฑ์ ๊ฐ์ ๋ ธ๋ | 8GB | SSD 256GB | ์ด๋๋ท(eth0) |
| Worker 2 | ๋ฉ์ธ AI ๊ฐ์ง ๋ ธ๋ | 8GB | SSD 256GB | ์ด๋๋ท(eth0) |
๋ชจ๋ ๋ ธ๋๋ ํ์๋ง(์ด๋๋ท)๊ณผ ์ธํฐ๋ท(Wi-Fi) ๋ ๊ฐ์ ๋คํธ์ํฌ ์ธํฐํ์ด์ค๋ฅผ ๋์์ ์ฌ์ฉํฉ๋๋ค. ํด๋ฌ์คํฐ ๋ด๋ถ ํต์ ์ ์ด๋๋ท, ํจํค์ง ๋ค์ด๋ก๋์ Docker Hub ์ด๋ฏธ์ง pull์ Wi-Fi๋ก ๋ถ๋ฆฌํ๋ ๊ตฌ์กฐ์ ๋๋ค. ์ด ์ด์ค ๋คํธ์ํฌ ๊ตฌ์กฐ๊ฐ ๋ค์์ ์์ฒญ๋ ํธ๋ฌ๋ธ์ํ ์ ์์ธ์ด ๋ฉ๋๋ค.
๐ฅ Episode 1. SSD๊ฐ ์์คํ ์ ์ผ๋ ค๋ฒ๋ ธ๋ค โ USB-SATA UAS ํธํ์ฑ ๋ฌธ์
์ฒซ ๋ฒ์งธ ์๋ จ์ ํ๋์จ์ด์์ ์์ต๋๋ค. ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด 5๋ฅผ SSD์ ์ฐ๊ฒฐํ๊ณ ๋ถํ ํ๋ฉด ์ฒ์์๋ ๋ฉ์ฉกํ๊ฒ ๋์ํฉ๋๋ค. SSH๋ ์ ๋ถ๊ณ , ping๋ ์ ๊ฐ๊ณ . ๊ทธ๋ฐ๋ฐ VS Code Remote-SSH๋ก ์ฐ๊ฒฐํ๊ฑฐ๋ ์๊ฐ์ด ์กฐ๊ธ ์ง๋๋ฉด ์์คํ ์ด ํต์งธ๋ก ๊ตณ์ด๋ฒ๋ฆฝ๋๋ค.
์ฆ์:
- SSH๊ฐ ๋จนํต์ด ๋๊ณ , ์ธ๋ถ์์ ping์ ๋ณด๋ด๋ฉด
Destination host unreachable - ์ปค๋ ํจ๋ ๋ก๊ทธ๋ ์๋๋ฐ ์ฟจ๋ง ํฌ์ด ๊ณ ์์ผ๋ก ๋๋ฉด์ ๋ฐ์ด์ด ์ฌํด์ง
htop์ผ๋ก ํ์ธํ๋ฉด ํน์ CPU ์ฝ์ด ํ๋๊ฐ 100%๋ก ์น์๋ Interrupt Storm ๋ฐ์
์์ธ์ USB-SATA ์ด๋ํฐ์์ต๋๋ค. ๋ฆฌ๋ ์ค๋ USB ์ฐ๊ฒฐ ์คํ ๋ฆฌ์ง์ UAS(USB Attached SCSI) ํ๋กํ ์ฝ์ ์ฌ์ฉํฉ๋๋ค. ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ก ๋น ๋ฅธ ์ฑ๋ฅ์ ๋ด๋ ํ๋กํ ์ฝ์ธ๋ฐ, ์ ๊ฐํ ์ด๋ํฐ ์นฉ์ (JMicron ๊ณ์ด)์ด ์ด ๋๋ผ์ด๋ฒ์ ์ถฉ๋ํฉ๋๋ค. VS Code ์ธ๋ฑ์ฑ์ฒ๋ผ ๋๋ค I/O ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ ์ปจํธ๋กค๋ฌ๊ฐ ๋ฐ๋๋ฝ์ ๋น ์ง๋ฉด์ CPU๊ฐ ์ธํฐ๋ฝํธ ํญํ์ ์๋ฌ๋ฆฌ๋ค๊ฐ ์์คํ ์ ์ฒด๊ฐ ์๋ต ๋ถ๋ฅ์ด ๋๋ ๊ฒ์ด์์ต๋๋ค.
ํด๊ฒฐ: ์ปค๋ ๋ถํ ํ๋ผ๋ฏธํฐ์ quirks๋ฅผ ์ถ๊ฐํด์ UAS๋ฅผ ๋๊ณ BOT(Bulk-Only Transport) ๋ชจ๋๋ก ๊ฐ์ ์ ํํฉ๋๋ค.
# /boot/firmware/cmdline.txt ๋งจ ์์ด๋ ๋ค์ ์ถ๊ฐ
# ๋ณธ์ธ ์ด๋ํฐ ID๋ lsusb๋ก ํ์ธ
usb-storage.quirks=7825:a2a4:u
| ๋ชจ๋ | ํน์ง |
|---|---|
| BOT | 1์ฐจ์ ๋๋ก โ ์์ฐจ ์ฒ๋ฆฌ, ๋๋ฆฌ์ง๋ง ์์ ์ |
| UAS | ๋ค์ฐจ์ ๊ณ ์๋๋ก โ ๋ณ๋ ฌ ์ฒ๋ฆฌ, ๋น ๋ฅด์ง๋ง ์นฉ์ ์ง์ ํ์ |
๐ก ๊ตํ: USB-SATA ์ด๋ํฐ๋ ๋จ์ ์ผ์ด๋ธ์ด ์๋๋๋ค. ์นฉ์ ํธํ์ฑ์ ํ๋ ํ๋์ ‘์ฅ๋น’์ ๋๋ค. Longhorn์ฒ๋ผ ์คํ ๋ฆฌ์ง ์ฑ๋ฅ์ด ์ค์ํ ํ๋ก์ ํธ๋ผ๋ฉด ASMedia ASM1153E ์นฉ์ ์ด ํ์ฌ๋ ์ด๋ํฐ๋ฅผ ๊ถ์ฅํฉ๋๋ค.
๐ฅ Episode 2. ๋คํธ์ํฌ๊ฐ 5๋ถ๋ง๋ค ๋๊ฒผ๋ค โ DHCP ํ์์์์ ํจ์
SSD ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ K3s ์ค์น๋ฅผ ์์ํ์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ฒ์ ์ด์ํ ์ผ์ด ์๊ฒผ์ด์. ๋ถํ ์งํ์๋ SSH๊ฐ ์ ๋๋๋ฐ, 5๋ถ ํ์ ์ ํํ๊ฒ ๋คํธ์ํฌ๊ฐ ๋๊น๋๋ค. ์์คํ ์ด ๋ค์ด๋ ๊ฑด ์๋๋๋ค. ์ ์ ๋ฒํผ์ ๋๋ฅด๋ฉด ์ ์ ์ข ๋ฃ ํ๋ก์ธ์ค๊ฐ ๋๊ฑฐ๋ ์. ๋คํธ์ํฌ๋ง ๋ฑ ์ฃฝ๋ ๊ฑฐ์์.
์์ธ์ ์ฐพ๋ ๋ฐ ๊ฝค ์ค๋ ๊ฑธ๋ ธ์ต๋๋ค. K3s CNI ์ถฉ๋? Longhorn I/O ๋ณ๋ชฉ? ๋ฉ๋ชจ๋ฆฌ ์ค๋์ฑ? ์จ๊ฐ ๋ณต์กํ ๊ฐ์ค์ ์ธ์ ๋๋ฐ, ์ ๋ต์ ์ ๋ง ํ๋ฌดํ์ต๋๋ค.
์ด๋๋ท์ ๊ณ ์ IP๋ฅผ ์ ๋ ฅํ์ง๋ง ํ ๋น ๋ฐฉ์์ ‘์๋(Automatic)’์ผ๋ก ๋๋๋ ๊ฒ์ ๋๋ค.
ํ์๋ง ํ๋ธ์๋ DHCP ์๋ฒ๊ฐ ์์ผ๋, NetworkManager๊ฐ 5๋ถ ๋์ DHCP ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ ํ์์์ ์ฒ๋ฆฌ ํ ์ด๋๋ท ์ธํฐํ์ด์ค๋ฅผ ์ค์ค๋ก ๊บผ๋ฒ๋ฆฝ๋๋ค. 300์ด, ๋ฑ 5๋ถ์ ๋๋ค.
# ํด๊ฒฐ: nmtui๋ก IPv4 ํ ๋น ๋ฐฉ์์ ์๋์ผ๋ก ๋ณ๊ฒฝ
sudo nmtui
# IPv4 CONFIGURATION: <Automatic> โ <Manual> ๋ก ๋ณ๊ฒฝ
์ด ์ธ์๋ ์ด ๊ณผ์ ์์ ์ ์ฌ์ ์ํ ์์ธ๋ค์ ์ถ๊ฐ๋ก ๋ฐ๊ฒฌํ๊ณ ์กฐ์นํ์ต๋๋ค.
# K3s๊ฐ Wi-Fi๊ฐ ์๋ ์ด๋๋ท์ผ๋ก๋ง ํต์ ํ๋๋ก ๊ฐ์
# /etc/systemd/system/k3s.service ์คํ ์ต์
์ ์ถ๊ฐ
--flannel-iface=eth0
๐ก ๊ตํ: ํ์๋ง + ์ธ๋ถ๋ง์ด ๊ณต์กดํ๋ ํ๊ฒฝ์์๋ โ ํ์๋ง ์ธํฐํ์ด์ค์ ๊ฒ์ดํธ์จ์ด๋ฅผ ๋น์ฐ๊ณ , โก IPv4๋ฅผ ์์ ํ ์๋(Manual)์ผ๋ก ์ค์ ํ๊ณ , โข ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ ์ธํฐํ์ด์ค๋ฅผ ๋ช ํํ ์ง์ ํด์ผ ํฉ๋๋ค.
๐ฅ Episode 3. Worker ๋ ธ๋๊ฐ ์๋ฑํ IP๋ก ๋ถ์๋ค – ํ ํฐ ์๋ฆผ๊ณผ ์ฌ์ค์น
Worker ๋
ธ๋๋ฅผ ํด๋ฌ์คํฐ์ ์กฐ์ธํ ์ฐจ๋ก์
๋๋ค. kubectl get nodes -o wide๋ก ํ์ธํด๋ณด๋ Worker ๋
ธ๋๋ค์ INTERNAL-IP๊ฐ ์๋ํ๋ 192.168.0.x๊ฐ ์๋ ์๋ฑํ 192.168.219.x ๋์ญ์ผ๋ก ํ์๋ฉ๋๋ค.
IP๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด k3s-agent.service ์ค์ ํ์ผ์ ์ง์ nano ์๋ํฐ๋ก ์์ ํ๋๋ฐ, ์๋น์ค๋ฅผ ์ฌ์์ํ๋ ํ๋ก์ธ์ค๊ฐ ์์ ๋ฉ์ถ๊ณ ๋ฐํ์ด ์ ๋ฉ๋๋ค.
์์ธ์ ๋ ๊ฐ์ง์์ต๋๋ค. ์ฒซ์งธ, ๋ค์ค ๋คํธ์ํฌ ํ๊ฒฝ์์ K3s๊ฐ ์๋์น ์์ ์ธํฐํ์ด์ค๋ฅผ ๊ธฐ๋ณธ ํต์ IP๋ก ์ก์์ต๋๋ค. ๋์งธ, nano๋ก ๊ธด K3s ํ ํฐ์ ๋ณต๋ถํ๋ ๊ณผ์ ์์ ํ ํฐ ๋์ด ์๋ ค๋๊ฐ์ต๋๋ค. ๋ถ์์ ํ ์ธ์ฆ ์ ๋ณด๋ก ๋ง์คํฐ์ ๊ณ์ ์ฐ๊ฒฐ์ ์๋ํ๋ฉฐ ํ๋ก์ธ์ค๊ฐ ๋ฉ์ถฐ๋ฒ๋ฆฐ ๊ฒ์ด์์ต๋๋ค.
ํด๊ฒฐ์ ์ง์ ์์ ์ด ์๋๋ผ ๊ณต์ ์คํฌ๋ฆฝํธ๋ก ๊น๋ํ๊ฒ ์ฌ์ค์นํ๋ ๊ฒ์ด์์ต๋๋ค.
# ๋ง์คํฐ ๋
ธ๋์์ ์จ์ ํ ํ ํฐ ๋ค์ ํ์ธ
cat /var/lib/rancher/k3s/server/node-token
# Worker ๋
ธ๋์์ ๊ณต์ ์คํฌ๋ฆฝํธ๋ก ์ฌ์ค์น + IP ๊ฐ์ ์ฃผ์
curl -sfL https://get.k3s.io | \
K3S_URL=https://192.168.0.10:6443 \
K3S_TOKEN="<์จ์ ํ_ํ ํฐ>" \
INSTALL_K3S_EXEC="--node-ip=192.168.0.11" \
sh -
๐ก ๊ตํ: K3s ์ค์ ์ ๋ณ๊ฒฝํ ๋๋ ์๋น์ค ํ์ผ์ ์ง์ ์์ ํ๋ ๊ฒ๋ณด๋ค ๊ณต์ ์ค์น ์คํฌ๋ฆฝํธ์ ํ๊ฒฝ๋ณ์๋ฅผ ๋๊ฒจ ์ฌ์คํํ๋ ๊ฒ์ด ์คํยทํ ์คํธ ์๋ฆผ ๊ฐ์ ํด๋จผ ์๋ฌ๋ฅผ ๋ฐฉ์งํ๋ ๊ฐ์ฅ ์์ ํ ๋ฐฉ๋ฒ์ ๋๋ค. ์ฌ์ค์นํด๋ ๊ธฐ์กด ํ๋ ๋ฐ์ดํฐ๋ ๋ ์๊ฐ์ง ์์ต๋๋ค.
๐ฅ Episode 4. Longhorn 3-Node HA – “๋ญ๊ณผ ์์ ๋ฌธ์ ”
๋๋์ด Longhorn์ ์ค์นํ ์ฐจ๋ก์ ๋๋ค. Master ๋ ธ๋(RAM 4GB)๋ฅผ AI ํ๋ ๊ฐ์ ๋ฌด๊ฑฐ์ด ์ฐ์ฐ์ผ๋ก๋ถํฐ ๋ณดํธํ๋ฉด์, ๋จ๋ ๋์คํฌ ์์์ Longhorn 3-Node HA ์คํ ๋ฆฌ์ง๋ก ํ์ฉํ๋ ๊ฒ์ด ๋ชฉํ์์ต๋๋ค.
Master ๋
ธ๋์ NoSchedule Taint(์๋ฌผ์ )๋ฅผ ๊ฑธ๊ณ , Longhorn ์์คํ
์๋ง Toleration(๋ง๋ฅ ์ด์ )์ ๋ถ์ฌํ๋ ค ํ์ต๋๋ค. ๊ทธ๋ฐ๋ฐ Longhorn ๋์๋ณด๋์์ Master ๋
ธ๋๊ฐ ๊ณ์ READY: False ์ํ์
๋๋ค.
kubectl describe node master
# โ "manager pod missing: node master has no manager pod running on it"
์์ธ์ “๋ญ๊ณผ ์์ ๋ฌธ์ ”์์ต๋๋ค.
Longhorn ์ ์ญ ์ค์ ์ Toleration์ ํจ์นํ๋ฉด csi-attacher, csi-provisioner ๊ฐ์ ์์ํ ์ปดํฌ๋ํธ๋ค์ ์ด์ ๋ฅผ ๋ฐ๊ณ Master ๋
ธ๋์ ์ ๋ค์ด์ต๋๋ค. ํ์ง๋ง ์ ์ ์ด ์ด์ ๋ค์ ๋ฐ๊ธํ๊ณ ๊ด๋ฆฌํด์ผ ํ longhorn-manager ๋ฐ๋ชฌ์
์์ ์๊ฒ๋ Toleration์ด ๋๋ฝ๋์ด ์์ด์, ๋งค๋์ ํ๋ ์์ฒด๊ฐ Master ๋
ธ๋์ ์์ฑ๋์ง ๋ชปํ๋ ์ํฉ์ด์์ต๋๋ค.
ํด๊ฒฐ: Longhorn Manager ๋ฐ๋ชฌ์ ์ ์ง์ Toleration์ ๊ฐ์ ์ฃผ์ ํฉ๋๋ค.
# 1๋จ๊ณ: ๊ผฌ์ธ Longhorn ๊น๋ํ๊ฒ ์ฌ์ค์น
# (๊ณต์ Uninstall Job์ผ๋ก ์ฐ๊บผ๊ธฐ ์์ ์ ๊ฑฐ ํ ์ฌ์ค์น)
# 2๋จ๊ณ: longhorn-manager ๋ฐ๋ชฌ์
์ ์ง์ ํจ์น
kubectl patch ds longhorn-manager -n longhorn-system -p \
'{"spec":{"template":{"spec":{"tolerations":[{
"key":"node-role.kubernetes.io/master",
"operator":"Equal",
"value":"true",
"effect":"NoSchedule"
}]}}}}'
ํจ์น ์คํ ํ ๋จ 6์ด ๋ง์ Master ๋
ธ๋์ longhorn-manager ํ๋๊ฐ 1/1 Running ์ํ๋ก ์์ฑ๋์ต๋๋ค. ์ธ ๋ ๋
ธ๋ ๋ชจ๋ READY: True๋ก ๋ฐ๋๋ฉด์ ์๋ฒฝํ 3-Node HA ๋ถ์ฐ ์คํ ๋ฆฌ์ง ๊ตฌ์ฑ์ ๋ฌ์ฑํ์ต๋๋ค.
๐ธ ์ด๋ฏธ์ง ์๋ฆฌ: Longhorn ๋์๋ณด๋ โ 3-Node READY:True ์ํ ํ์ธ ํ๋ฉด
โ ์ฌ๊ธฐ๊น์ง์ ์ฑ๊ณผ
Episode 1~4๋ฅผ ๊ฑฐ์น๋ฉฐ ์ด๋ ๊ฒ ๋์ต๋๋ค.
| ํญ๋ชฉ | ์ํ |
|---|---|
| ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด 3๋ SSD ๋ถํ ์์ ํ | โ |
| ํ์๋ง ์ด๋๋ท ๊ณ ์ IP ์ค์ | โ |
| K3s 3-Node ํด๋ฌ์คํฐ ์กฐ์ธ ์๋ฃ | โ |
| Longhorn 3-Node HA ๋ถ์ฐ ์คํ ๋ฆฌ์ง ๊ตฌ์ฑ | โ |
| Master ๋ ธ๋ Control Plane ๊ฒฉ๋ฆฌ (Taint) | โ |
ํ์ง๋ง ์ง์ง ๊ณ ๋์ ๋ค์ ํธ์์ ์์๋ฉ๋๋ค. ์ฌ๋ด๋ง DHCP๊ฐ ํด๋ฌ์คํฐ ๋ ธ๋์ IP ์ถฉ๋์ ์ผ์ผํค๋ฉด์ MetalLB ์ค์น๊ฐ ํด๋ฌ์คํฐ ์ ์ฒด๋ฅผ ๋ฌด๋๋จ๋ฆฌ๋ ์ฌ๊ฑด์ด ๊ธฐ๋ค๋ฆฌ๊ณ ์์๊ฑฐ๋ ์.
๐ ๋ค์ ํธ: 3ํธ โ ์ฌ๋ด๋ง DHCP ์ถฉ๋๊ณผ K3s ์ ๋ฉด ์ฌ๊ตฌ์ถ + GitOps ํ์ดํ๋ผ์ธ ์์ฑ ๐ ์ ์ฒด ํธ๋ฌ๋ธ์ํ ๋ก๊ทธ: GitHub Wiki โ Troubleshooting & Operations Log