[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/