[ํ”„๋กœ์ ํŠธ 3]๐ŸŒ ์‚ฌ๋‚ด๋ง DHCP๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ฃฝ์˜€๋‹ค – K3s ์ „๋ฉด ์žฌ๊ตฌ์ถ•๊ณผ GitOps ์™„์„ฑ๊ธฐ

2ํŽธ์—์„œ K3s ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฒจ์šฐ ์˜ฌ๋ ธ๋‹ค๊ณ  ํ–ˆ์ฃ . ์ด๋ฒˆ ํŽธ์€ ๊ทธ๊ฑธ ์ „๋ถ€ ๋‹ค ๋‚ ๋ฆฌ๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋งŒ๋“  ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค. MetalLB ์„ค์น˜ ํ•˜๋‚˜๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด๋ฅผ ๋ฌด๋„ˆ๋œจ๋ ธ๊ณ , ์›์ธ์„ ํŒŒ๊ณ ๋“ค๋‹ค๊ฐ€ ์‚ฌ๋‚ด๋ง DHCP์™€ ๋…ธ๋“œ IP๊ฐ€ ์ถฉ๋Œํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋Š” ๊ฑธ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์‚ฝ์งˆ์„ ํ†ตํ•ด ๊ฒฐ๊ตญ ํ›จ์”ฌ ๊ฒฌ๊ณ ํ•œ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์™„์„ฑ๋๊ณ , ๊ทธ ์œ„์— GitOps ํŒŒ์ดํ”„๋ผ์ธ๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ”์Šต๋‹ˆ๋‹ค.

๐Ÿ”— DevOps ์œ„ํ‚ค ์ƒ์„ธ ๋ฌธ์„œ: GitHub Wiki โ€” DevOps | GitOps ์‹ค์ฆ


๐Ÿ’ฅ Episode 5. MetalLB ์„ค์น˜๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ํ†ต์งธ๋กœ ๋ฌด๋„ˆ๋œจ๋ ธ๋‹ค

LoadBalancer ํƒ€์ž… ์„œ๋น„์Šค์— ์™ธ๋ถ€ IP๋ฅผ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด MetalLB v0.14.3์„ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํŒŒ๋“œ๋“ค์ด 7๋ถ„ ๋„˜๊ฒŒ ContainerCreating์—์„œ ๊ผผ์ง์„ ์•ˆ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์”ฉ ์ฆ์ƒ์ด ํ„ฐ์ง€๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฐ์‡„ ์ฆ์ƒ๋“ค:

  • speaker ํŒŒ๋“œ์—์„œ secret "memberlist" not found ๋ฐ˜๋ณต
  • ํŠน์ • Worker ๋…ธ๋“œ์—์„œ๋งŒ ErrImagePull (๋‹ค๋ฅธ ๋…ธ๋“œ๋Š” Running)
  • controller ํŒŒ๋“œ CrashLoopBackOff โ†’ ๋กœ๊ทธ: dial tcp 10.43.0.1:443: connect: no route to host
  • kubectl delete namespace metallb-system ํ›„ 20๋ถ„ ๋„˜๊ฒŒ Terminating ๊ณ ์ฐฉ
  • Master โ†’ Worker ๊ฐ„ ping์ด 137ms โ†’ 959ms โ†’ 128ms โ†’ 959ms ํŒจํ„ด์œผ๋กœ ์ฃผ๊ธฐ์ ์œผ๋กœ 1์ดˆ ์ด์ƒ ํА

์ฒ˜์Œ์—” MetalLB ์„ค์ • ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์•„๋ฌด๋ฆฌ ๋“ค์—ฌ๋‹ค๋ด๋„ ์ด์ƒ์ด ์—†์–ด์š”. IP ์ถฉ๋Œ์„ ์šฐํšŒํ•˜๋ ค๊ณ  ์Šค๋งˆํŠธํฐ ํ•ซ์ŠคํŒŸ์œผ๋กœ ๋„คํŠธ์›Œํฌ๋ฅผ ์ „ํ™˜ํ–ˆ๋”๋‹ˆ ์ด๋ฒˆ์—” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ ํ†ต์‹ ์ด ์™„์ „ํžˆ ๋‹จ์ ˆ๋ฉ๋‹ˆ๋‹ค.

