[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.yaml
apiVersion: 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.yaml
apiVersion: 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/

Search