ORCHESTRATION_K8S_DEPLOYMENT - zero1ne-26/doc GitHub Wiki

์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์„œ๋ฒ„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฐฐํฌ (๋‹จ์ผ ๋…ธ๋“œ / NodePort)

orchestration-server ํ”„๋กœ์ ํŠธ(docker-compose.yml ๊ตฌ์„ฑ)๋ฅผ ๋‹จ์ผ ์„œ๋ฒ„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์— ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์„ธํŠธ์™€ ๋ฐฐํฌ ์ ˆ์ฐจ. ๋ชจ๋“  ์˜์กด ์„œ๋น„์Šค(MQTT ๋ธŒ๋กœ์ปค, S3 ๋ชฉ)๋ฅผ ๊ฐ™์€ ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์— ๋„์šฐ๊ณ , ์™ธ๋ถ€ ์ง„์ž…์€ NodePort๋กœ ๋…ธ์ถœํ•œ๋‹ค.

๋งค๋‹ˆํŽ˜์ŠคํŠธ ์›๋ณธ: orchestration-server/deploy/k8s/


1. ์šฉ์–ด ์ •๋ฆฌ

  • ๋ฐฐํฌ์šฉ YAML ํŒŒ์ผ = ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋งค๋‹ˆํŽ˜์ŠคํŠธ(manifest)
  • docker-compose โ†’ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์ „ํ™˜ = "์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜"
  • ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๋ณ€์ˆ˜ํ™”ํ•ด ํŒจํ‚ค์ง•ํ•œ ๊ฒƒ = Helm ์ฐจํŠธ (์„ ํƒ, 8์ ˆ ์ฐธ๊ณ )

2. ์•„ํ‚คํ…์ฒ˜

ํŠธ๋ž˜ํ”ฝ ํ๋ฆ„:

์™ธ๋ถ€ ๋ธŒ๋ผ์šฐ์ €
   โ”‚  http://<์„œ๋ฒ„IP>:30090
   โ–ผ
nginx (NodePort 30090)   โ† ์œ ์ผํ•œ ์™ธ๋ถ€ ์ง„์ž…์ 
   โ”œโ”€โ”€ /api, /health, /docs, /admin, /ws/ ... โ†’ orchestration-server:8080
   โ”œโ”€โ”€ /mqtt-ws                              โ†’ mosquitto:9001 (websocket)
   โ”œโ”€โ”€ /s3/                                  โ†’ ministack:4566
   โ””โ”€โ”€ /  (๊ทธ ์™ธ)                            โ†’ backoffice:80
  • ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋Š” orchestration ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ƒ์„ฑ.
  • ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์€ Service ์ด๋ฆ„(DNS) ์œผ๋กœ ์—ฐ๊ฒฐ (nginx.conf์˜ upstream ์ด๋ฆ„๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜).

3. ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์„ธํŠธ

orchestration-server/deploy/k8s/ โ€” ํŒŒ์ผ๋ช… ์•ž ๋ฒˆํ˜ธ ์ˆœ์„œ๋Œ€๋กœ ์ ์šฉ๋œ๋‹ค.

ํŒŒ์ผ ๋ฆฌ์†Œ์Šค ์—ญํ• 
00-namespace.yaml Namespace orchestration ๋„ค์ž„์ŠคํŽ˜์ด์Šค
10-configmap.yaml ConfigMap ์„œ๋ฒ„ ์ผ๋ฐ˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜
11-secret.yaml Secret API ํ‚คยท๋น„๋ฒˆ (์‹ค๊ฐ’์œผ๋กœ ์ฑ„์›Œ์•ผ ํ•จ)
20-mosquitto.yaml ConfigMap/PVC/Deployment/Service MQTT ๋ธŒ๋กœ์ปค (1883, 9001)
21-ministack.yaml PVC/Deployment/Service S3 ๋ชฉ ์„œ๋ฒ„ (4566)
30-server.yaml PVC/Deployment/Service Go API ์„œ๋ฒ„ (8080, SQLite)
40-backoffice.yaml Deployment/Service ์ •์  ํ”„๋ก ํŠธ (80)
50-nginx.yaml ConfigMap/Deployment/Service ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ + ์™ธ๋ถ€ ์ง„์ž…์  NodePort 30090