์›์ธ์€ ๋‹จ์ผ ์›์ธ์ด ์•„๋‹Œ 3๊ฐœ ๋ ˆ์ด์–ด์˜ ๋ณตํ•ฉ ์žฅ์• ์˜€์Šต๋‹ˆ๋‹ค.

๋ ˆ์ด์–ด๋ฌธ์ œ์˜ํ–ฅ
๋„คํŠธ์›Œํฌ์‚ฌ๋‚ด๋ง DHCP์™€ ๋…ธ๋“œ ๊ณ ์ • IP ์ถฉ๋Œping ์ง€์—ฐ, ์ด๋ฏธ์ง€ pull ์‹คํŒจ
K3s ์„ค์น˜--disable servicelb ๋ˆ„๋ฝKlipper LB โ†” MetalLB ์ถฉ๋Œ
์ž„์‹œ ์กฐ์น˜ํ•ซ์ŠคํŒŸ ์ „ํ™˜ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ ๋ผ์šฐํŒ… ์†Œ์‹ค

ํ•ต์‹ฌ ์›์ธ: ๋…ธ๋“œ์— ๊ณ ์ • IP(192.168.0.10~12)๋ฅผ ์„ค์ •ํ–ˆ์ง€๋งŒ, ์‚ฌ๋‚ด๋ง ๊ณต์œ ๊ธฐ DHCP ๋ฒ”์œ„๊ฐ€ 192.168.0.2~254 ์ „์ฒด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ณต์œ ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ๊ธฐ๊ธฐ(์Šค๋งˆํŠธํฐ, ๋…ธํŠธ๋ถ)์— ๊ฐ™์€ IP๋ฅผ ๋ฐฐํฌํ•˜๋ฉด์„œ ARP Storm์ด ๋ฐœ์ƒํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณต์œ ๊ธฐ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์ด ์—†์–ด์„œ DHCP ๋ฒ”์œ„๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜๋„ ์—†์—ˆ์–ด์š”.


๐Ÿ”จ ํ•ด๊ฒฐ: ๋…๋ฆฝ ๋Œ€์—ญ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ ์ „๋ฉด ์žฌ๊ตฌ์ถ•

์‚ฌ๋‚ด๋ง DHCP๊ฐ€ ์ ˆ๋Œ€ ์นจ๋ฒ”ํ•  ์ˆ˜ ์—†๋Š” 10.10.10.x/24 ๋Œ€์—ญ์„ ํด๋Ÿฌ์Šคํ„ฐ ์ „์šฉ ๋„คํŠธ์›Œํฌ๋กœ ์ง€์ •ํ•˜๊ณ , K3s๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

Step 1. ๊ธฐ์กด K3s ์™„์ „ ์ฒ ๊ฑฐ

# Master ๋…ธ๋“œ
/usr/local/bin/k3s-uninstall.sh

# Worker ๋…ธ๋“œ 1, 2
/usr/local/bin/k3s-agent-uninstall.sh

Step 2. nmtui๋กœ ์ด๋”๋„ท IP๋ฅผ ๋…๋ฆฝ ๋Œ€์—ญ์œผ๋กœ ๋ณ€๊ฒฝ

์—ญํ• ์ธํ„ฐํŽ˜์ด์Šค์‹ ๊ทœ IP
Mastereth010.10.10.10/24
Worker 1eth010.10.10.11/24
Worker 2eth010.10.10.12/24
MetalLB Poolโ€”10.10.10.200~220

