[k8s] Envoy Gateway
Envoy Gateway๋ ์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๋ envoy ๊ธฐ๋ฐ ํ๋ก์ ์คํ์ด๋ค.
์์ ํ ์คํ์์ค๋ค.
envoy๋ฅผ ๊ฒ์ดํธ์จ์ด ํํ๋ก ๋ฐฐํฌํ๊ณ , ์๋น์ค๋ค ๊ฒ์ดํธ์จ์ด route ํํ๋ก ๊ฐ๋ค ๋ถ์ด๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
๋๋ถ์ด envoy์์ ์ง์ํ๋ ๊ณ ๊ธ ๋ก๋๋ฐธ๋ฐ์ฑ ์๊ณ ๋ฆฌ์ฆ, rate limit, SSL ๋ฐ ๋ณด์ ์ธ๊ฐ ์ฒ๋ฆฌ ๋ฑ ๊ฒ์ดํธ์จ์ด์ ํ์ํ ๊ฒ๋ค์ ๋๊ฐ ๋ค ์ง์ํ๋ค.
๊ทธ๋ฅ ๊ฐ๋จํ ๊ฒ๋ง ์จ๋ ๋๋ค๋ฉด traefik์ ์ฐ๋ฉด ๋๊ณ , ๋ ๊ณ ๊ธ LB ๊ธฐ๋ฅ๋ค์ด ํ์ํ๋ค๋ฉด ์ด๊ฒ ๋ ์ ์ ํ๋ค.
์ค์น
helm์ผ๋ก ๊น๋๊ฒ ํธํ๋ค.
helm install eg oci://docker.io/envoyproxy/gateway-helm --version v1.9.1 -n envoy-gateway-system --create-namespace
kubectl wait --timeout=5m -n envoy-gateway-system deployment/envoy-gateway --for=condition=Available


์ค์นํ๋ฉด ์ด๋ฐ ์์ผ๋ก ์ปจํธ๋กคํ๋ ์ธ ๊ด๋ จ ๋ฆฌ์์ค๋ค์ด ๋ ์์ ๊ฒ์ด๋ค.
kubectl get all -n envoy-gateway-system

์ ์ฉ ์ด๋๋ฏผ
๊ทธ๋ ๊ฒ ๋๋จํ์ง ์์ง๋ง ๋์๋ณด๋๋ ์ง์ํ๋ค.
127.0.0.1๋ก ๋ฐ์ธ๋ฉ๋ผ์์ด์ ํฌํธํฌ์๋ฉํด๋๊ณ ๋ด์ผํ๋ค.
kubectl -n envoy-gateway-system port-forward deploy/envoy-gateway 19000:19000

๊ทธ๋ผ ์ด๋ ๊ฒ ๋ฌ๋ค. ํฌํธ๋ 19000์ด๋ค.
์ฌ์ค ๋ณ๊ฑด ์๊ณ ui๋ ์ข ์ด์ค๋ฝ๋ค.
๊ฒ์ดํธ์จ์ด ํด๋์ค ์ ์
์ด๊ฒ๋ถํฐ ๋ง๋ค์ด์ผ ํ๋ค. ์ด๋ค ๊ฒ์ดํธ์จ์ด ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง๋ฅผ ์ง์ ํ๋ ์นดํ ๊ณ ๋ฆฌ ๊ฐ์ด๋ค.
kubectl apply -f gateway-class.yamlapiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: eg
spec:
controllerName: gateway.envoyproxy.io/gatewayclass-controller
์ด๋ ๊ฒ ๋ง๋ค๋ฉด eg๋ผ๋ ์ด๋ฆ์ผ๋ก ๊ฒ์ดํธ์จ์ด๋ฅผ ์์ฑํ์๋, envoy controller ๊ตฌํ์ฒด๊ฐ ์๋์ผ๋ก ๋ถ๋ ๊ฒ์ด๋ค.
๊ฒ์ดํธ์จ์ด ์์ฑ
์ด๊ฒ ์ค์ง์ ์ธ ํ๋ก์/๊ฒ์ดํธ์จ์ด๋ฅผ ์์ฑํ๋ ์์ ์ด๋ค.
๋ฐฉ๊ธ ์ ์ํ class๋ฅผ ๊ฐ์ง๊ณ ์ ๋นํ ์ ์ํด์ฃผ๋ฉด ๋๋ค.
kubectl apply -f public-gateway.yamlapiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: public-gateway
namespace: default
spec:
gatewayClassName: eg
listeners:
- name: http
protocol: HTTP
port: 80

๊ทธ๋ฌ๋ฉด Service์ deployment๋ฅผ ์๋์ผ๋ก ๋ง๋ค์ด์ค๋ค.

