์ด ๊ธ์์ ๋ค๋ฃจ๋ ๊ฒ
์ฌ๋ฌ ์๋น์ค๋ฅผ ํ๋์ ์ง์ ์ ์์ ๊ฒฝ๋ก(Path) ๊ธฐ๋ฐ์ผ๋ก ๋ผ์ฐํ ํ๋ Ingress ๋ฆฌ์์ค์ Nginx Ingress Controller๋ฅผ ๋ค๋ฃน๋๋ค.
์ ์์ง์
- Kubernetes 1๋จ๊ณ: Deployment & Service โ Pod ๋ฐฐํฌ์ Service ๋ ธ์ถ
- Kubernetes 2๋จ๊ณ: ConfigMap & Secret โ ์ค์ ๋ถ๋ฆฌ ๊ฐ๋
์ด ๋จ๊ณ์์ ํด๊ฒฐํ๋ ค๋ ๋ฌธ์
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-controllerPod๊ฐ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 ํ์ด์ง ๋ฐํ
๐ฏ ์ ๋ฆฌ ์์ฝ
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| Ingress | HTTP(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 โ ์ฐจํธ ๊ธฐ๋ฐ ํจํค์ง๊ณผ ๋ฐฐํฌ