โš ๏ธ Gateway ์นธ์€ ๋ฐ˜๋“œ์‹œ ๊ณต๋ž€์œผ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์„ ์ž…๋ ฅํ•˜๋ฉด Wi-Fi ์ธํ„ฐ๋„ท ๋ผ์šฐํŒ…๊ณผ ์ถฉ๋Œํ•ด ์ด๋ฏธ์ง€ pull์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

Step 3. K3s ์žฌ์„ค์น˜ โ€” ๋ง ๋ถ„๋ฆฌ ์˜ต์…˜ + Klipper ๋น„ํ™œ์„ฑํ™”

# Master ๋…ธ๋“œ
curl -sfL https://get.k3s.io | sh -s - \
  --node-ip 10.10.10.10 \
  --flannel-iface eth0 \
  --disable servicelb      # โ† Klipper LB ๋น„ํ™œ์„ฑํ™” (MetalLB์™€ ์ถฉ๋Œ ๋ฐฉ์ง€)

# Worker 1
curl -sfL https://get.k3s.io | \
  K3S_URL=https://10.10.10.10:6443 \
  K3S_TOKEN=<TOKEN> \
  sh -s - \
  --node-ip 10.10.10.11 \
  --flannel-iface eth0
[์ตœ์ข… ๋„คํŠธ์›Œํฌ ์•„ํ‚คํ…์ฒ˜]

์ด๋”๋„ท eth0 โ†’ 10.10.10.x (ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ ํ†ต์‹  ์ „์šฉ)
               โ”œโ”€โ”€ Master:  10.10.10.10
               โ”œโ”€โ”€ Worker1: 10.10.10.11
               โ””โ”€โ”€ Worker2: 10.10.10.12

Wi-Fi wlan0  โ†’ ์‚ฌ๋‚ด๋ง 192.168.0.x (์ธํ„ฐ๋„ท / ์ด๋ฏธ์ง€ pull ์ „์šฉ)

๐Ÿ’ก ๊ตํ›ˆ: ๋ฒ ์–ด๋ฉ”ํƒˆ ํด๋Ÿฌ์Šคํ„ฐ๋Š” ์„ค์น˜ ์ „์— ๋„คํŠธ์›Œํฌ ๊ตฌ์กฐ๋ฅผ ๋จผ์ € ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ IP ๋Œ€์—ญ, DHCP ์ถฉ๋Œ ์—ฌ๋ถ€, CNI ์ธํ„ฐํŽ˜์ด์Šค, LB IP ํ’€ ๋ฒ”์œ„๋ฅผ ํ™•์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์„ค์น˜ ์ค‘ ๋„คํŠธ์›Œํฌ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์œผ๋กœ ์‹œ๊ฐ„์„ ๋Œ€๋ถ€๋ถ„ ์†Œ๋ชจํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ’ฅ Episode 6. Ingress ์„ค์ • โ€” StripPrefix๋ฅผ ๋นผ๋จน์œผ๋ฉด ํฐ ํ™”๋ฉด๋งŒ ๋‚˜์˜จ๋‹ค

ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์žฌ๊ตฌ์ถ•ํ•˜๊ณ  MetalLB๋กœ ๋‹จ์ผ ๋Œ€ํ‘œ IP(10.10.10.200)๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ด์ œ /longhorn, /dashboard ๊ฒฝ๋กœ๋กœ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๋ฅผ ๋ฌถ์–ด์„œ ์ ‘๊ทผํ•˜๋ ค ํ–ˆ๋Š”๋ฐ, http://10.10.10.200/longhorn ์ ‘์† ์‹œ HTML์€ ์ˆ˜์‹ ๋˜๋Š”๋ฐ CSS, JS๊ฐ€ ๋กœ๋“œ๋˜์ง€ ์•Š์•„ ํฐ ํ™”๋ฉด๋งŒ ๋œน๋‹ˆ๋‹ค.

