[Istio ๊ฐ์ด๋ ep.9] 2๋ถ ํธ๋ํฝ ๊ด๋ฆฌ #3 | Istio Gateway ์ค์ ์์ : Ingress ๋ฐ Egress ํธ๋ํฝ ์ ์ด
๐น ๊ฐ์
์ด๋ฒ ๊ธ์์๋ Istio์ Gateway๋ฅผ ํ์ฉํ์ฌ Ingress ๋ฐ Egress ํธ๋ํฝ์ ์ ์ดํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃน๋๋ค.
Ingress Gateway๋ ์ธ๋ถ ํธ๋ํฝ์ Kubernetes ํด๋ฌ์คํฐ ๋ด๋ถ ์๋น์ค๋ก ์ ๋ฌํ๋ฉฐ,
Egress Gateway๋ ๋ด๋ถ ์๋น์ค์์ ์ธ๋ถ๋ก ๋๊ฐ๋ ํธ๋ํฝ์ ์ ์ดํ๋ ์ญํ ์ ํฉ๋๋ค.
์ด ๊ธ์์๋ Ingress Gateway์ Egress Gateway์ ๊ฐ๋
์ ์ ๋ฆฌํ๊ณ ,
์ค์ YAML ์์ ๋ฅผ ํตํด ํธ๋ํฝ์ ์ ์ดํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๐น 1. Istio์ Gateway ๊ฐ๋
โ 1.1 Ingress Gateway๋?
Ingress Gateway๋ ์ธ๋ถ์์ Kubernetes ํด๋ฌ์คํฐ๋ก ๋ค์ด์ค๋ ํธ๋ํฝ์ ์ ์ดํ๋ Istio ๋ฆฌ์์ค์
๋๋ค.
Kubernetes์ ๊ธฐ๋ณธ Ingress ๋ฆฌ์์ค๋ณด๋ค **๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ(L7 ๊ธฐ๋ฐ ํธ๋ํฝ ๋ผ์ฐํ
, TLS/HTTPS ์ ์ฉ, ์ธ๋ฐํ ํธ๋ํฝ ๊ด๋ฆฌ)**์ ์ ๊ณตํฉ๋๋ค.
Ingress Gateway์ ์ฃผ์ ๊ธฐ๋ฅ
- ์ธ๋ถ ํธ๋ํฝ์ ๋ด๋ถ ์๋น์ค๋ก ๋ผ์ฐํ
- VirtualService์ ํจ๊ป ์ฌ์ฉํ์ฌ ์ ๊ตํ ํธ๋ํฝ ๋ผ์ฐํ ๊ฐ๋ฅ
- TLS/HTTPS ์ธ์ฆ์ ํตํด ๋ณด์ ๊ฐํ
โ 1.2 Egress Gateway๋?
Egress Gateway๋ ํด๋ฌ์คํฐ ๋ด๋ถ์์ ์ธ๋ถ๋ก ๋๊ฐ๋ ํธ๋ํฝ์ ์ ์ดํ๋ Istio ๋ฆฌ์์ค์
๋๋ค.
๋ณดํต ํด๋ฌ์คํฐ ๋ด๋ถ์ ์๋น์ค๊ฐ ์ธ๋ถ API ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
Egress Gateway์ ์ฃผ์ ๊ธฐ๋ฅ
- ์ธ๋ถ ํธ๋ํฝ์ ์ค์์์ ์ ์ด
- DNS ๊ธฐ๋ฐ์ ์ ๊ทผ ์ ์ด ๋ฐ ๋ณด์ ์ค์ ๊ฐ๋ฅ
- ์ธํฐ๋ท ํธ๋ํฝ ๋ฐ ์ธ๋ถ API ํต์ ๋ชจ๋ํฐ๋ง ๊ฐ๋ฅ
๐น 2. Ingress Gateway ์ค์
โ 2.1 Ingress Gateway ๊ธฐ๋ณธ ์ค์
์๋ ์์ ์์๋ Ingress Gateway๋ฅผ ์์ฑํ์ฌ ์ธ๋ถ ํธ๋ํฝ์ ๊ด๋ฆฌํฉ๋๋ค.
apiVersion: networking.istio.io/v1alpha3
kind: Gateway # Istio Gateway ๋ฆฌ์์ค ์ ์
metadata:
name: my-ingress-gateway # Gateway์ ์ด๋ฆ
spec:
selector:
istio: ingressgateway # Istio ๊ธฐ๋ณธ Ingress Gateway ์ฌ์ฉ
servers:
- port:
number: 80 # HTTP 80๋ฒ ํฌํธ์์ ์์
name: http
protocol: HTTP
hosts:
- "*" # ๋ชจ๋ ๋๋ฉ์ธ ํ์ฉ
์ค๋ช :
- Gateway โ Istio์ Ingress Gateway ๋ฆฌ์์ค ์ ์
- port.number: 80 โ HTTP 80 ํฌํธ์์ ์ธ๋ถ ํธ๋ํฝ ์์
- hosts: "*" โ ๋ชจ๋ ๋๋ฉ์ธ ํ์ฉ
โ 2.2 Ingress Gateway + VirtualService ์ค์
Ingress Gateway๋ฅผ ์ค์ ํ ํ, VirtualService๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋ํฝ์ ๋ด๋ถ ์๋น์ค๋ก ์ ๋ฌํฉ๋๋ค.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-service
spec:
hosts:
- "*" # ๋ชจ๋ ๋๋ฉ์ธ์ ์์ฒญ์ ์๋ฝ
gateways:
- my-ingress-gateway # ์์์ ์์ฑํ Gateway๋ฅผ ์ฌ์ฉ
http:
- match:
- uri:
prefix: "/api" # "/api" ๊ฒฝ๋ก๋ก ๋ค์ด์ค๋ ์์ฒญ์ my-service๋ก ๋ผ์ฐํ
route:
- destination:
host: my-service # ๋ด๋ถ ์๋น์ค ์ด๋ฆ
port:
number: 8080 # ๋ด๋ถ ์๋น์ค๊ฐ ์์ ํ๋ ํฌํธ
์ค๋ช :
- /api ๊ฒฝ๋ก๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ด๋ถ ์๋น์ค my-service๋ก ์ ๋ฌ๋จ
โ 2.3 TLS/HTTPS ์ ์ฉ Ingress Gateway ์ค์
TLS๋ฅผ ์ ์ฉํ์ฌ HTTPS ํธ๋ํฝ์ ์ฒ๋ฆฌํ๋ Ingress Gateway ์ค์ ์ ๋๋ค.
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: my-secure-ingress
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 443 # HTTPS ํฌํธ
name: https
protocol: HTTPS
tls:
mode: SIMPLE # HTTPS ์ฌ์ฉ
credentialName: my-tls-secret # Secret์์ TLS ์ธ์ฆ์ ๋ก๋
hosts:
- "example.com" # ํน์ ๋๋ฉ์ธ์ ๋ํด์๋ง HTTPS ์ ์ฉ
์ค๋ช :
- tls.mode: SIMPLE โ TLS๋ฅผ ์ ์ฉํ์ฌ HTTPS ํ์ฑํ
- credentialName: my-tls-secret โ Kubernetes Secret์์ TLS ์ธ์ฆ์๋ฅผ ๋ก๋
- hosts: "example.com" โ ํน์ ๋๋ฉ์ธ(example.com)์๋ง HTTPS ์ ์ฉ
๐น 3. Egress Gateway ์ค์
โ 3.1 Egress Gateway ๊ธฐ๋ณธ ์ค์
์๋ ์์ ์์๋ Egress Gateway๋ฅผ ์์ฑํ์ฌ ๋ด๋ถ ์๋น์ค๊ฐ ์ธ๋ถ API์ ์ ๊ทผํ๋ ํธ๋ํฝ์ ๊ด๋ฆฌํฉ๋๋ค.
apiVersion: networking.istio.io/v1alpha3
kind: Gateway # Istio Egress Gateway ๋ฆฌ์์ค ์ ์
metadata:
name: my-egress-gateway
spec:
selector:
istio: egressgateway # Istio์ Egress Gateway ์ฌ์ฉ
servers:
- port:
number: 443 # HTTPS ํธ๋ํฝ ์ฒ๋ฆฌ
name: https
protocol: HTTPS
hosts:
- "*.external.com" # ํน์ ๋๋ฉ์ธ์ผ๋ก ๋๊ฐ๋ ํธ๋ํฝ์ ํ์ฉ
์ค๋ช :
- Gateway โ Egress ํธ๋ํฝ์ ์ ์ดํ๋ Istio ๋ฆฌ์์ค
- port.number: 443 โ HTTPS ํธ๋ํฝ์ ์ฒ๋ฆฌํ๋๋ก ์ค์
- hosts: "*.external.com" โ ํน์ ๋๋ฉ์ธ(external.com)์ผ๋ก ๋๊ฐ๋ ํธ๋ํฝ๋ง ํ์ฉ
โ 3.2 Egress Gateway + VirtualService ์ค์
Egress Gateway๋ฅผ ์ค์ ํ ํ, VirtualService๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ๋๋ฉ์ธ์ผ๋ก์ ํธ๋ํฝ์ Egress Gateway๋ก ๋ณด๋ด๋๋ก ์ค์ ํฉ๋๋ค.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: allow-external
spec:
hosts:
- "*.external.com" # ์ธ๋ถ API ๋๋ฉ์ธ
gateways:
- my-egress-gateway # ์์์ ์์ฑํ Egress Gateway ์ฌ์ฉ
http:
- match:
- uri:
prefix: "/api" # "/api" ๊ฒฝ๋ก๋ก ์์ํ๋ ์์ฒญ๋ง ํ์ฉ
route:
- destination:
host: "*.external.com"
port:
number: 443
์ค๋ช :
- hosts: "*.external.com" โ ํน์ ๋๋ฉ์ธ์ผ๋ก๋ง Egress ํธ๋ํฝ ํ์ฉ
- match.uri.prefix: "/api" โ ํน์ API ๊ฒฝ๋ก๋ก ์์ํ๋ ์์ฒญ๋ง ํ์ฉ
๐ ๊ฒฐ๋ก
- Ingress Gateway๋ ์ธ๋ถ ํธ๋ํฝ์ ๋ด๋ถ ์๋น์ค๋ก ์ ๋ฌํ๋ ์ญํ ์ ํ๋ฉฐ, VirtualService์ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค.
- Ingress Gateway์์ TLS/HTTPS๋ฅผ ์ ์ฉํ์ฌ ๋ณด์์ ๊ฐํํ ์ ์์ต๋๋ค.
- Egress Gateway๋ ๋ด๋ถ์์ ์ธ๋ถ๋ก ๋๊ฐ๋ ํธ๋ํฝ์ ์ ์ดํ๋ ์ญํ ์ ํ๋ฉฐ, ํน์ ๋๋ฉ์ธ ๋ฐ API ์์ฒญ๋ง ํ์ฉํ ์ ์์ต๋๋ค.
- VirtualService์ ์กฐํฉํ์ฌ, Ingress ๋ฐ Egress ํธ๋ํฝ์ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค.