๐Ÿšฆ ํฌํŠธ ์ง€์˜ฅ์—์„œ ํƒˆ์ถœํ•˜๊ธฐ – Kubernetes Ingress Controller ๊ตฌ์ถ•

์„œ๋น„์Šค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ๊ธฐ๋ฉด NodePort ๊ด€๋ฆฌ๊ฐ€ ๊ฝค ๊ท€์ฐฎ์•„์ง‘๋‹ˆ๋‹ค. ์„œ๋น„์Šค A๋Š” 30080, ์„œ๋น„์Šค B๋Š” 30081, ์„œ๋น„์Šค C๋Š” 30082โ€ฆ IP + ํฌํŠธ ์กฐํ•ฉ์„ ์™ธ์šฐ๊ฑฐ๋‚˜ ์–ด๋”˜๊ฐ€ ์ ์–ด๋‘ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์šด์˜์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฑธ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒŒ Ingress์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ IP์™€ 80/443 ํฌํŠธ๋กœ ๋ชจ๋“  ์„œ๋น„์Šค๋ฅผ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ—บ๏ธ Ingress๊ฐ€ ํ•˜๋Š” ์ผ

ํด๋ผ์ด์–ธํŠธ โ†’ myapp.local:32626 (๋‹จ์ผ ์ง„์ž…์ )
    โ†“
Ingress Controller (Nginx)
    โ†“ Host: myapp.local โ†’ /
    โ†“
web-service (๋ฐฑ์—”๋“œ ์„œ๋น„์Šค)
    โ†“
web-app Pod๋“ค
  • ๋‹จ์ผ ์ง„์ž…์ : ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๋ฅผ ํ•˜๋‚˜์˜ IP/ํฌํŠธ๋กœ ํ†ตํ•ฉ
  • L7 ๋ผ์šฐํŒ…: ๋„๋ฉ”์ธ ์ด๋ฆ„๊ณผ ๊ฒฝ๋กœ(/api, /web ๋“ฑ)๋กœ ํŠธ๋ž˜ํ”ฝ ๋ถ„๊ธฐ
  • HTTP/HTTPS ์ง€์›: TLS ์ธ์ฆ์„œ ๊ด€๋ฆฌ๋„ Ingress์—์„œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

๐Ÿ› ๏ธ ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ

Ingress Controller ์„ค์น˜ (๋ฒ ์–ด๋ฉ”ํƒˆ์šฉ)

# ๋ฒ ์–ด๋ฉ”ํƒˆ ํ™˜๊ฒฝ์šฉ Nginx Ingress Controller ๋ฐฐํฌ
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.1/deploy/static/provider/baremetal/deploy.yaml

# ํŒŒ๋“œ ์ƒํƒœ ํ™•์ธ
kubectl get pods -n ingress-nginx

# ์™ธ๋ถ€ ๋…ธ์ถœ ํฌํŠธ ํ™•์ธ (์ค‘์š”!)
kubectl get svc -n ingress-nginx

์„ค์น˜ ํ›„ ์„œ๋น„์Šค ํฌํŠธ๋ฅผ ํ™•์ธํ•˜๋ฉด ๋žœ๋คํ•œ NodePort๊ฐ€ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ์ด ์‹ค์Šต์—์„œ๋Š” 32626๋ฒˆ์œผ๋กœ ํ• ๋‹น๋์Šต๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œ ์•ฑ ๋ฐฐํฌ

# web-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: nginx:1.21
---
apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: web
  ports:
  - port: 80
    targetPort: 80

Ingress ๊ทœ์น™ ์ •์˜

# app-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: myapp.local              # ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80

DNS ์šฐํšŒ ์„ค์ • (๋กœ์ปฌ ํ…Œ์ŠคํŠธ์šฉ)

์‹ค์ œ DNS๊ฐ€ ์—†์œผ๋‹ˆ /etc/hosts์— ์ง์ ‘ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

# Linux/Mac
echo "192.168.56.10 myapp.local" | sudo tee -a /etc/hosts

# Windows: C:\Windows\System32\drivers\etc\hosts ์— ์ถ”๊ฐ€
# 192.168.56.10 myapp.local
# ์ ‘์† ํ…Œ์ŠคํŠธ
curl http://myapp.local:32626

๐Ÿšจ ์‚ฝ์งˆ ํฌ์ธํŠธ 1 โ€” “30080์œผ๋กœ ์ ‘์†์ด ๋œ๋‹ค?”