์›์ธ: Longhorn์„ ๋น„๋กฏํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์˜คํ”ˆ์†Œ์Šค ์›น ์•ฑ์€ ์ž์‹ ์ด ๋ฃจํŠธ ๊ฒฝ๋กœ(/)์—์„œ ๋™์ž‘ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€ ๊ฒฝ๋กœ๋ฅผ /longhorn์œผ๋กœ ์ง€์ •ํ•˜๋ฉด ์•ฑ ๋‚ด๋ถ€์˜ ์ •์  ํŒŒ์ผ ๊ฒฝ๋กœ(/static/logo.png)์™€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‹ค์ œ ์š”์ฒญํ•˜๋Š” ๊ฒฝ๋กœ(10.10.10.200/static/logo.png) ์‚ฌ์ด์— ๋ถˆ์ผ์น˜๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ: StripPrefix ๋ฏธ๋“ค์›จ์–ด๋กœ ๊ฒฝ๋กœ๋ฅผ ๋ฒ—๊ฒจ๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

# longhorn-route.yaml
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: longhorn-stripprefix
  namespace: longhorn-system
spec:
  stripPrefix:
    prefixes:
      - /longhorn
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: longhorn-ingress
  namespace: longhorn-system
  annotations:
    traefik.ingress.kubernetes.io/router.middlewares: longhorn-system-longhorn-stripprefix@kubernetescrd
spec:
  rules:
  - http:
      paths:
      - path: /longhorn
        pathType: Prefix
        backend:
          service:
            name: longhorn-frontend
            port:
              number: 80

Traefik ๋‚ด๋ถ€ ๋Œ€์‹œ๋ณด๋“œ(api@internal)๋Š” ์ผ๋ฐ˜ Ingress๊ฐ€ ์•„๋‹Œ IngressRoute๋ฅผ ์จ์•ผ ํ•˜๊ณ , /dashboard์™€ /api ๋‘ ๊ฒฝ๋กœ๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•ด์•ผ 404๊ฐ€ ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ๊ตํ›ˆ: ํ•˜์œ„ ๊ฒฝ๋กœ์— ์„œ๋น„์Šค๋ฅผ ๋ฐฐ์น˜ํ•  ๋•Œ๋Š” StripPrefix๊ฐ€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  URL ๋์— /๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ถ™์—ฌ์•ผ ์ƒ๋Œ€ ๊ฒฝ๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


๐Ÿ’ฅ Episode 7~9. ArgoCD โ€” GitLab ์—ฐ๋™ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… 3์—ฐ์†

ํด๋Ÿฌ์Šคํ„ฐ ์œ„์— ArgoCD๋ฅผ ์˜ฌ๋ฆฌ๊ณ  GitLab๊ณผ ์—ฐ๋™ํ•˜๋ ค ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—๋Ÿฌ๊ฐ€ ์„ธ ๋ฒˆ ๋ฐ”๋€Œ๋ฉด์„œ ์—ฐ๋‹ฌ์•„ ํ„ฐ์กŒ์Šต๋‹ˆ๋‹ค.

1์ฐจ ์—๋Ÿฌ: argocd-repo-server๊ฐ€ Completed ์ƒํƒœ

connection error: dial tcp 10.43.31.222:8081: connect: connection refused

ํŒŒ๋“œ๊ฐ€ Running์ด ์•„๋‹Œ Completed๋กœ ์ข…๋ฃŒ๋œ ์ƒํƒœ์˜€์Šต๋‹ˆ๋‹ค. ๋งˆ์น˜ GitLab ์—ฐ๊ฒฐ ์—๋Ÿฌ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‚ฌ์‹ค์€ ArgoCD ๋‚ด๋ถ€ ํŒŒ๋“œ ์ƒํƒœ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.

# ํ•ด๊ฒฐ: repo-server ์žฌ์‹œ์ž‘
kubectl rollout restart deployment/argocd-repo-server -n argocd

