์ด ๊ธ€์—์„œ ๋‹ค๋ฃจ๋Š” ๊ฒƒ

์—ฌ๋Ÿฌ ์„œ๋น„์Šค๋ฅผ ํ•˜๋‚˜์˜ ์ง„์ž…์ ์—์„œ ๊ฒฝ๋กœ(Path) ๊ธฐ๋ฐ˜์œผ๋กœ ๋ผ์šฐํŒ…ํ•˜๋Š” Ingress ๋ฆฌ์†Œ์Šค์™€ Nginx Ingress Controller๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

์„ ์ˆ˜์ง€์‹


์ด ๋‹จ๊ณ„์—์„œ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ

Service๋งˆ๋‹ค NodePort๋ฅผ ์—ด๋ฉด ํฌํŠธ ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ , ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Ingress๋Š” ๋‹จ์ผ ์ง„์ž…์ ์—์„œ HTTP ์š”์ฒญ์„ ๊ฒฝ๋กœ๋‚˜ ํ˜ธ์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚ด๋ถ€ ์„œ๋น„์Šค์— ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค. ์‹ค๋ฌด์—์„œ MLflow, Jupyter, API ์„œ๋ฒ„๋ฅผ ํ•˜๋‚˜์˜ ๋„๋ฉ”์ธ ์•„๋ž˜ ๊ฒฝ๋กœ๋กœ ๋ถ„๋ฆฌํ•  ๋•Œ ํ•„์ˆ˜์ ์ธ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

์‹ค์Šต ์ฝ”๋“œ: GitHub (Ingress_and_Nginx_Controller)


๐Ÿงญ ์ „์ฒด ํ๋ฆ„ ์š”์•ฝ

โ‘  Ingress Controller ์„ค์น˜ (minikube addons ์‚ฌ์šฉ)
โ‘ก nginx / httpd ์„œ๋น„์Šค ๋ฐฐํฌ
โ‘ข Ingress ๋ฆฌ์†Œ์Šค๋กœ ๊ฒฝ๋กœ ๋ผ์šฐํŒ… ์„ค์ •
โ‘ฃ /etc/hosts ์ˆ˜์ • โ†’ curl ํ…Œ์ŠคํŠธ๋กœ ํ™•์ธ

๐Ÿ“ฆ ์‹ค์Šต ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

k8s-ingress/
โ”œโ”€โ”€ deploy-nginx.yaml      # nginx ๋ฐฐํฌ + ์„œ๋น„์Šค
โ”œโ”€โ”€ deploy-httpd.yaml      # httpd ๋ฐฐํฌ + ์„œ๋น„์Šค
โ”œโ”€โ”€ ingress.yaml           # Ingress ๋ผ์šฐํŒ… ์ •์˜
โ””โ”€โ”€ README.md

โš™๏ธ [1๋‹จ๊ณ„] Ingress Controller ์„ค์น˜

minikube addons enable ingress
kubectl get pods -n ingress-nginx
  • ingress-nginx-controller Pod๊ฐ€ Running ์ƒํƒœ๋ฉด ์„ค์น˜ ์„ฑ๊ณต
  • NodePort ๊ธฐ๋ณธ ํฌํŠธ: 80, 443

๐Ÿงฑ [2๋‹จ๊ณ„] ์„œ๋น„์Šค 2๊ฐœ ๋ฐฐํฌ (nginx / httpd)

deploy-nginx.yaml (ํ•ต์‹ฌ ๋ถ€๋ถ„)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80

deploy-httpd.yaml๋„ ๋™์ผ ๊ตฌ์กฐ (image: httpd, name: httpd-*). ์ „์ฒด ์ฝ”๋“œ: GitHub (Ingress_and_Nginx_Controller)


๐Ÿ—บ๏ธ [3๋‹จ๊ณ„] Ingress ๋ผ์šฐํŒ… ์„ค์ •

ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: foo.local
    http:
      paths:
      - path: /nginx
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              number: 80
      - path: /httpd
        pathType: Prefix
        backend:
          service:
            name: httpd-service
            port:
              number: 80

๐Ÿš€ [4๋‹จ๊ณ„] ์‹คํ–‰ ๋ฐ ํ…Œ์ŠคํŠธ

kubectl apply -f deploy-nginx.yaml
kubectl apply -f deploy-httpd.yaml
kubectl apply -f ingress.yaml
minikube ip
# ์˜ˆ: 192.168.49.2

sudo nano /etc/hosts
# ์•„๋ž˜ ์ค„ ์ถ”๊ฐ€
192.168.49.2   foo.local
curl http://foo.local/nginx    # nginx ํ™”๋ฉด ๋ฐ˜ํ™˜
curl http://foo.local/httpd    # httpd ํŽ˜์ด์ง€ ๋ฐ˜ํ™˜

๐ŸŽฏ ์ •๋ฆฌ ์š”์•ฝ

ํ•ญ๋ชฉ๋‚ด์šฉ
IngressHTTP(S) ์š”์ฒญ์„ Path/Host ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚ด๋ถ€ ์„œ๋น„์Šค์— ๋ผ์šฐํŒ…
Ingress Controller์‹ค์ œ ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ ๋‹ด๋‹น (Nginx ๋“ฑ)
/etc/hosts๋กœ์ปฌ DNS ์—ญํ•  (ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค์ •)
ํ™œ์šฉ ์‚ฌ๋ก€/api, /mlflow, /jupyter ๋“ฑ URL๋ณ„ ์„œ๋น„์Šค ๋ถ„๋ฆฌ ๊ฐ€๋Šฅ

์„ค๊ณ„ ํŒ๋‹จ (Why This Way?)

์„œ๋น„์Šค๋ณ„ NodePort๋Š” ํฌํŠธ ์ถฉ๋Œ๊ณผ ๊ด€๋ฆฌ ๋ณต์žก๋„๊ฐ€ ๋†’์œผ๋ฏ€๋กœ, Ingress๋กœ ๋‹จ์ผ ํฌํŠธ์—์„œ ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜ L7 ๋ผ์šฐํŒ…์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. Nginx Ingress Controller๊ฐ€ MLOps ์Šคํƒ์—์„œ ๊ฐ€์žฅ ํ‘œ์ค€์ ์ธ ์„ ํƒ์ž…๋‹ˆ๋‹ค.


๋‹ค์Œ์— ์ฝ์„ ๊ธ€

โ†’ Kubernetes 4๋‹จ๊ณ„: Helm โ€” ์ฐจํŠธ ๊ธฐ๋ฐ˜ ํŒจํ‚ค์ง•๊ณผ ๋ฐฐํฌ