[Kubernetes] ๐ Kong์ผ๋ก TCP/TLS ์๋น์ค ์ธ๋ถ ๋ ธ์ถ: LoadBalancer + SNI + Gateway API
Kubernetes์์ RedisยทDB ๊ฐ์ ์์ TCP ์๋น์ค๋ฅผ ๋๋ฉ์ธ์ผ๋ก ์ธ๋ถ ๋ ธ์ถํ๋ ค๋ฉด, Kong์ stream ๋ฆฌ์ค๋ + SNI๋ฅผ ์ฐ๋ฉด ๋ฉ๋๋ค. ์ด ๊ธ์์๋ LoadBalancer๋ก ๋ฐ์ ํฌํธ ํ๋(์: 9443)์์ SNI(๋๋ฉ์ธ)๋ก ์ฌ๋ฌ TCP/TLS ๋ฐฑ์๋๋ฅผ ๋ถ๋ฐฐํ๋ ๊ตฌ์ฑ์, Helm values๋ถํฐ Gateway API(TLSRoute) ๋งค๋ํ์คํธ, ๊ทธ๋ฆฌ๊ณ ์๋ฌ ๋ฉ์์ง๊ฐ ๋ฐ๋๋ฉฐ ์์ธ์ ์ขํ๊ฐ๋ ๋๋ฒ๊น ๊ณผ์ ๊น์ง ์ค๋ฌด ๊ด์ ์ผ๋ก ๋ค๋ฃน๋๋ค.
ํต์ฌ ์์ด๋์ด ํ ์ค: “ํฌํธ ํ๋๋ก ๋ค ๋ฐ๊ณ , SNI๋ก ๋ฐฑ์๋๋ฅผ ๊ฐ๋ฅธ๋ค.” LB์ ๋ ธ์ถ๋ ํฌํธ๊ฐ ๋ช ๊ฐ๋ฟ์ด์ด๋ ๋ฐฑ์๋๋ ์์ญ ๊ฐ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
flowchart LR
C["ํด๋ผ์ด์ธํธ<br/>TLS + SNI"] --> LB["LoadBalancer<br/>์ธ๋ถ IP:9443"]
LB --> K["Kong<br/>stream ๋ฆฌ์ค๋ (ssl)"]
K -->|"SNI: redis-a.example.com"| RA["redis-a:6379"]
K -->|"SNI: redis-b.example.com"| RB["redis-b:6379"]
K -->|"SNI: db-1.example.com"| DB["db-1:5432"]๐งญ ๋ฌด์์ ํ๋ ค๋๊ฐ #
๋ชฉํ๋ “HTTP๊ฐ ์๋ TCP ์๋น์ค"๋ฅผ ๋๋ฉ์ธ ๊ธฐ๋ฐ์ผ๋ก ์ธ๋ถ์ ์ฌ๋ ๊ฒ์ ๋๋ค. IngressยทHTTPRoute๋ HTTP(L7) ์ ์ฉ์ด๋ผ RedisยทPostgreSQL ๊ฐ์ raw TCP์๋ ์ธ ์ ์์ต๋๋ค. ๋์ Kong์ stream(L4) ๋ฆฌ์ค๋์ TLS๋ฅผ ์น๊ณ , TLS ClientHello์ SNI๋ก ์ด๋ ๋ฐฑ์๋์ธ์ง ๊ฐ๋ฆ ๋๋ค.
- ์
๋ ฅ: ํด๋ผ์ด์ธํธ๊ฐ
redis-a.example.com:9443์ผ๋ก TLS ์ ์(SNI์ ๋๋ฉ์ธ ์ค๋ฆผ). - Kong: 9443 stream ๋ฆฌ์ค๋์์ TLS๋ฅผ ์ฒ๋ฆฌํ๊ณ , SNI๋ฅผ ๋ณด๊ณ
redis-a์๋น์ค๋ก ์ฐ๊ฒฐ. - ๊ฒฐ๊ณผ: LB ํฌํธ ํ๋(9443)๋ก ์ฌ๋ฌ ๋ฐฑ์๋๋ฅผ ๋๋ฉ์ธ๋ณ ๋ถ๋ฐฐ.
๐ก ์ ์ : ์ธ๋ถ IP๋ฅผ ์๋ ํ ๋นํ๋ LoadBalancer๊ฐ ์ด๋ฏธ ์ ๊ณต๋๋ ํ๊ฒฝ(ํด๋ผ์ฐ๋ LB, MetalLB ๋ฑ). ์์ผ๋ฉด NodePort๋ก๋ ๋์ง๋ง ์ด ๊ธ์ LoadBalancer ๊ธฐ์ค์ ๋๋ค.
๐ tls ๋ฆฌ์ค๋ vs stream ๋ฆฌ์ค๋ (๊ฐ์ฅ ํท๊ฐ๋ฆฌ๋ ์ง์ ) #
Kong values์์ proxy.tls์ proxy.stream์ ์์ ํ ๋ค๋ฅธ ๊ณ์ธต์
๋๋ค. ์ด๊ฑธ ํผ๋ํ๋ฉด raw TCP๋ฅผ HTTPS ๋ฆฌ์ค๋์ ๋ฌผ๋ฆฌ๋ ์ค์๋ฅผ ํฉ๋๋ค.
| ๊ตฌ๋ถ | proxy.tls | proxy.stream |
|---|---|---|
| ๊ณ์ธต | L7 (HTTP over TLS = HTTPS) | L4 (raw TCP/UDP) |
| ํ๋ ์ผ | TLS ํด์ ํ HTTP ์์ฒญ์ ํธ์คํธยท๊ฒฝ๋ก๋ก ๋ผ์ฐํ | HTTP๊ฐ ์๋ ๋ฐ์ดํธ ์คํธ๋ฆผ์ ๊ทธ๋๋ก ์ ๋ฌ |
| ๋ผ์ฐํ ๊ธฐ์ค | Host ํค๋ยท๊ฒฝ๋ก | SNI(๋๋ ํฌํธ) |
| ์ฉ๋ | ์น API, ์น์ฌ์ดํธ | RedisยทDBยทgRPC-raw ๋ฑ TCP |
| Gateway API ๋ผ์ฐํธ | HTTPRoute | TLSRoute / TCPRoute |
RedisยทDB๋ฅผ ์ธ๋ถ๋ก ๋ผ ๋ ํ์ํ ๊ฑด stream ์ชฝ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ stream ํฌํธ์ ssl์ ์น์ด์ผ SNI ๊ธฐ๋ฐ TLS ์คํธ๋ฆผ ๋ผ์ฐํ
์ด ๋ฉ๋๋ค.
HTTP(S) ์๋น์ค๋ผ๋ฉด ์ด ๊ธ์ด ์๋๋ผ Ingress โ Gateway API HTTPRoute ์ ํ์ด๋ Gateway API HTTPโHTTPS ๋ฆฌ๋ค์ด๋ ํธ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๐ Gateway API ๋ฒ์ : TCPRouteยทTLSRoute๋ ์ง๊ธ ์ด๋์? #
์ด ์์ญ์ ๋น ๋ฅด๊ฒ ๋ฐ๋๋๋ค. L4 ๋ผ์ฐํธ(TLSRouteยทTCPRouteยทUDPRoute)๋ ์ค๋ซ๋์ experimental์ด์๊ณ , ์ต๊ทผ์์ผ ๋จ๊ณ์ ์ผ๋ก GA๋ก ์น๊ฒฉ๋์ต๋๋ค.
| ๋ฆฌ์์ค | Standard(GA) ์ฑ๋ ์น๊ฒฉ | ๋น๊ณ |
|---|---|---|
| TLSRoute | Gateway API v1.5 (2026-02) | v1๋ก ์์ ํ |
| TCPRoute / UDPRoute | Gateway API v1.6 | ๊ทธ ์ (v1.5 ํฌํจ)๊น์ง experimental |
โ ๏ธ ํต์ฌ ํจ์ : ์ ์คํธ๋ฆผ ์คํ์ด GA์ฌ๋ Kong(KIC)์ด ๊ทธ ๋ฒ์ ์ ๋ฐ๋ผ์๋์ง๊ฐ ๊ด๊ฑด์ ๋๋ค. ํ์ฌ Kong Ingress Controller๋ TLSRouteยทTCPRouteยทUDPRoute๋ฅผ
v1alpha2API ๊ทธ๋ฃน +GatewayAlphaํผ์ฒ ๊ฒ์ดํธ + experimental CRD๋ก ๋ค๋ฃน๋๋ค. ์ฆ ์คํ์ Standard์ฌ๋ Kong์์๋ ์ฌ์ ํ experimental ์ฑ๋์ด ํ์ํ ์ ์์ต๋๋ค.
์ง๊ธ ๋ด ํด๋ฌ์คํฐ๋ ์ด๋ค ์ํ์ธ๊ฐ? (ํ์ธ ๋ช ๋ น) #
1# ์ค์น๋ Gateway API ๋ฒ๋ค ๋ฒ์
2kubectl get crd gateways.gateway.networking.k8s.io \
3 -o jsonpath='{.metadata.annotations.gateway\.networking\.k8s\.io/bundle-version}'
4
5# TLSRoute/TCPRoute CRD๊ฐ ์ ๊ณตํ๋ ๋ฒ์ (v1์ด ๋ณด์ด๋ฉด GA๋ณธ, v1alpha2๋ฟ์ด๋ฉด experimental)
6kubectl get crd tlsroutes.gateway.networking.k8s.io -o jsonpath='{.spec.versions[*].name}'
7kubectl get crd tcproutes.gateway.networking.k8s.io -o jsonpath='{.spec.versions[*].name}'experimental ๋ฆฌ์์ค๋ฅผ ์ฐ๋ ค๋ฉด experimental ๋ฒ๋ค ์ค์น + ์ปจํธ๋กค๋ฌ ํผ์ฒ ๊ฒ์ดํธ๊ฐ ํ์ํฉ๋๋ค.
1# experimental ์ฑ๋ CRD ์ค์น (TCPRoute/UDPRoute/TLSRoute ํฌํจ)
2kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.6.0/experimental-install.yaml1# KIC values ๋ฐ์ท โ ์ปจํธ๋กค๋ฌ์ GatewayAlpha ํผ์ฒ ๊ฒ์ดํธ ํ์ฑํ
2controller:
3 ingressController:
4 env:
5 feature_gates: "GatewayAlpha=true"โ ๏ธ ์ ๊ทธ๋ ์ด๋ ์ฃผ์: v1.4 ์ดํ์ experimental TLSRoute๊ฐ ์๋ ์ํ์์ v1.5 standard๋ฅผ ๋ฎ์ด ์ค์นํ๋ฉด, ๊ธฐ์กด ๋ฆฌ์์ค๊ฐ
v1alpha2๋ก ์ ์ฅ๋ผ ๋ชป ์ฐ๊ฒ ๋ ์ ์์ต๋๋ค. ๊ธฐ์กด ํด๋ฌ์คํฐ๋ฅผ ์ฌ๋ฆด ๋ ๋ง์ด๊ทธ๋ ์ด์ ๊ฒฝ๋ก๋ฅผ ๋จผ์ ํ์ธํ์ธ์.
Kong ์ค์น ์์ฒด๊ฐ ์ฒ์์ด๋ผ๋ฉด Kong Ingress Controller ์ค์น (Gateway API)๋ฅผ ๋จผ์ ๋ณด๊ณ ์ค์ธ์.
๐ ๏ธ Kong ์ค์น (Helm): NodePort โ LoadBalancer + stream ๋ฆฌ์ค๋ #
LoadBalancer ํ์
์ผ๋ก ๋ฐ๊พธ๊ณ , stream ๋ฆฌ์ค๋๋ฅผ ์ถ๊ฐํ๊ณ , TLS ํฌํธ์ ssl์ ์น๋ ๊ฒ์ด ํต์ฌ์
๋๋ค. ์์ NodePort ํ์ (nodePort: 30054 ๋ฑ)์ ๊ฑท์ด๋
๋๋ค.
1# kong values.yaml ๋ฐ์ท
2proxy:
3 type: LoadBalancer # NodePort โ LoadBalancer (์ธ๋ถ IP ์๋ ํ ๋น)
4 http:
5 enabled: true
6 servicePort: 80
7 containerPort: 8000
8 tls: # = HTTPS(L7) ๋ฆฌ์ค๋
9 enabled: true
10 servicePort: 443
11 containerPort: 8443
12 stream: # = raw TCP/TLS(L4) ์คํธ๋ฆผ ๋ฆฌ์ค๋
13 - containerPort: 9000
14 servicePort: 9000
15 protocol: TCP # ํ๋ฌธ TCP
16 - containerPort: 9443
17 servicePort: 9443
18 protocol: TCP
19 parameters:
20 - "ssl" # โ
์ด ํฌํธ๋ฅผ TLS ๋ฆฌ์ค๋๋ก โ SNI ๋ผ์ฐํ
์ ํ์ ์กฐ๊ฑดํฌ์ธํธ๋ฅผ ์ ๋ฆฌํ๋ฉด:
nodePort์ญ์ โ LoadBalancer๊ฐ ํฌํธ๋ฅผ ์๋ ํ ๋น. ํด๋ผ์ด์ธํธ๋LB์ธ๋ถIP:9443์ผ๋ก ์ ์.servicePort= ์ธ๋ถ ์ ์ ํฌํธ.containerPort= Kong ํ๋ ๋ด๋ถ ํฌํธ.parameters: ["ssl"]= ๊ทธ stream ํฌํธ๋ฅผ TLS๋ก ์ฒ๋ฆฌ(SNI๋ฅผ ์ฝ์ ์ ์๊ฒ ๋จ). ์ด๊ฒ ๋น ์ง๋ฉด Kong์ด ๊ทธ ํฌํธ๋ฅผ ํ๋ฌธ TCP๋ก ์ทจ๊ธํด TLS ํด๋ผ์ด์ธํธ์ ๋ฏธ์ค๋งค์น๊ฐ ๋ฉ๋๋ค.
๐ก
parameters์๋ssl์ธ์proxy_protocol,reuseport,backlog=N๋ฑ๋ ๋ฃ์ ์ ์๊ณ , Kong ๋ด๋ถ์KONG_STREAM_LISTEN์ ์๋ ๋ฐ์๋ฉ๋๋ค. ํ๊ฒฝ๋ณ์๋ฅผkubectl set env๋ก ์ง์ ๋ฃ์ผ๋ฉด ๋ค์ helm ๋ฐฐํฌ ๋ ๋ฎ์ฌ ์ฌ๋ผ์ง๋ฏ๋ก, ๋ฐ๋์ values์parameters๋ฅผ ์ฐ์ธ์.
๋ฐฐํฌ:
1helm upgrade --install kong kong/kong -n kong --create-namespace -f values.yaml๐ช Gateway + TLSRoute๋ก SNI ๋ถ๋ฐฐ ๊ตฌ์ฑ #
Gateway์ stream ๋ฆฌ์ค๋๋ฅผ ์ ์ธํ๊ณ , TLSRoute๋ก SNI(๋๋ฉ์ธ) โ ๋ฐฑ์๋๋ฅผ ๋งคํํฉ๋๋ค. ๋ฆฌ์ค๋ ํ๋กํ ์ฝ์ TLS์ ๋๋ค.
1๏ธโฃ GatewayClass & Gateway #
1apiVersion: gateway.networking.k8s.io/v1
2kind: Gateway
3metadata:
4 name: kong
5 namespace: kong
6spec:
7 gatewayClassName: kong
8 listeners:
9 - name: stream9443 # โ
์ด ์ด๋ฆ์ด Service ํฌํธ ์ด๋ฆ๊ณผ ์ ๋ ฌ๋ผ์ผ ํจ(ํจ์ โก)
10 port: 9443
11 protocol: TLS
12 hostname: "*.example.com" # SNI ์์ผ๋์นด๋
13 tls:
14 mode: Terminate # Kong์ด TLS ์ข
๋ฃ ํ SNI๋ก ๋ฐฑ์๋ ๋ถ๋ฐฐ
15 certificateRefs:
16 - kind: Secret
17 name: wildcard-example-com-tls
18 allowedRoutes:
19 kinds:
20 - kind: TLSRoute
21 namespaces:
22 from: Allmode: Terminateโ Kong์ด TLS๋ฅผ ํ๊ณ (์ธ์ฆ์ ํ์) SNI๋ก ๋ฐฑ์๋๋ฅผ ๊ณ ๋ฅธ ๋ค ํ๋ฌธ์ผ๋ก ์ ๋ฌ.mode: Passthroughโ Kong์ ๋ณตํธํํ์ง ์๊ณ SNI๋ง ๋ณด๊ณ ๊ทธ๋๋ก ๋ฐฑ์๋๋ก ํ๋ฆผ(๋ฐฑ์๋๊ฐ TLS๋ฅผ ์ง์ ์ฒ๋ฆฌ). ๋ฐฑ์๋ TLS๋ฅผ ์ ์งํด์ผ ํ๋ฉด ์ด์ชฝ.- ์ธ์ฆ์ Secret์ cert-manager๋ก ๋ฐ๊ธยท๊ด๋ฆฌํ๋ฉด ํธํฉ๋๋ค.
2๏ธโฃ TLSRoute (SNI โ ๋ฐฑ์๋) #
1apiVersion: gateway.networking.k8s.io/v1alpha2 # Kong์ ์์ง v1alpha2 (๋ฒ์ ํ์ธ!)
2kind: TLSRoute
3metadata:
4 name: redis-a
5 namespace: kong
6spec:
7 parentRefs:
8 - name: kong
9 sectionName: stream9443 # ์ Gateway ๋ฆฌ์ค๋ ์ด๋ฆ๊ณผ ์ผ์น
10 hostnames:
11 - "redis-a.example.com" # ์ด SNI๋ก ์จ ํธ๋ํฝ๋ง
12 rules:
13 - backendRefs:
14 - name: redis-a # ๋์ Service
15 port: 6379๋ฐฑ์๋๋ฅผ ํ๋ ๋ ๋๋ฆฌ๋ ค๋ฉด TLSRoute๋ง ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค(๊ฐ์ ๋ฆฌ์ค๋์ redis-b.example.com โ redis-b:6379). ํฌํธ๋ ๊ทธ๋๋ก 9443 ํ๋์
๋๋ค.
ํ๋ฌธ TCP(ํฌํธ๋ณ ๋ถ๋ฐฐ, SNI ๋ถํ์)๋ง ํ์ํ๋ฉด
protocol: TCP๋ฆฌ์ค๋ + TCPRoute๋ฅผ ์๋๋ค. ์ด๋ ๋๋ฉ์ธ์ด ์๋๋ผ ํฌํธ๋ก๋ง ๊ตฌ๋ถ๋ฉ๋๋ค.
๐ฅ๏ธ ์ ์ฉ์ ๋๋๋ฐ Kong Manager UI์ ์ ๋ณด์ผ ๋ #
๊ฒฐ๋ก ๋ถํฐ: GatewayยทGatewayClass ๋ฆฌ์์ค๋ ๋ฐ๋์ ํ์ํฉ๋๋ค. TLSRouteยทTCPRoute๊ฐ SNI๋ก ์ค์ ๋์ํ๋ค๋ ๊ฒ ์์ฒด๊ฐ Gateway๊ฐ ์กด์ฌํ๊ณ KIC๊ฐ ๊ทธ ์ค์ ์ Kong์ ๋ฐ์ํ๋ค๋ ์ฆ๊ฑฐ์ ๋๋ค. Kong Manager UI์์ ์กฐํ๋์ง ์๋ ๊ฑด “Gateway๊ฐ ์ ์ฐ์ฌ์"๊ฐ ์๋๋ผ, KIC์ DB-less ๊ตฌ์กฐ์ Manager๊ฐ ์ค์ ์ ์ ๋๋ก ๋ณด์ฌ์ฃผ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฆ “์กฐํ ์ ๋จ โ ์ค์ ์ ๋จ” ์ ๋๋ค.
์ Manager UI์ ์ ๋ณด์ด๋? โ DB-less ํ์ ํ๊ณ #
Kong Ingress Controller(KIC)๋ Kong์ DB-less ๋ชจ๋๋ก ์ด์ํฉ๋๋ค. ์ด ๋ชจ๋์์ Kong Manager๋:
- ์ฝ๊ธฐ ์ ์ฉ โ ์ํฐํฐ ์์ฑ/์์ /์ญ์ ๋ถ๊ฐ, ๊ฐ์(Summary) ํ๋ฉด์ ์ํฐํฐ ์นด์ดํฐ๋ ์ ์ ๋์ํ์ง ์์ต๋๋ค.
- ์ค์ ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋๋ผ ๋ฉ๋ชจ๋ฆฌ์ ์๊ณ , KIC๊ฐ K8s ๋ฆฌ์์ค(TLSRouteยทGateway ๋ฑ)๋ฅผ Kong ์ํฐํฐ๋ก ๋ฒ์ญํด ๋ฐํ์์ pushํฉ๋๋ค.
- ํนํ stream(TCP/TLS) ๋ผ์ฐํธ๋ UI๊ฐ ์ ์๊ฐํํ์ง ๋ชปํฉ๋๋ค.
๊ทธ๋์ Manager UI๋ “์ง์ค์ ์์ค"๊ฐ ์๋๋๋ค. ์ค์ ๋ฐ์ ์ฌ๋ถ๋ ์๋์ฒ๋ผ Admin API๋ก ํ์ธํด์ผ ํฉ๋๋ค.
flowchart LR
K["kubectl apply<br/>Gateway / TLSRoute"] --> KIC["KIC<br/>(Ingress Controller)"]
KIC -->|"๋ฒ์ญ ํ push"| MEM["Kong ๋ฉ๋ชจ๋ฆฌ ์ค์ <br/>(DB-less)"]
MEM --> ADMIN["Admin API :8001<br/>โ
์ฌ๊ธฐ์ ํ์ธ"]
MEM -.->|"์ฝ๊ธฐ์ ์ฉยทstream ๋ฏธํ์"| UI["Kong Manager UI<br/>โ ์ ๋ณด์ผ ์ ์์"]๊ทธ๋ผ Gateway CRD๋ ์ ํ์ํ๊ฐ? โ “๋ถ์ ๊ณณ"์ด ์์ด์ผ ํจ #
TLSRoute๋ ํผ์ ์กด์ฌํ ์ ์์ต๋๋ค. parentRefs๋ก ๋ฐ๋์ ์ด๋ค Gateway์ ๋ถ๊ณ , ๊ทธ Gateway๊ฐ kong GatewayClass๋ฅผ ๊ฐ๋ฆฌ์ผ์ผ KIC๊ฐ ์ง์ด์ Kong์ ํ๋ก๊ทธ๋๋ฐํฉ๋๋ค. Gateway๊ฐ ์์ผ๋ฉด ๋ผ์ฐํธ๋ ๊ณ ์(orphan) ๊ฐ ๋์ด ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์ต๋๋ค. ์ง๊ธ SNI๊ฐ ๋์ํ๋ค๋ฉด, ์ด๋ฏธ kubectl get gateway์ ๋ฌด์ธ๊ฐ ์กํ ์์ ๊ฒ์
๋๋ค.
flowchart LR
R["TLSRoute<br/>SNI โ ๋ฐฑ์๋"] -->|"parentRefs"| G["Gateway<br/>stream ๋ฆฌ์ค๋"]
G -->|"gatewayClassName"| GC["GatewayClass: kong"]
GC --> KIC["KIC๊ฐ watch"]
KIC -->|"ํ๋ก๊ทธ๋๋ฐ"| KONG["Kong<br/>(SNI ๋ผ์ฐํ
๋์)"]์ค์ ๋ก ๋ฐ์๋๋์ง ํ์ธํ๊ธฐ (Admin API) #
Manager UI ๋์ ๋ฆฌ์์ค ์ํ + Admin API ๋ก ํ์ธํฉ๋๋ค.
1# 1) Gateway/GatewayClass๊ฐ ์ค์ ๋ก ์๋์ง โ ์์ผ๋ฉด ์ด๋ฏธ Gateway๋ฅผ ์ฐ๋ ์ค
2kubectl get gatewayclass
3kubectl get gateway,tlsroute,tcproute -A
4
5# 2) ๋ผ์ฐํธ๊ฐ Gateway์ ์ ์ attach ๋๋์ง (status.parents์ conditions)
6kubectl get tlsroute redis-a -n kong -o yaml | yq '.status.parents'
7# Accepted=True, ResolvedRefs=True ๋ฉด ์ ์ ๋ฐ์ (Programmed/Attached ํ์ธ)
8
9# 3) Kong์ ์ค์ ๋ก ๋ค์ด๊ฐ๋์ง โ Manager UI๊ฐ ์๋๋ผ Admin API(:8001)๋ก
10kubectl exec -n kong deploy/kong-kong -c proxy -- \
11 curl -s localhost:8001/routes | jq '.data[] | {name, protocols, snis}'
12# โ protocols๊ฐ ["tls"] ๋๋ ["tcp"], snis์ redis-a.example.com ์ด ๋ณด์ด๋ฉด ์ ์
13
14kubectl exec -n kong deploy/kong-kong -c proxy -- \
15 curl -s localhost:8001/services | jq '.data[] | {name, protocol, host, port}'
16# โ ๋ฐฑ์๋ Service๊ฐ Kong Service๋ก ๋ฒ์ญ๋ผ ์๋์ง ํ์ธ๐ก ํ๋ยท์ปจํ ์ด๋ ์ด๋ฆ์ ์ฐจํธ ๋ฒ์ ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค(
kong-kong/ ์ปจํ ์ด๋proxy๋ฑ).kubectl get pods -n kong์ผ๋ก ์ค์ ์ด๋ฆ์ ๋จผ์ ํ์ธํ์ธ์. Admin API๋ ๋ณด์์localhost์๋ง ๋ฐ์ธ๋ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์kubectl exec๋ก ํ๋ ๋ด๋ถ์์ ํธ์ถํ๋ ๊ฒ ์์ ํฉ๋๋ค.
์์ธ: Gateway ์์ด TCP๋ฅผ ์ฌ๋ ์ ์ผํ ๊ธธ โ TCPIngress #
Gateway API CRD ์์ด TCP/TLS๋ฅผ ๋
ธ์ถํ๋ ๋ฐฉ๋ฒ์ด ๋ฑ ํ๋ ์๋๋ฐ, Kong ๋ค์ดํฐ๋ธ TCPIngress CRD(Gateway API๊ฐ ์๋ Kong ์ ์ฉ ๋ฆฌ์์ค)์
๋๋ค. ์ด๊ฑธ ์ฐ๋ฉด GatewayClassยทGateway๊ฐ ํ์ ์์ต๋๋ค. ๋ค๋ง Kong์ ์ข
์์ ์ด๋ผ ์ด์์ฑ์ด ๋จ์ด์ง๋ฏ๋ก, ํ์ค Gateway API(TLSRouteยทTCPRoute)๋ฅผ ์ฐ๋ ์ด ๊ธ ๊ตฌ์ฑ์์๋ Gateway๊ฐ ํ์์
๋๋ค.
โ ๏ธ ํต์ฌ ํจ์ 3๊ฐ์ง (์ง์ ๊ฒช์ ๊ฒ) #
โ stream ๋ฆฌ์ค๋์ ssl์ด ์์ผ๋ฉด โ TLS ๋ฏธ์ค๋งค์น
#
ํด๋ผ์ด์ธํธ๋ TLS๋ก ์ ์ํ๋๋ฐ Kong์ด ๊ทธ ํฌํธ๋ฅผ ํ๋ฌธ์ผ๋ก ๋ฐ์ผ๋ฉด, “๋ดํฌ๋ฅผ ์ฝ์๋ก ์ฝ์ผ๋ ค๋ค” ๊นจ์ง๋๋ค. ๋ํ ์ฆ์์ ssl: packet length too long. โ stream ๋ฆฌ์ค๋์ parameters: ["ssl"] ๋ก ํด๊ฒฐ.
โก Gateway ๋ฆฌ์ค๋ ์ด๋ฆ โ Service ํฌํธ ์ด๋ฆ ๋ถ์ผ์น #
- Gateway listener ์ด๋ฆ:
stream9443 - Helm์ด ๋ง๋ Service ํฌํธ ์ด๋ฆ:
stream-9443
์ด ๋์ด ์ด๊ธ๋๋ฉด Gateway๊ฐ ๋ฆฌ์ค๋๋ฅผ ์ค์ ํฌํธ์ ๋ชป ๋ฌถ์ด ์ฐ๊ฒฐ์ด ์ฑ๋ฆฝํ์ง ์์ต๋๋ค. ์ด๋ฆ์ ๋ง์ถฐ์ผ ํฉ๋๋ค(ํ์ ์ Service/Deployment๋ฅผ patchํด ํฌํธ ์ด๋ฆ ์ ๋ ฌ).
1# Service์ ์ค์ ํฌํธ ์ด๋ฆ ํ์ธ
2kubectl get svc -n kong kong-kong-proxy -o jsonpath='{.spec.ports[*].name}'; echoโข LoadBalancer IP ์ ์์ ๋ฐฉํ๋ฒฝ/๋ณด์๊ทธ๋ฃน์ ๋์ด์ผ ํจ #
ํฌํธํฌ์๋ฉ(Pod ์ง์ )์ ๋๋๋ฐ LB IP๋ก๋ง ์ ๋๋ฉด, ์ญ์คํ๊ตฌ ๊ฒฝ๋ก์์ ๋ฐฉํ๋ฒฝ์ ๋๋ค. ํด๋น ํฌํธ(9443)์ ์ธ๋ฐ์ด๋ ํ์ฉ์ ํ์ธํ์ธ์. (์ค์ ์ฌ๋ก์ ์ต์ข ์์ธ์ด ์ด๊ฒ์ด์์ต๋๋ค.)
๐ ๋๋ฒ๊น : ์๋ฌ๊ฐ ๋ฐ๋๋ฉด ํ ๋จ๊ณ ์ ์งํ ๊ฒ #
์ด ๋ฌธ์ ์ ํต์ฌ ๊ตํ์ “์๋ฌ ๋ฉ์์ง๊ฐ ๋ฐ๋๋ค๋ ๊ฑด ํ ํ ์์ผ๋ก ๊ฐ๋ค๋ ์ ํธ” ๋ผ๋ ์ ์ ๋๋ค. ์ค์ ๋ก ๊ฒช์ ์์:
| ๋จ๊ณ | ์ฆ์ | ์๋ฏธ | ์กฐ์น |
|---|---|---|---|
| 1 | ssl_connect: ... connection abort | ์ฐ๊ฒฐ์ด ๋๋ฌ์กฐ์ฐจ ๋ชป ํจ | ๋ฐฉํ๋ฒฝ/ํฌํธ ์ธ๋ฐ์ด๋ ์ด๊ธฐ |
| 2 | ssl: packet length too long | ์ฐ๊ฒฐ์ ๋จ, ํ๋กํ ์ฝ ๋ฏธ์ค๋งค์น(ํ๋ฌธ vs TLS) | stream parameters: ["ssl"] |
| 3 | timeout | ์๋ต ์์, ๋์/๊ฒฝ๋ก ์ด๊ธ๋จ | GatewayโService ํฌํธ ์ด๋ฆ ์ ๋ ฌ, ๋ฐฑ์๋ endpoints ํ์ธ |
| โ | ์ฐ๊ฒฐ ์ฑ๊ณต | โ | ๋ฐฉํ๋ฒฝ + ssl + ํฌํธ ์ด๋ฆ, ์ ๋ค ๋ง์์ผ |
ํ ๋จ์๋ก ๊ฒฉ๋ฆฌํด ์ขํ๊ธฐ #
“์ด๋ ํ์์ ๊นจ์ก๋"๋ฅผ ๊ฒฉ๋ฆฌ๋ก ์ขํ๋ ๊ฒ์ด ๊ฐ์ฅ ๋น ๋ฆ ๋๋ค. ์๋ ๊ฒฝ๋ก์์ ํ ํ์ฉ ๋์ด ํ ์คํธํฉ๋๋ค.
flowchart LR
CLI["ํด๋ผ์ด์ธํธ"] -->|"โก nc / openssl"| LBIP["LB ์ธ๋ถ IP<br/>:9443"]
LBIP --> FW{"๋ฐฉํ๋ฒฝ /<br/>ํฌํธ ์ด๋ฆ"}
FW --> KSVC["Kong Service"]
KSVC --> KPOD["Kong Pod<br/>stream:9443 (ssl)"]
KPOD --> BE["๋ฐฑ์๋<br/>redis-a:6379"]
KPOD -.->|"โ port-forward๋ก<br/>LB๋ฅผ ๊ฑด๋๋ฐ๊ณ ์ง์ "| CLI 1# (1) Kong ์์ฒด๊ฐ ์ ์์ธ์ง โ LB๋ฅผ ๊ฑด๋๋ฐ๊ณ Pod์ ์ง์
2kubectl port-forward -n kong <kong-pod> 9443:9443
3openssl s_client -connect 127.0.0.1:9443 -servername redis-a.example.com
4# โ ๋๋ฉด Kong์ ์ ์, ๋ฌธ์ ๋ LB ๊ฒฝ๋ก
5
6# (2) LB IP๋ก TCP๋ถํฐ (TLS ์ด์ ๋จ๊ณ)
7nc -vz <LB_IP> 9443
8# โ ์ ๋๋ฉด ๋ฐฉํ๋ฒฝ/ํฌํธ ๋ฏธ๋
ธ์ถ, ๋๋ฉด TLS ๋จ๊ณ ๋ฌธ์
9
10# (3) LB IP๋ก TLS ํธ๋์
ฐ์ดํฌ + SNI
11openssl s_client -connect <LB_IP>:9443 -servername redis-a.example.comํฌํธํฌ์๋ฉ์ ๋๋๋ฐ LB๋ง ์ ๋๋ฉด, ๋ฌธ์ ๋ ํญ์ LB โ Kong ์ฌ์ด(๋ฐฉํ๋ฒฝ / ํฌํธ ์ด๋ฆ / PROXY protocol)๋ก ์ขํ์ง๋๋ค.
๐ก ํด๋ผ์ด์ธํธ๊ฐ SNI๋ฅผ ๋ชป ๋ณด๋ด๋ ๋๊ตฌ๋ผ๋ฉด(์ผ๋ถ DB ํด๋ผ์ด์ธํธ), ๋ก์ปฌ์ stunnel ๋ฑ์ ๋๊ณ SNI๋ฅผ ๋ถ์ฌํด Kong์ผ๋ก ๋ณด๋ผ ์ ์์ต๋๋ค.
โ ๊ฒ์ฆ ์ฒดํฌ๋ฆฌ์คํธ #
1# ์ธ๋ถ IPยทํฌํธ๊ฐ ์ ๋๋ก ๋
ธ์ถ๋๋์ง (EXTERNAL-IP ์ค์ ๊ฐ, PORT(S)์ 9443)
2kubectl get svc -n kong
3
4# ๋ฐฑ์๋ Pod๊ฐ ์ค์ ๋ก ์กํ ์๋์ง (๋น์ด ์์ผ๋ฉด timeout์ ํํ ์์ธ)
5kubectl get endpoints -n kong
6
7# ๋ฆฌ์ค๋ ๋ฐ์๋๋์ง (patch ํ ๋กค์์)
8kubectl rollout status deploy/kong-kong -n kong-
proxy.type: LoadBalancer,nodePort์ ๊ฑฐ,servicePort์ง์ - stream ๋ฆฌ์ค๋์
parameters: ["ssl"](SNI์ฉ TLS) - Gateway ๋ฆฌ์ค๋ ์ด๋ฆ โ Service ํฌํธ ์ด๋ฆ ์ผ์น
- LB IP์ ํด๋น ํฌํธ ๋ฐฉํ๋ฒฝ ์ธ๋ฐ์ด๋ ํ์ฉ
- (ํด๋ผ์ด์ธํธ๊ฐ SNI ๋ชป ๋ณด๋ด๋ฉด) stunnel ๋ฑ์ผ๋ก SNI ๋ถ์ฌ
- Gateway API CRD ์ฑ๋/๋ฒ์ ๊ณผ Kong ์ง์ ๋ฒ์ (GatewayAlphaยทv1alpha2) ํ์ธ
๐ ๊ท๋ชจ๋ณ ๋ณํ #
๊ท๋ชจ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ์ง์ ๋ง ๋ชจ์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๊ธฐ๋ณธ ์ ์ ๋ LoadBalancer๊ฐ ์ ๊ณต๋๋ ํ๊ฒฝ์ ๋๋ค.
| ๊ตฌ๋ถ | ๋๊ท๋ชจ(๊ธฐ๋ณธ) | ์๊ท๋ชจ/๊ฐ์ธ |
|---|---|---|
| ์ธ๋ถ ๋ ธ์ถ | ํด๋ผ์ฐ๋ LB / MetalLB | NodePort๋ก๋ ๊ฐ๋ฅ |
| ๋ฆฌ์ค๋ | stream ํฌํธ ํ๋ + SNI ๋ค์ค ๋ฐฑ์๋ | ํฌํธ ๋ช ๊ฐ๋ฉด TCPRoute ํฌํธ ๋ถ๋ฐฐ๋ ๋ฌด๋ฐฉ |
| ์ธ์ฆ์ | cert-manager ์๋ ๋ฐ๊ธยท๊ฐฑ์ | ์๋ Secret๋ ๊ฐ๋ฅ |
| Gateway API | experimental ๊ด๋ฆฌยท๋ฒ์ ๊ณ ์ ์ด์ | ์ต์ ์คํ ์ฑ๋ ๊ทธ๋๋ก |
๐ก ์๊ท๋ชจ์์ ๋ฐฑ์๋๊ฐ 2~3๊ฐ๋ฟ์ด๊ณ ๋๋ฉ์ธ ๊ตฌ๋ถ์ด ํ์ ์์ผ๋ฉด, SNI ์์ด ํฌํธ๋ณ TCPRoute๊ฐ ๋ ๋จ์ํฉ๋๋ค. SNI ๋ถ๋ฐฐ๋ “ํฌํธ๋ ์๋ผ๊ณ ๋ฐฑ์๋๋ ๋ง์ด"๊ฐ ํ์ํ ๋ ๋น๋ฉ๋๋ค.
๐ค ์ธ์ ๋ฌด์์ ์ฐ๋ #
“HTTP๋ ์๋๋”, “๋๋ฉ์ธ์ผ๋ก ๊ฐ๋ฅด๋ ํฌํธ๋ก ๊ฐ๋ฅด๋” ๋ ์ถ์ผ๋ก ๊ฒฐ์ ๋ฉ๋๋ค.
| ์ํฉ | ์ ํ |
|---|---|
| HTTP/HTTPS APIยท์น | HTTPRoute (์ด ๊ธ ์๋ โ HTTPRoute ์ ํ ๊ธ) |
| TCP ์๋น์ค๋ฅผ ๋๋ฉ์ธ๋ณ๋ก ํ ํฌํธ์์ ๋ถ๋ฐฐ | stream(ssl) + TLSRoute + SNI (์ด ๊ธ) |
| TCP ์๋น์ค๋ฅผ ํฌํธ๋ณ๋ก ๋ถ๋ฐฐ(๋๋ฉ์ธ ๋ถํ์) | stream(TCP) + TCPRoute |
| ๋ฐฑ์๋ TLS๋ฅผ ๊ทธ๋๋ก ์ ์ง(์ข ๋จ๊ฐ ์ํธํ) | TLSRoute Passthrough |
| Kong์ด TLS ์ข ๋ฃ ํ ํ๋ฌธ ์ ๋ฌ | TLSRoute Terminate |
| gRPC์ L4/L7 ๋ก๋๋ฐธ๋ฐ์ฑ์ด ๊ณ ๋ฏผ | gRPC L4/L7 ๋ก๋๋ฐธ๋ฐ์ฑ ๊ธ |
โ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ #
Q. Ingress๋ก RedisยทDB๋ฅผ ์ธ๋ถ์ ๋ชป ์ฌ๋์? IngressยทHTTPRoute๋ HTTP(L7) ์ ์ฉ์ด๋ผ raw TCP๋ ์ ๋ฉ๋๋ค. TCP๋ stream ๋ฆฌ์ค๋ + TCPRoute/TLSRoute๋ฅผ ์จ์ผ ํฉ๋๋ค.
Q. packet length too long ์๋ฌ๋ ์ ๋๋์?
ํด๋ผ์ด์ธํธ๋ TLS์ธ๋ฐ Kong stream ํฌํธ๊ฐ ํ๋ฌธ(ssl ์์)์ด๋ผ ์๊ธฐ๋ ํ๋กํ ์ฝ ๋ฏธ์ค๋งค์น์
๋๋ค. parameters: ["ssl"]์ ์ถ๊ฐํ์ธ์.
Q. ํฌํธํฌ์๋ฉ์ ๋๋๋ฐ LB IP๋ก๋ง ์ ๋ฉ๋๋ค. ๋ฌธ์ ๋ LBโKong ์ฌ์ด์ ๋๋ค. ๋๊ฐ ๋ฐฉํ๋ฒฝ/๋ณด์๊ทธ๋ฃน ์ธ๋ฐ์ด๋(ํด๋น ํฌํธ ๋ฏธ๊ฐ๋ฐฉ)๋ ํฌํธ ์ด๋ฆ ๋ถ์ผ์น์ ๋๋ค.
Q. ์ ํฌํธ ํ๋(9443)์์ ์ฌ๋ฌ ๋ฐฑ์๋๊ฐ ๋๋์? TLS ClientHello์ SNI(๋๋ฉ์ธ) ๋ก Kong์ด ๋ฐฑ์๋๋ฅผ ๊ณ ๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐฑ์๋๋ฅผ ๋๋ ค๋ LB ํฌํธ๋ ๊ทธ๋๋ก์ ๋๋ค.
Q. Terminate์ Passthrough ์ค ๋ญ ์ฐ๋์? Kong์์ TLS๋ฅผ ํ๊ณ ํ๋ฌธ์ผ๋ก ์ ๋ฌํ๋ฉด Terminate, ๋ฐฑ์๋๊น์ง ์ํธํ๋ฅผ ์ ์งํ๋ ค๋ฉด Passthrough์ ๋๋ค.
Q. TLSRoute๋ฅผ applyํ๋๋ฐ ์ธ์์ด ์ ๋ฉ๋๋ค.
Kong์ ์์ง v1alpha2 + GatewayAlpha ํผ์ฒ ๊ฒ์ดํธ + experimental CRD๊ฐ ํ์ํ ์ ์์ต๋๋ค. CRD ๋ฒ์ ๊ณผ ์ปจํธ๋กค๋ฌ ํผ์ฒ ๊ฒ์ดํธ๋ฅผ ํ์ธํ์ธ์.
Q. kubectl๋ก TLSRoute๋ฅผ ์ ์ฉํ๊ณ ๋์๋ ํ๋๋ฐ Kong Manager UI์ ์ ๋ณด์
๋๋ค. Gateway๊ฐ ํ์ ์๋ ๊ฑด๊ฐ์?
์๋๋๋ค. KIC๋ Kong์ DB-less๋ก ์ด์ํด Manager UI๊ฐ ์ฝ๊ธฐ ์ ์ฉ์ด๊ณ stream ๋ผ์ฐํธ๋ฅผ ์ ํ์ํ์ง ๋ชปํ ๋ฟ, ์ค์ ์ ์ ์ ๋ฐ์๋ผ ์์ต๋๋ค. TLSRoute๊ฐ ๋ถ์ ๋์์ธ GatewayยทGatewayClass๋ ๋ฐ๋์ ํ์ํฉ๋๋ค(์์ผ๋ฉด ๋ผ์ฐํธ๊ฐ ๊ณ ์๊ฐ ๋์ด ๋์ ์์ฒด๊ฐ ์ ๋ฉ๋๋ค). ํ์ธ์ Manager๊ฐ ์๋๋ผ kubectl get gateway,tlsroute์ Kong Admin API(:8001) ๋ก ํ์ธ์. ์์ธํ ๋ด์ฉ์ ์ ์ฉ์ ๋๋๋ฐ Manager UI์ ์ ๋ณด์ผ ๋ ์ฐธ๊ณ .
Q. ํด๋ผ์ด์ธํธ๊ฐ SNI๋ฅผ ๋ชป ๋ณด๋ ๋๋ค. ๋ก์ปฌ์ stunnel ๋ฑ์ ๋๊ณ SNI๋ฅผ ๋ถ์ฌํด Kong์ผ๋ก ์ ๋ฌํ๋ฉด ๋ฉ๋๋ค.
๐ ์ฐธ๊ณ #
- Kong ์ฐจํธ values.yaml (
stream[].parameters) - Kong Ingress Controller โ Gateway API
- Kong Gateway ์ค์ ๋ ํผ๋ฐ์ค (
stream_listen) - Gateway API โ Getting started (๋ฆด๋ฆฌ์ค ์ฑ๋)
- Gateway API v1.5: Moving features to Stable (TLSRoute โ Standard)
- Gateway API โ TCP routing ๊ฐ์ด๋
- ๊ด๋ จ ๊ธ: Kong Ingress Controller ์ค์น (Gateway API)
- ๊ด๋ จ ๊ธ: Ingress โ Gateway API HTTPRoute ์ ํ
- ๊ด๋ จ ๊ธ: Gateway API๋ก HTTPโHTTPS ๋ฆฌ๋ค์ด๋ ํธ
- ๊ด๋ จ ๊ธ: Kubernetes cert-manager๋ก PKIยทTLS ์ธ์ฆ์ ๊ด๋ฆฌ