2์ฐจ ์—๋Ÿฌ: applicationset-controller CrashLoopBackOff

no matches for kind "ApplicationSet" in version "argoproj.io/v1alpha1"

ArgoCD v3.3.2๊ฐ€ ์„ค์น˜๋์ง€๋งŒ applicationsets.argoproj.io CRD๊ฐ€ ๋ˆ„๋ฝ๋œ ์ƒํƒœ์˜€์Šต๋‹ˆ๋‹ค.

kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.13.2/manifests/crds/applicationset-crd.yaml

3์ฐจ ์—๋Ÿฌ: remote repository is empty

unable to ls-remote HEAD: failed to list refs: remote repository is empty

GitLab ์ €์žฅ์†Œ๋ฅผ README ์—†์ด ์™„์ „ํžˆ ๋นˆ ์ƒํƒœ๋กœ ์ƒ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ArgoCD๋Š” ๋นˆ ์ €์žฅ์†Œ๋ฅผ ์—ฐ๊ฒฐ ์„ฑ๊ณต์œผ๋กœ ์ธ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ดํ›„ deployment.yaml์„ pushํ•˜๋ฉด์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ด๊ฒฐ๋์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ๊ตํ›ˆ: ArgoCD ์—ฐ๊ฒฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋„คํŠธ์›Œํฌ๋ณด๋‹ค ํŒŒ๋“œ ์ƒํƒœ๋ถ€ํ„ฐ ๋จผ์ € ํ™•์ธํ•˜๋Š” ์Šต๊ด€์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. kubectl get pods -n argocd ํ•œ ์ค„์ด ๋งŽ์€ ๊ฒƒ์„ ์„ค๋ช…ํ•ด ์ค๋‹ˆ๋‹ค.


๐Ÿš€ GitOps ํŒŒ์ดํ”„๋ผ์ธ ์™„์„ฑ โ€” git push ํ•œ ๋ฒˆ์œผ๋กœ 3-Node ๋ฐฐํฌ

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์„ ๋ชจ๋‘ ํ•ด๊ฒฐํ•˜๊ณ  ๋‚˜์„œ, ๋“œ๋””์–ด ์›ํ•˜๋˜ GitOps ํŒŒ์ดํ”„๋ผ์ธ์ด ์™„์„ฑ๋์Šต๋‹ˆ๋‹ค.

โ‘  ์ฝ”๋“œ ์ˆ˜์ • (๋กœ์ปฌ WSL)
     โ”‚ git push
     โ–ผ
โ‘ก GitLab (10.10.10.100) โ€” ํ์‡„๋ง ์ž์ฒด ํ˜ธ์ŠคํŒ…
     โ”‚ 3๋ถ„๋งˆ๋‹ค ํด๋ง
     โ–ผ
โ‘ข ArgoCD (10.10.10.201) โ€” ๋ณ€๊ฒฝ ๊ฐ์ง€
     โ”‚ Helm ๋ Œ๋”๋ง ํ›„ Auto Sync
     โ–ผ
โ‘ฃ K3s 3-Node ํด๋Ÿฌ์Šคํ„ฐ ์ž๋™ ๋ฐฐํฌ ์™„๋ฃŒ โœ…

ํ์‡„๋ง์—์„œ GitLab์„ ์ง์ ‘ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ์ด์œ : ์ธํ„ฐ๋„ท์ด ์ฐจ๋‹จ๋œ ์‚ฐ์—… ํ˜„์žฅ์—์„œ GitHub์„ ์‚ฌ์šฉํ•˜๋ฉด ArgoCD๊ฐ€ ์ €์žฅ์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Host PC์˜ Docker์— GitLab ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์˜ฌ๋ ค์„œ ์ธํ„ฐ๋„ท ์—†์ด GitOps ํŒŒ์ดํ”„๋ผ์ธ์„ ์™„๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

