์ด ๋ฌธ์์์๋ Gateway API + Istio์ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ์ค์ ์ ์ฉ์ ํ์ํ ๊ตฌ์ฑ ์์๋ค์ ์ค๋ช ํฉ๋๋ค.
Gateway API
Kubernetes SIG Network์์ ๊ฐ๋ฐํ L4/L7 ๋ผ์ฐํ ์ ์ํ ๊ณต์ Kubernetes ํ๋ก์ ํธ์ ๋๋ค.
ํต์ฌ ์ค๊ณ ์์น
- ์ญํ ๊ธฐ๋ฐ (Role-oriented): GatewayClass/Gateway/Route๋ก ๋ฆฌ์์ค๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ญํ ๋ณ ์ฑ ์์ ๋ช ํํ ๊ตฌ๋ถํฉ๋๋ค.
- ์ด์์ฑ (Portable): Istio, Cilium ๋ฑ ๋ค์ํ ๊ตฌํ์ฒด์์ ๋์ผํ CRD๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ํํ๋ ฅ (Expressive): ํค๋ ๋งค์นญ, ํธ๋ํฝ ๊ฐ์ค์น ๋ฑ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ผ๋ก ์ง์ํฉ๋๋ค.
- ํ์ฅ์ฑ (Extensible): ๊ตฌํ์ฒด๋ณ๋ก ๋ณ๋ CRD๋ฅผ ์ ์ํ์ฌ ํ์ฅ ๊ฐ๋ฅํฉ๋๋ค. (์: Istio์ VirtualService)
์ฃผ์ ๊ตฌ์ฑ ์์
| ๋ฆฌ์์ค | ๊ด๋ฆฌ ์ฃผ์ฒด | ์ค๋ช |
|---|---|---|
| GatewayClass | Infrastructure Provider | ์ด๋ค Gateway ๊ตฌํ์ฒด(Istio, Cilium ๋ฑ)๋ฅผ ์ฌ์ฉํ ์ง ์ ์ |
| Gateway | DevOps Engineer | ํฌํธ, ๋๋ฉ์ธ, TLS ๋ฑ ์ธํ๋ผ ์์ค ์ค์ |
| HTTPRoute | Software Engineer | ์์ ์ ์ฑ์ผ๋ก ํธ๋ํฝ์ ๋ผ์ฐํ ํ๋ ๊ท์น ์ ์ |
| GRPCRoute | Software Engineer | gRPC ํธ๋ํฝ์ด ํ์ํ ๊ฒฝ์ฐ |
| TCPRoute/UDPRoute | Software Engineer | L4 ํธ๋ํฝ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ (Alpha) |
Ingress์์ ๋น๊ต
| ํญ๋ชฉ | Ingress | Gateway API |
|---|---|---|
| ์ญํ ๋ถ๋ฆฌ | ๋จ์ผ ๋ฆฌ์์ค์ ๋ชจ๋ ์ค์ ํผ์ฌ | GatewayClass/Gateway/Route๋ก ์ฑ ์ ๋ถ๋ฆฌ |
| ํ๋กํ ์ฝ | HTTP, HTTPS | HTTP, HTTPS, gRPC, TCP, UDP |
| ๋ผ์ฐํ | ๊ธฐ๋ณธ ๊ฒฝ๋ก ๊ธฐ๋ฐ | ํค๋, ๊ฐ์ค์น, ๋ฉ์๋ ๋ฑ ๊ณ ๊ธ ๋ผ์ฐํ |
| Canary ๋ฐฐํฌ | Annotation ํ์ | weight ํ๋๊ฐ ํ์ค ์คํ์ด๋ฏ๋ก ๋ฐ๋ก ํธ๋ํฝ ๋ถ๋ฐฐ ๊ฐ๋ฅ |
| ์ด์์ฑ | Annotation์ด ๊ตฌํ์ฒด๋ง๋ค ๋ค๋ฆ | ํต์ฌ ๊ธฐ๋ฅ์ ํ์ค CRD, ๊ณ ๊ธ ๊ธฐ๋ฅ๋ง ์ถ๊ฐ CRD ์ ์๋ก ํ์ฅ |
| Cross-NS Route Attachment | ๋ฏธ์ง์ | ๋ค๋ฅธ NS์ Gateway์ Route ์ฐ๊ฒฐ ๊ฐ๋ฅ1 |
| Cross-NS Backend Reference | ๋ฏธ์ง์ | ๋ค๋ฅธ NS์ Service๋ฅผ backendRef๋ก ์ฐธ์กฐ ๊ฐ๋ฅ2 |
Ingress API ์์ฒด๋ feature-frozen ์ํ์ด๋ฉฐ, Ingress NGINX๋ 2026๋ 3์ EOL ์์ ์ ๋๋ค.3 ์ ๊ท ํ๋ก์ ํธ๋ Gateway API๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค.
Istio
Service Mesh์ ๋ํ์ ์ธ ๊ตฌํ์ฒด๋ก, CNCF Graduated ํ๋ก์ ํธ์ ๋๋ค.
ํต์ฌ ๊ธฐ๋ฅ:
- ํธ๋ํฝ ๊ด๋ฆฌ: ์ฌ์๋, ํ์์์, ์ํท๋ธ๋ ์ด์ปค, ํธ๋ํฝ ๋ถํ ๋ฑ
- ๋ณด์: mTLS ์ํธํ, ์ธ์ฆ/์ธ๊ฐ, ์ ์ฑ ์ผ๊ด์ฑ ์๋ ์ ์ฉ
- ๊ด์ธก์ฑ: ๋ฉํธ๋ฆญ/ํธ๋ ์ด์ฑ/๋ก๊น
๋ค๋ฅธ ๊ตฌํ์ฒด์์ ๋น๊ต
| ํญ๋ชฉ | Istio | Linkerd | Cilium Service Mesh |
|---|---|---|---|
| ํ๋ก์ | Envoy (L7 ํ์คํ) | linkerd2-proxy (๊ฒฝ๋) | eBPF (์ปค๋ ๋ ๋ฒจ) |
| ๊ธฐ๋ฅ ๋ฒ์ | ๊ฐ์ฅ ํ๋ถ | ์ฌํํจ ์ฐ์ | ๋คํธ์ํฌ ์ฑ๋ฅ ์ฐ์ |
| ๋ณต์ก๋ | ๋์ | ๋ฎ์ | ์ค๊ฐ |
| Ambient Mode | ์ง์ | ๋ฏธ์ง์ | ๊ธฐ๋ณธ์ด Sidecarless |
Istio๋ฅผ ์ ํํ๋ ์ด์ :
- ๊ฐ์ฅ ์ฑ์ํ๊ณ ๊ธฐ๋ฅ์ด ํ๋ถํจ (CNCF Graduated)
- ๋ฉํฐํด๋ฌ์คํฐ, VM ์ํฌ๋ก๋ ๋ฑ ๋ค์ํ ํ๊ฒฝ ์ง์
- Ambient Mode๋ก Sidecar ๋ฐฉ์์ ๋จ์ ํด๊ฒฐ
Ambient Mode
๊ธฐ์กด Sidecar ๋ฐฉ์์ ๋จ์ ์ ํด๊ฒฐํ ๋ฐ์ดํฐ ํ๋ ์ธ ์ํคํ ์ฒ์ ๋๋ค. Pod๋ง๋ค Envoy sidecar๋ฅผ ์ฃผ์ ํ๋ ๋์ , ๋ ธ๋ ๋ ๋ฒจ L4 ํ๋ก์(ztunnel)์ ์ ํ์ L7 ํ๋ก์(Waypoint)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ฅ์ :
- ๋ฎ์ ๋ฆฌ์์ค ์๋น: ๋ ธ๋๋น ํ๋์ ztunnel๋ก CPU/๋ฉ๋ชจ๋ฆฌ ์ ๊ฐ
- ๊ฐ์ํ๋ ์ด์: Pod์ ๋ ๋ฆฝ๋ ํ๋ก์๋ก ์ด์๋๋ฉฐ, ์ญํ ๊ณผ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์์ ํ ๋ถ๋ฆฌ
- ์ ์ง์ ๋์ ๊ฐ๋ฅ: L4, L7 ํ๋ก์๋ฅผ ์ ํ์ ์ผ๋ก ์ถ๊ฐํ์ฌ ์ ์ง์ ์ผ๋ก ๋์ ๊ฐ๋ฅ
์ํคํ ์ฒ
Istio๋ ์ปจํธ๋กค ํ๋ ์ธ๊ณผ ๋ฐ์ดํฐ ํ๋ ์ธ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ปจํธ๋กค ํ๋ ์ธ์ ์ ์ฑ ๊ณผ ์ค์ ์ ๊ด๋ฆฌํ๊ณ ๋ฐ์ดํฐ ํ๋ ์ธ์ผ๋ก ์ ๋ฌํ๋ฉฐ, istiod๊ฐ ๊ทธ ์ญํ ์ ์ํํฉ๋๋ค. ๋ฐ์ดํฐ ํ๋ ์ธ์ ztunnel(L4)๊ณผ waypoint(L7)๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์ค์ ๋ก ํธ๋ํฝ์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
flowchart TB subgraph ControlPlane["์ปจํธ๋กค ํ๋ ์ธ"] istiod["istiod<br/>(์ค์ ๋ฐฐํฌ, ์ธ์ฆ์ ๊ด๋ฆฌ, ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ)"] end subgraph DataPlane["๋ฐ์ดํฐ ํ๋ ์ธ (Ambient Mode)"] ztunnel["ztunnel<br/>(L4: mTLS, ์ธ์ฆ/์ธ๊ฐ)"] waypoint["Waypoint Proxy<br/>(L7: HTTP ์ ์ฑ , ํ ๋ ๋ฉํธ๋ฆฌ)"] end subgraph App["์ ํ๋ฆฌ์ผ์ด์ "] pod1["Pod A"] pod2["Pod B"] end istiod -->|์ค์ /์ธ์ฆ์ ์ ๋ฌ| ztunnel istiod -->|์ค์ /์ธ์ฆ์ ์ ๋ฌ| waypoint pod1 <-->|ํธ๋ํฝ| ztunnel pod2 <-->|ํธ๋ํฝ| ztunnel ztunnel <-->|L7 ํ์์| waypoint
์ฃผ์ CRD
| CRD | ์ฉ๋ |
|---|---|
| VirtualService | ํธ๋ํฝ ๋ผ์ฐํ ๊ท์น (์ฌ์๋, ํ์์์, ํธ๋ํฝ ๋ถํ ๋ฑ) |
| DestinationRule | ๋ฐฑ์๋ ์ ์ฑ (๋ก๋๋ฐธ๋ฐ์ฑ, ์ํท๋ธ๋ ์ด์ปค, ์ฐ๊ฒฐ ํ ์ค์ ๋ฑ) |
| AuthorizationPolicy | ์ ๊ทผ ์ ์ด (์ด๋ค ์๋น์ค๊ฐ ์ด๋ค ์๋น์ค๋ฅผ ํธ์ถํ ์ ์๋์ง) |
| PeerAuthentication | mTLS ๋ชจ๋ ์ค์ (STRICT, PERMISSIVE ๋ฑ) |
| RequestAuthentication | JWT ๊ฒ์ฆ ๋ฑ ์์ฒญ ์์ค ์ธ์ฆ |
| EnvoyFilter | Envoy ์ ์์ค ์ค์ (์ตํ์ ์๋จ, ์๋ ์ฐธ๊ณ ) |
EnvoyFilter ์ฌ์ฉ ์ ์ฃผ์์ฌํญ
EnvoyFilter๋ ํ์ค CRD๋ก ํํํ ์ ์๋ Envoy ์ ์์ค ์ค์ ์ด ํ์ํ ๋ ์ ํ์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
๋ถ๊ฐํผํ๊ฒ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ:
| ์ํฉ | ์์ |
|---|---|
| ์์ฒญ ๋ณธ๋ฌธ ํฌ๊ธฐ ์ ํ | max_request_bytes ์ค์ |
| ์ปค์คํ ํค๋ ์กฐ์ | ํน์ ์กฐ๊ฑด์์๋ง ํค๋ ์ถ๊ฐ/์ญ์ |
| Rate Limiting | Envoy์ local/global rate limit ํํฐ |
| Lua/WASM ํ๋ฌ๊ทธ์ธ | ๋ณต์กํ ์์ฒญ/์๋ต ๋ณํ ๋ก์ง |
์ฃผ์์ฌํญ:
- ๋ฒ์ ํธํ์ฑ: Istio/Envoy ์ ๊ทธ๋ ์ด๋ ์ EnvoyFilter๊ฐ ๊นจ์ง ์ ์์. ์ ๊ทธ๋ ์ด๋ ํ ๋ฐ๋์ ํ ์คํธ ํ์
- Ambient Mode ์ ์ฝ: ztunnel์ Envoy๊ฐ ์๋๋ฏ๋ก EnvoyFilter ์ ์ฉ ๋ถ๊ฐ. Waypoint Proxy์๋ง ์ ์ฉ ๊ฐ๋ฅ
- ๋๋ฒ๊น ์ด๋ ค์: ํ์ค CRD์ EnvoyFilter๊ฐ ์์ด๋ฉด ๋ฌธ์ ์ถ์ ์ด ๋ณต์กํด์ง
Helm Charts
| Chart | ์ค๋ช |
|---|---|
istio-base | Istio CRD ๋ฐ ํด๋ฌ์คํฐ ๋ ๋ฒจ ๋ฆฌ์์ค ์ค์น |
istiod | ์ปจํธ๋กค ํ๋ ์ธ (istiod) ์ค์น |
istio-cni | CNI ํ๋ฌ๊ทธ์ธ - Pod ๋คํธ์ํฌ ์ค์ ๋ด๋น |
ztunnel | Ambient Mode L4 ํ๋ก์ DaemonSet |
istio-gateway | Gateway ๊ตฌํ์ฒด (์ธ๋ถ ํธ๋ํฝ ์ฒ๋ฆฌ ์ ํ์) |
Gateway API + Istio ํจ๊ป ์ฌ์ฉํ๊ธฐ
VirtualService vs HTTPRoute
| ํญ๋ชฉ | HTTPRoute (Gateway API) | VirtualService (Istio) |
|---|---|---|
| ํ์คํ | Kubernetes ํ์ค | Istio ์ ์ฉ |
| ์ ์ฉ ๋ฒ์ | North-South (์ธ๋ถโ๋ด๋ถ) | North-South + East-West (๋ด๋ถโ๋ด๋ถ) |
| ์ด์์ฑ | ๋ค๋ฅธ ๊ตฌํ์ฒด๋ก ์ด๋ ๊ฐ๋ฅ | Istio์ ์ข ์ |
| ๊ธฐ๋ฅ | ๋ผ์ฐํ , ํธ๋ํฝ ๋ถํ , ํค๋ ๋งค์นญ | HTTPRoute์ ๊ธฐ๋ฅ + ์ฌ์๋, ํ์์์, fault injection ๋ฑ |
์์ฝํ๋ฉด ๊ธฐ๋ฅ์ ์ผ๋ก๋ VirtualService๊ฐ ๋ ํ๋ถํ์ง๋ง, ํ์คํ๋ ๋ค๋ฅธ Gateway API ๊ตฌํ์ฒด๋ก ์ด์ ๊ณํ์ด ์๋ค๋ฉด HTTPRoute๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋์ ์ ์์ต๋๋ค.
CORS ์ค์
Istio + Gateway API ํ๊ฒฝ์์ CORS๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
Istio VirtualService (๊ถ์ฅ)
Istio ํ๊ฒฝ์์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์
๋๋ค. VirtualService์ corsPolicy ํ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: my-service
spec:
hosts:
- my-service.example.com
http:
- corsPolicy:
allowOrigins:
- exact: https://app.example.com
- regex: "https://.*\\.example\\.com"
allowMethods:
- GET
- POST
- PUT
- DELETE
- OPTIONS
allowHeaders:
- Authorization
- Content-Type
- X-Custom-Header
exposeHeaders:
- X-Response-Header
maxAge: "24h"
allowCredentials: true
route:
- destination:
host: my-service.default.svc.cluster.local์ฃผ์ ํ๋:
| ํ๋ | ์ค๋ช |
|---|---|
allowOrigins | ํ์ฉํ Origin ๋ชฉ๋ก (exact, prefix, regex ๋งค์นญ ์ง์) |
allowMethods | ํ์ฉํ HTTP ๋ฉ์๋ |
allowHeaders | ์์ฒญ์์ ํ์ฉํ ํค๋ |
exposeHeaders | ํด๋ผ์ด์ธํธ์ ๋ ธ์ถํ ์๋ต ํค๋ |
maxAge | Preflight ์๋ต ์บ์ ์๊ฐ |
allowCredentials | ์ฟ ํค/์ธ์ฆ ์ ๋ณด ํฌํจ ์ฌ๋ถ (true์ผ ๊ฒฝ์ฐ ์์ผ๋์นด๋ ์ฌ์ฉ ๋ถ๊ฐ) |
Gateway API CORS Filter (Experimental)
Gateway API v1.3.0๋ถํฐ CORS ํํฐ๊ฐ ์คํ์ ๊ธฐ๋ฅ์ผ๋ก ์ถ๊ฐ๋์์ต๋๋ค.4
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: my-route
spec:
parentRefs:
- name: my-gateway
rules:
- matches:
- path:
type: PathPrefix
value: /api
filters:
- type: CORS
cors:
allowOrigins:
- type: Exact
value: https://app.example.com
allowMethods:
- GET
- POST
- OPTIONS
allowHeaders:
- Authorization
- Content-Type
allowCredentials: false
maxAge: 86400
backendRefs:
- name: my-service
port: 8080์ฃผ์์ฌํญ:
- Experimental ์ฑ๋ ์ค์น ํ์ (
gateway.networking.k8s.io/v1with experimental CRDs) - HTTPRoute์์ OPTIONS ๋ฉ์๋๋ฅผ ํ์ฉํด์ผ Preflight ์์ฒญ์ด ์ฒ๋ฆฌ๋จ
allowCredentials: true์ผ ๊ฒฝ์ฐ ์์ผ๋์นด๋(*) ์ฌ์ฉ ๋ถ๊ฐ, ๋ช ์์ Origin ์ง์ ํ์
HTTPRoute ResponseHeaderModifier๋?
ResponseHeaderModifier๋ก CORS ํค๋๋ฅผ ์ง์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ5๋ ์์ง๋ง, Preflight ์๋ ์ฒ๋ฆฌ๊ฐ ์ ๋๊ณ CORS ๊ท์น์ ์๋ ๊ด๋ฆฌํด์ผ ํ๋ฏ๋ก ๊ถ์ฅํ์ง ์์ต๋๋ค.
Reference
- Gateway API
- Gateway API vs Ingress: The Future of Kubernetes Networking
- Istio official website
- Istio Ambient Mode