4. docker-compose โ†’ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋งคํ•‘

docker-compose ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋น„๊ณ 
services: ๊ฐ ์ปจํ…Œ์ด๋„ˆ Deployment ์‹คํ–‰ ๋‹จ์œ„
ports / expose Service ๋‚ด๋ถ€/์™ธ๋ถ€ ์ ‘๊ทผ
environment: (์ผ๋ฐ˜ ๊ฐ’) ConfigMap APP_PORT, S3_ENDPOINT ๋“ฑ
environment: (๋น„๋ฐ€ ๊ฐ’) Secret LLM_API_KEY, MQTT_PASSWORD, S3_SECRET_KEY, STT_API_KEY
volumes: (๋ฐ์ดํ„ฐ ์˜์†) PVC /data(SQLiteยท๋กœ๊ทธ), mosquitto/ministack ๋ฐ์ดํ„ฐ
./nginx.conf:...:ro ConfigMap โ†’ volumeMount ์„ค์ • ํŒŒ์ผ ๋งˆ์šดํŠธ
host.docker.internal:9001 mosquitto:9001 ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ Service ์ฐธ์กฐ๋กœ ๊ต์ •
์™ธ๋ถ€ ๋…ธ์ถœ(nginx) NodePort Service (30090)

5. ๋ฐฐํฌ ์ „ ํ•„์ˆ˜ ์ž‘์—…

5.1 ๋กœ์ปฌ ์ด๋ฏธ์ง€๋ฅผ ๋…ธ๋“œ์— ๋กœ๋“œ (๊ฐ€์žฅ ์ค‘์š”)

orchestration-server:local / orchestration-backoffice:local ์€ ๋กœ์ปฌ ๋นŒ๋“œ ์ด๋ฏธ์ง€๋ผ ๋…ธ๋“œ๊ฐ€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์—†๋‹ค. ๋…ธ๋“œ์— ์ง์ ‘ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค. ์•ˆ ํ•˜๋ฉด ImagePullBackOff.

# ๋นŒ๋“œ
docker build -t orchestration-server:local .
docker build -t orchestration-backoffice:local ./backoffice

# ๋…ธ๋“œ์— ๋กœ๋“œ (ํด๋Ÿฌ์Šคํ„ฐ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ํƒ1)
# k3s (containerd)
docker save orchestration-server:local | sudo k3s ctr images import -
docker save orchestration-backoffice:local | sudo k3s ctr images import -
# kind
kind load docker-image orchestration-server:local orchestration-backoffice:local
# minikube
minikube image load orchestration-server:local orchestration-backoffice:local

๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” imagePullPolicy: IfNotPresent ๋ผ ๋…ธ๋“œ์— ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์œผ๋ฉด pull์„ ์‹œ๋„ํ•˜์ง€ ์•Š๋Š”๋‹ค.

5.2 Secret ์‹ค๊ฐ’ ์ฑ„์šฐ๊ธฐ

11-secret.yaml ์˜ ๊ฐ’๋“ค์„ ์‹ค์ œ ๊ฐ’์œผ๋กœ. git์— ์‹ค๊ฐ’์„ ๋‚จ๊ธฐ๊ธฐ ์‹ซ์œผ๋ฉด ๋ช…๋ น์œผ๋กœ ์ƒ์„ฑ:

kubectl create secret generic orchestration-secret -n orchestration \
  --from-literal=LLM_API_KEY=... --from-literal=STT_API_KEY=... \
  --from-literal=S3_ACCESS_KEY=minioadmin --from-literal=S3_SECRET_KEY=minioadmin \
  --from-literal=MQTT_USERNAME= --from-literal=MQTT_PASSWORD=

5.3 ์™ธ๋ถ€ ์ ‘๊ทผ URL ์ˆ˜์ •