Helm Chart๋กœ ์„ค์ •์„ ์ฝ”๋“œ๋กœ ๊ด€๋ฆฌ

AI ํŒŒ๋“œ๋“ค์€ Helm Chart๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. values.yaml ํ•œ ์ค„๋งŒ ๋ฐ”๊พธ๋ฉด ์ด๋ฏธ์ง€ ํƒœ๊ทธ, replicas, Failover ๊ฐ์ง€ ์‹œ๊ฐ„์ด ์ž๋™์œผ๋กœ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

# ai-apps/values.yaml
integratedAi:
  image: "minsoo0919/safe-edge-integrated-ai:v7"
  replicas: 1
  tolerationSeconds: 30   # โ† ์ด ์ˆซ์ž ํ•˜๋‚˜๊ฐ€ Failover ๊ฐ์ง€ ์‹œ๊ฐ„์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค

audio:
  image: "minsoo0919/safe-edge-audio:v3"
  replicas: 1
์‹œ๋‚˜๋ฆฌ์˜ค๋ณ€๊ฒฝ ํ•ญ๋ชฉํšจ๊ณผ
์ด๋ฏธ์ง€ ์—…๋ฐ์ดํŠธimage: v7 โ†’ v8AI ํŒŒ๋“œ ์ž๋™ ์žฌ๋ฐฐํฌ
๊ธด๊ธ‰ ์Šค์ผ€์ผ ์•„์›ƒreplicas: 1 โ†’ 2ํŒŒ๋“œ ์ฆ‰์‹œ 2๊ฐœ๋กœ ์ฆ๊ฐ€
Failover ์‹œ๊ฐ„ ๋‹จ์ถ•tolerationSeconds: 30 โ†’ 15๋” ๋น ๋ฅธ ์žฅ์•  ๊ฐ์ง€
ArgoCD Sync ์™„๋ฃŒ โ€” Healthy/Synced ์ƒํƒœ

safe-edge-config ์ €์žฅ์†Œ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ


โœ… 2ํŽธ~3ํŽธ์„ ๊ฑฐ์นœ ์ตœ์ข… ์ธํ”„๋ผ ์ƒํƒœ

๊ตฌ์„ฑ ์š”์†Œ์ƒํƒœ
K3s 3-Node ํด๋Ÿฌ์Šคํ„ฐ (10.10.10.x ๋…๋ฆฝ๋ง)โœ…
MetalLB โ€” VIP 10.10.10.200~220 ํ• ๋‹นโœ…
Traefik Ingress + StripPrefix ๋ฏธ๋“ค์›จ์–ดโœ…
Longhorn ๋Œ€์‹œ๋ณด๋“œ /longhorn ์ ‘๊ทผโœ…
GitLab ์ž์ฒด ํ˜ธ์ŠคํŒ… (Host PC Docker)โœ…
ArgoCD Auto Sync + Helm Chart ์—ฐ๋™โœ…
git push โ†’ 3-Node ์ž๋™ ๋ฐฐํฌโœ…

์ด์ œ ์ธํ”„๋ผ๊ฐ€ ์•ˆ์ •๋์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ด ์œ„์— Edge AI๋ฅผ ์˜ฌ๋ฆฌ๋Š” ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ์นด๋ฉ”๋ผ ์ธ์‹์ด v7๊นŒ์ง€ ๊ฐ€๋Š” ์—ฌ์ •์„ ๊ธฐ๋‹ค๋ ค์ฃผ์„ธ์š”.

๐Ÿ”— GitOps ์‹ค์ฆ ์ƒ์„ธ: GitHub Wiki โ€” Proof CI ๐Ÿ”— ๋‹ค์Œ ํŽธ: 4ํŽธ โ€” Edge AI: YOLOv8 ์นด๋ฉ”๋ผ ์ธ์‹์ด v7๊นŒ์ง€ ๊ฑธ๋ฆฐ ์ด์œ