๊ทธ๋ฆฌ๊ณ ์ด๋๋ฏผ์์๋ ํ์ธํ ์ ์์ ๊ฒ์ด๋ค.
Route ์์ฑ
๋น์ฐํ ๊ฒ์ดํธ์จ์ด๋ง ๋๋ ์๋ค๊ณ ๋ญ๊ฐ ๋์ง ์๋๋ค.
์ค์ ๋ก ์๋น์ค๋ฅผ ๋ถ์ด๋ ๊ฒ์ HTTPRoute๋ผ๋ ๋ฆฌ์์ค๋ฅผ ํตํด ์ฒ๋ฆฌ๋๋ค.
ํ๋์ ๊ฒ์ดํธ์จ์ด์๋ ์ฌ๋ฌ๊ฐ์ HTTPRoute๋ฅผ ๋ถ์ฌ์ ์ฌ์ฉํ ์ ์๋ค.
๋ค์์ nginx ํ๋ ๋์์ ๋ถ์ด๋ ๊ฐ๋จํ ๊ตฌ์ฑ์ด๋ค.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-test
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx-test
template:
metadata:
labels:
app: nginx-test
spec:
containers:
- name: nginx
image: nginx:1.27-alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-test
namespace: default
spec:
selector:
app: nginx-test
ports:
- port: 80
targetPort: 80
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: nginx-test
namespace: default
spec:
parentRefs:
- name: public-gateway
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: nginx-test
port: 80
์ด ๊ฒฝ์ฐ์๋ nginx-test๋ผ๋ ์๋น์ค๋ฅผ ๊ฐ๋ฆฌํค๊ณ , ๊ทธ๊ฑธ ๊ฒ์ดํธ์จ์ด์ ๋ฃจํธ ํจ์ค๋ก ๋ถ์ด๋๋ก ํ๋ค.
prefix๋ ์ํ๋๋๋ก ๋ถ์ด๋ฉด ๋๋ค.
๊ทธ๋ ๊ฒ ๋์๋ณด๋ฉด
์ ๋ถ์ ๊ฒ์ด๋ค.
BackendTrafficPolicy
์ด๊ฑด LB ๊ท์น์ ์ง์ ํ ์ ์๋ ๋ณ๊ฐ ๋ฆฌ์์ค ๋จ์๋ค.
๋ก๋๋ฐธ๋ฐ์ฑ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ๊ธฐ์ ๊ณ ๋ฅผ ์ ์๋ค.
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: BackendTrafficPolicy
metadata:
name: nginx-test
namespace: default
spec:
targetRefs:
- group: gateway.networking.k8s.io
kind: HTTPRoute
name: nginx-test
loadBalancer:
type: RoundRobin
์ด๊ฑด HTTPRoute ๋จ์์ ์ข ์๋๋ฉฐ, ์ฌ๊ธฐ์ ์ค์ ํ ๊ฐ์ ๋ฐ๋ผ์ ์์ฒญ ๋ถ์ฐ ๋ฐฉ์์ด ๋ฌ๋ผ์ง๋ค.
RoundRobin, Random, LeastRequest ๋ฑ์ด ์ง์๋๋ค.
๋์ผ Path, ๋ค๋ฅธ DNS
๊ทผ๋ฐ ๊ฒ์ดํธ์จ์ด์ ๋งค๋ฒ ๋ค๋ฅธ ์๋ธpath๋ก ์๋น์ค๋ฅผ ๋ถ์ด๋ ๊ฒ๋ ์ง์ฆ๋๋ ์ผ์ด๋ค.
์ด์ฐจํผ ๋๋ฉ์ธ์ ๋ถ์ผ๊ฑฐ๋ผ๋ฉด ๋๋ฉ์ธ ๊ธฐ๋ฐ์ผ๋ก ๋ผ์ฐํ
์ ํ ์๋ ์๋ค.
homename์ ์ฌ์ฉํ๋ฉด ๋๋ค.

์ด๋ ๊ฒ ์กฐ๊ฑด์ ๊ฑธ๋ฉด
๊ทธ๋ฅ์ ์ ๊ทผ์ด ์๋๊ณ
๋๋ฉ์ธ์ ๋ถ์ด๋ฉด

๋๋ฉ์ธ ๋ฌ๊ณ ์ฌ๋๋ง ๊ทธ ๋๋ฉ์ธ(ํธ์คํธ๋ค์) ๊ธฐ์ค์ผ๋ก ๋ถ๊ธฐ๋ฅผ ์ณ์ค ๊ฒ์ด๋ค.
๊ฝค ์์ฃผ ์ฌ์ฉ๋๋ ํจํด์ด๋ค.
์ฐธ์กฐ
https://gateway.envoyproxy.io/docs/concepts/
https://gateway.envoyproxy.io/docs/concepts/gateway_api_extensions/backend-traffic-policy/
https://gateway.envoyproxy.io/docs/tasks/traffic/backend/