10-configmap.yaml ์˜ S3_PUBLIC_BASE_URL ์˜ <์„œ๋ฒ„IP> ๋ฅผ ์‹ค์ œ ๋…ธ๋“œ IP๋กœ. (์˜ˆ: http://192.168.0.10:30090/s3/persona-images)


6. ๋ฐฐํฌ & ํ™•์ธ

kubectl apply -f deploy/k8s/

kubectl get all -n orchestration
kubectl get pvc -n orchestration
kubectl logs -n orchestration deploy/orchestration-server -f

์ ‘์†: http://<์„œ๋ฒ„IP>:30090


7. ์ฃผ์˜์‚ฌํ•ญ

  • SQLite = ์ƒํƒœ(state) ์žˆ์Œ: orchestration-server ๋Š” DATABASE_PATH=/data/orchestration.db ํŒŒ์ผ DB๋ฅผ ์“ด๋‹ค.
    • replicas: 1 ๊ณ ์ • โ€” 2๊ฐœ ์ด์ƒ ๋Š˜๋ฆฌ๋ฉด ํŒŒ์ผ ๋ฝ ์ถฉ๋Œ. strategy: Recreate ์‚ฌ์šฉ.
    • PVC(ReadWriteOnce)๋กœ ์˜์†ํ™” โ€” ์—†์œผ๋ฉด ํŒŒ๋“œ ์žฌ์‹œ์ž‘ ์‹œ ๋ฐ์ดํ„ฐ ์†Œ์‹ค.
    • ์Šค์ผ€์ผ์•„์›ƒ์ด ํ•„์š”ํ•ด์ง€๋ฉด SQLite โ†’ PostgreSQL ๋“ฑ ์™ธ๋ถ€ DB๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.
  • ministack(S3 ๋ชฉ) ์€ ๊ฐœ๋ฐœ/PoC ์šฉ. ์šด์˜ ์ „ํ™˜ ์‹œ ์‹ค์ œ S3 ๋˜๋Š” MinIO๋กœ ๊ต์ฒดํ•˜๊ณ  S3_ENDPOINT/Secret ์„ ๋งž๊ฒŒ ์ˆ˜์ •.
  • PVC: ํด๋Ÿฌ์Šคํ„ฐ์— ๊ธฐ๋ณธ StorageClass ํ•„์š”. ํ™•์ธ kubectl get storageclass (k3s๋Š” local-path ๊ธฐ๋ณธ ์ œ๊ณต).
  • ๋ฐฉํ™”๋ฒฝ: ๋…ธ๋“œ์˜ 30090 ์ธ๋ฐ”์šด๋“œ ํ—ˆ์šฉ ํ•„์š”.

8. Helm ์ „ํ™˜ (์„ ํƒ)

์žฌ๋ฐฐํฌ๊ฐ€ ์žฆ๊ฑฐ๋‚˜ dev/prod ํ™˜๊ฒฝ์„ ๋‚˜๋ˆŒ ๊ฑฐ๋ฉด Helm ์ฐจํŠธ๋กœ ๊ฐ์‹ธ๋Š” ๊ฒŒ ์ด๋“์ด๋‹ค.

raw ๋งค๋‹ˆํŽ˜์ŠคํŠธ Helm ์ฐจํŠธ
๋ฐฐํฌ kubectl apply -f deploy/k8s/ helm install orchestration ./chart
๊ฐ’ ๋ณ€๊ฒฝ ๊ฐ yaml ์ง์ ‘ ํŽธ์ง‘ values.yaml ํ•œ ๊ณณ / --set
์—…๊ทธ๋ ˆ์ด๋“œยท๋กค๋ฐฑ ์ˆ˜๋™ helm upgrade / helm rollback
ํ™˜๊ฒฝ๋ณ„ ๊ฐ’ ํŒŒ์ผ ๋ณต์‚ฌ -f values-prod.yaml
์ „์ฒด ์‚ญ์ œ ๋ฆฌ์†Œ์Šค ๊ฐœ๋ณ„ helm uninstall orchestration

values.yaml๋กœ ๋บ„ ๋งŒํ•œ ๊ฐ’: ๋…ธ๋“œ IPยทNodePort, ์ด๋ฏธ์ง€ ํƒœ๊ทธ, replicaยท๋ฆฌ์†Œ์Šค, Secret, ministack.enabled/mosquitto.enabled ํ† ๊ธ€(์™ธ๋ถ€ S3ยท๋ธŒ๋กœ์ปค ์ „ํ™˜ ๋Œ€๋น„).

ํ•œ ๋ฒˆ ์˜ฌ๋ ค๋‘๊ณ  ๊ฑฐ์˜ ์•ˆ ๊ฑด๋“œ๋ฆด ๊ฑฐ๋ฉด raw ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