[k8s] Ingress
Ingress๋ HTTP ์์ค์ ๋ผ์ฐํ
์ ์ ์ดํ ์ ์๊ฒ ํด์ฃผ๋ ๊ณ ๊ธ ์ปดํฌ๋ํธ๋ค.
API Gateway ํจํด์ ๋ํ ๊ท๊ฒฉ์ ์ฟ ๋ฒ ์์ฒด์์ ํ์คํํด์ ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค.
Ingress๋ฅผ ์ค์ ๋ก ์ฐ๊ฒฐํ๋ ๊ฒ์ Ingress Controller๋ผ๋ ๋ณ๋ ์์คํ
์ ์ฑ
์์ด๋ค.
Ingress Controller์ ๋๋ฆฌ ์ฐ์ด๋ ๊ตฌํ์ฒด๋ nginx ingress controller(์ฌ๋ง), istio ingress, traefik ingress controller, envoy ๋ฑ์ด ์๋ค.
๊ทผ๋ฐ ์ด์งธ์์ธ์ง ์ฟ ๋ฒ๋คํฐ์ค ๊ทธ๋ฃน์์๋ ์ด๊ฑธ ํต์งธ๋ก ๋์ง๊ณ ๊ฒ์ดํธ์จ์ด๋ผ๋ ์๋ก์ด ๊ธฐ๋ฅ์ผ๋ก ๋์ฒดํ๋ ค๋ ์๋๋ฅผ ํ๊ณ ์๋ ๊ฒ ๊ฐ๋ค.
๊ธฐ๋ณธ ๊ณ์ธต (Traefik)
๊ฐ๋ณ Ingress Controller๋ค์ ์ค์น ๋ฐฉ๋ฒ์ ๋ํด ๋ค๋ฃจ์ง ์๋๋ค.
์ฌ๊ธฐ์๋ Traefik Ingress Controller๊ฐ ์ค์น๋์ด์๋ค๊ณ ๊ฐ์ ํ๋ค.
๋ง์ฝ Traefik Ingress Controller๊ฐ ์ ๊น๋ ค์๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ ์์ผ๋ก ๋ฆฌ์์ค๊ฐ ์กฐํ๋ ๊ฒ์ด๋ค.
deployment ํ๋์ service ํ๋๊ฐ ์๋ค.
์ฌ์ค ์ด Ingress Controller๋ผ๋ ๊ฒ์ด ๊ทธ๋ ๊ฒ ํน๋ณํ ๊ฒ์ ์๋๋ค.
Service์ Deployment ์์ผ๋ก ์ด๋ฃจ์ด์ง Gateway ์๋ฒ๊ฐ ์๊ณ , ์ด๊ฒ ๊ฐ๋ณ API๋ค์ ๋ผ์ฐํ
ํด์ค ๋ฟ์ด๋ค.
Ingress Controller์ ์๋ํฌ์ธํธ๋ Service๋ฅผ ํตํด ์ ๊ณต๋๋๋ฐ, ๋ค๋ฅธ Service๋ค๊ณผ ๋์ผํ๋ค.
์์์ External IP๋ฅผ ๋ซ๋ ํด์ ๊ฐ๋ฐฉํด์ผ ํ๋ค.
Ingress ์ถ๊ฐํด๋ณด๊ธฐ (ex: Traefik)
Ingress๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ๋จผ์ ๋ถ์ผ ์๋น์ค๊ฐ ์์ด์ผ ํ๋ค. ์ฌ๋ฌ๊ฐ์ ์๋น์ค๋ฅผ ๋จ์ผ ๋ก๋๋ฐธ๋ฐ์์ ๋ผ์ฐํ ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋จผ์ test-service๋ผ๋ ์๋น์ค๋ฅผ ํ๋ ๋ง๋ จํ๋ค.
๊ทธ๋ฅ ๋ณ๊ฑฐ ์๋ ๋จ์ํ ์๋ฒ๋ค.
์ ๊ฑธ ๋ถ์ด๋ ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด Ingress๋ฅผ ์ ์ํด์ผ ํ๋ค.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- http:
paths:
- path: / # ๋ผ์ฐํ
Path
pathType: Prefix # /* ๊ทธ๋๋ก ๋งคํ
backend:
service:
name: test-service # ์ฐ๊ฒฐํ ์๋น์ค
port:
number: 80 # test-service์ ํฌํธ
์ด๋
ธํ
์ด์
์ ํตํด ์ด๋ค ingress controller๋ฅผ ์ธ์ง ์ง์ ํ๋ค. ์ด๊ฑธ ๊ธฐ๋ฐ์ผ๋ก traefik์ด ์ก์์ ๋ผ์ฐํ
์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ spec์์๋ ์ด๋ค ์๋น์ค๋ฅผ ์ด๋ค ๊ฒฝ๋ก๋ก ๋ผ์ฐํ
ํ ์ง๋ฅผ ์ง์ ํ๋ค.
์ฌ๊ธฐ์๋ ์๋ณธ API๊ฐ ๋ฃจํธ ๊ฒฝ๋ก๋ก๋ง ๋์ํ๋ฏ๋ก, ๋ฃจํธ ๊ฒฝ๋ก๋ก๋ง ๋ผ์ฐํ
ํ๋ค.
๋ง๋ค๊ณ ๋๋ฉด
์ด๋ ๊ฒ ingress ๋ชฉ๋ก์ ์ถ๊ฐ๊ฐ ๋ ๊ฒ์ด๊ณ
traefik์ ๋ก๋๋ฐธ๋ฐ์๋ก๋ ์กฐํ๊ฐ ๋ ๊ฒ์ด๋ค.
ํน์ํ ๋์
ingress์ spec์ ํ์ค์ ์ ์๋ ๋ถ๋ถ์ด๋ผ์, ๊ตฌํ์ฒด๋ณ๋ก ํนํ๋ ๋์์ ์ค์ ํ ์๋ ์๋ค.
๊ทธ๋์ ํน์ํ ๊ธฐ๋ฅ์ ์ฐ๋ ค๋ฉด ์ด๋
ธํ
์ด์
์ ๊ธฐ๋ฐ์ผ๋ก ์ฒ๋ฆฌ๋ฅผ ๋ง์ด ํ๋ค.
์๋ฅผ ๋ค์ด, traefik controller์ ๊ฒฝ์ฐ์๋ sub path๋ก service๋ฅผ ์ฐ๊ฒฐํ๋๋ผ๋ path rewriting์ ๊ธฐ๋ณธ์ผ๋ก ํด์ฃผ์ง ์๋๋ค. ๊ทธ๊ฑธ ํ๋ ค๋ฉด ์ด๋ ธํ ์ด์ ์ผ๋ก ํด๋น ๊ธฐ๋ฅ์ ํ์ฑํํด์ผ ํ๋ค.
์ด๋ฐ ์์ด๋ค.
# Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
annotations:
kubernetes.io/ingress.class: traefik
traefik.ingress.kubernetes.io/router.middlewares: default-strip-test-prefix@kubernetescrd
spec:
rules:
- http:
paths:
- path: /test
pathType: Prefix
backend:
service:
name: test-service
port:
number: 80
๊ทธ๋ฌ๋ฉด rewriting๊น์ง ํด์ /test๋ฅผ ํธ์ถํ ๋ /๋ก ์นํํด์ค ๊ฒ์ด๋ค.
์ฐธ์กฐ
https://kubernetes.io/ko/docs/concepts/services-networking/ingress-controllers/
https://kubernetes.io/ko/docs/concepts/services-networking/ingress/