์๋น์ค๊ฐ ์ฌ๋ฌ ๊ฐ ์๊ธฐ๋ฉด 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 ๋น๊ต
| ํญ๋ชฉ | NodePort | Ingress |
|---|---|---|
| ํฌํธ ๊ด๋ฆฌ | ์๋น์ค๋ง๋ค ๋ณ๋ ํฌํธ | ๋จ์ผ 80/443 ํฌํธ |
| ๋๋ฉ์ธ ๊ธฐ๋ฐ ๋ผ์ฐํ | โ | โ |
| ๊ฒฝ๋ก ๊ธฐ๋ฐ ๋ผ์ฐํ | โ | โ |
| TLS ์ธ์ฆ์ | ๋ณ๋ ์ฒ๋ฆฌ ํ์ | Ingress์์ ํตํฉ ๊ด๋ฆฌ |
| ์ฌ์ฉ ์ผ์ด์ค | ๊ฐ๋ฐ/๊ฐ๋จํ ํ ์คํธ | ํ๋ก๋์ |
โ ์ ๋ฆฌ
Ingress Controller๋ฅผ ์ฐ๋ฉด “๋จ์ผ ์ง์ ์ ”์ด ์๊น๋๋ค. L7 ๊ณ์ธต์ ์ง๋ฅํ ๋ผ์ฐํ ๋๋ถ์ ๋๋ฉ์ธ๊ณผ ๊ฒฝ๋ก๋ง์ผ๋ก ์์ญ ๊ฐ์ ์๋น์ค๋ฅผ ๊น๋ํ๊ฒ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
๋ค์ ๊ธ์์๋ ํ๋๊ฐ ์ฌ์์๋ผ๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง์ง ์๋๋ก ํ๋ PV/PVC์ StatefulSet์ ๋ค๋ฃน๋๋ค.