Ingress๋ฅผ ์„ค์ •ํ–ˆ๋Š”๋ฐ ์ด์ „ ์‹ค์Šต์—์„œ ๋งŒ๋“ค์—ˆ๋˜ NodePort(30080)๋กœ ์ ‘์†ํ•˜๋‹ˆ ์—ฌ์ „ํžˆ ๋ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์—” “Ingress๊ฐ€ ์ž˜ ์„ค์ •๋๋‚˜?” ํ•˜๊ณ  ์ฐฉ๊ฐํ–ˆ๋Š”๋ฐ, ์‹ค์ œ๋กœ๋Š” Ingress๋ฅผ ์ „ํ˜€ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๊ณผ๊ฑฐ NodePort ์„œ๋น„์Šค๋กœ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜๊ณ  ์žˆ๋˜ ๊ฒ๋‹ˆ๋‹ค.

# ์ด์ „ ์‹ค์Šต ์ž”์žฌ ์ •๋ฆฌ
kubectl delete svc nginx-nodeport

์ •๋ฆฌ ํ›„ 30080์€ Connection Refused๊ฐ€ ๋˜๊ณ , Ingress ํฌํŠธ 32626์œผ๋กœ๋งŒ ์ ‘์†์ด ๋ฉ๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ๋ฅผ ์Šต๊ด€ํ™”ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ตํ›ˆ์ด์—ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿšจ ์‚ฝ์งˆ ํฌ์ธํŠธ 2 โ€” IP๋กœ ์ง์ ‘ ์ ‘์†ํ•˜๋ฉด 404

http://192.168.56.10:32626์œผ๋กœ ์ ‘์†ํ•˜๋ฉด 404 Not Found๊ฐ€ ๋œน๋‹ˆ๋‹ค.

์›์ธ: Ingress๋Š” HTTP ์š”์ฒญ์˜ Host ํ—ค๋”๋ฅผ ๋ณด๊ณ  ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค. IP๋กœ ์ ‘์†ํ•˜๋ฉด Host ํ—ค๋”๊ฐ€ IP ์ฃผ์†Œ๊ฐ€ ๋˜์–ด ๊ทœ์น™๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

# IP๋กœ ์ ‘์†ํ•  ๋•Œ Host ํ—ค๋”๋ฅผ ๋ช…์‹œํ•˜๋ฉด ์ž‘๋™
curl -H "Host: myapp.local" http://192.168.56.10:32626

๋ธŒ๋ผ์šฐ์ € ํ…Œ์ŠคํŠธ๋Š” ๋ฐ˜๋“œ์‹œ ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ’ก NodePort vs Ingress ๋น„๊ต

ํ•ญ๋ชฉNodePortIngress
ํฌํŠธ ๊ด€๋ฆฌ์„œ๋น„์Šค๋งˆ๋‹ค ๋ณ„๋„ ํฌํŠธ๋‹จ์ผ 80/443 ํฌํŠธ
๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…โŒโœ…
๊ฒฝ๋กœ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…โŒโœ…
TLS ์ธ์ฆ์„œ๋ณ„๋„ ์ฒ˜๋ฆฌ ํ•„์š”Ingress์—์„œ ํ†ตํ•ฉ ๊ด€๋ฆฌ
์‚ฌ์šฉ ์ผ€์ด์Šค๊ฐœ๋ฐœ/๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธํ”„๋กœ๋•์…˜

โœ… ์ •๋ฆฌ

Ingress Controller๋ฅผ ์“ฐ๋ฉด “๋‹จ์ผ ์ง„์ž…์ ”์ด ์ƒ๊น๋‹ˆ๋‹ค. L7 ๊ณ„์ธต์˜ ์ง€๋Šฅํ˜• ๋ผ์šฐํŒ… ๋•๋ถ„์— ๋„๋ฉ”์ธ๊ณผ ๊ฒฝ๋กœ๋งŒ์œผ๋กœ ์ˆ˜์‹ญ ๊ฐœ์˜ ์„œ๋น„์Šค๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๊ธ€์—์„œ๋Š” ํŒŒ๋“œ๊ฐ€ ์žฌ์‹œ์ž‘๋ผ๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋„๋ก ํ•˜๋Š” PV/PVC์™€ StatefulSet์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.