メインコンテンツまでスキップ

Envoy Gatewayを検証してみた

· 約4分
Daichi Sato

envoy

佐藤です。

今回は、先日GAとなったEnvoy Gatewayの検証をしてみました。

Envoy Gatewayとは

Envoy Gateway は、EnvoyをスタンドアロンまたはKubernetesベースのアプリケーションゲートウェイとして管理するためのオープンソースプロジェクトです。

https://gateway.envoyproxy.io/

2022年5月にEnvoyの開発者であるMatt Klein氏のブログで発表され、2024年3月にGAとなりました。

EnvoyをベースにしたAPIゲートウェイにはContourEmissaryがありますが、共通のコアに統合するようです。

システムデザイン

eg-design https://gateway.envoyproxy.io/v1.0.0/

Kubernetesの場合は、Gateway APIを使用するようです。

Gateway APIはIngress APIの後継であり、より汎用的、表現力豊か、ロール指向となるように設計されているようです。

詳細については、下記のウェブサイトを参照してください。

https://gateway-api.sigs.k8s.io/

試してみる

EC2で実施しました。

事前にDocker、kindkubectlHelmがインストールされている前提です。

kindでクラスターを作成します。

kind create cluster

LoadBalancerサービスを作成出来るように、MetalLBをインストールします。

kindのドキュメントを参考にしました。

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.4/config/manifests/metallb-native.yaml
docker network inspect -f '{{.IPAM.Config}}' kind
kubectl apply -f https://kind.sigs.k8s.io/examples/loadbalancer/metallb-config.yaml

Gateway API CRDと Envoy Gatewayをインストールします。

helm install eg oci://docker.io/envoyproxy/gateway-helm --version v1.0.0 -n envoy-gateway-system --create-namespace

GatewayClass、Gateway、HTTPRoute、およびサンプルアプリをインストールします。

kubectl apply -f https://github.com/envoyproxy/gateway/releases/download/v1.0.0/quickstart.yaml -n default
$ kubectl get gatewayclass
NAME CONTROLLER ACCEPTED AGE
eg gateway.envoyproxy.io/gatewayclass-controller True 12m

$ kubectl get gateway -n default
NAME CLASS ADDRESS PROGRAMMED AGE
eg eg 172.19.255.200 True 12m

❯ kubectl get service -n default
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
backend ClusterIP 10.102.240.254 <none> 3000/TCP 13m

❯ kubectl get deployment -n default
NAME READY UP-TO-DATE AVAILABLE AGE
backend 1/1 1 1 13m

$ kubectl get httproute -n default
NAME HOSTNAMES AGE
backend ["www.example.com"] 13m

$ kubectl get service -n envoy-gateway-system -l gateway.envoyproxy.io/owning-gateway-namespace=default,gateway.envoyproxy.io/owning-gateway-name=eg
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
envoy-gateway-system envoy-default-eg-e41e7b31 LoadBalancer 10.96.174.9 172.19.255.200 80:30643/TCP 15s

テストします。

ポートフォワードを行い、HTTPリクエストを行います。

kubectl -n envoy-gateway-system port-forward service/envoy-default-eg-e41e7b31 8888:80 &
$ curl --verbose --header "Host: www.example.com" http://localhost:8888/get
* Trying [::1]:8888...
* Connected to localhost (::1) port 8888
> GET /get HTTP/1.1
> Host: www.example.com
> User-Agent: curl/8.3.0
> Accept: */*
>
< HTTP/1.1 200 OK
< content-type: application/json
< x-content-type-options: nosniff
< date: Tue, 26 Dec 2023 15:35:28 GMT
< content-length: 508
< x-envoy-upstream-service-time: 0
< server: envoy
<
{
"path": "/get",
"host": "www.example.com",
"method": "GET",
"proto": "HTTP/1.1",
"headers": {
"Accept": [
"*/*"
],
"User-Agent": [
"curl/8.3.0"
],
"X-Envoy-Expected-Rq-Timeout-Ms": [
"15000"
],
"X-Envoy-Internal": [
"true"
],
"X-Forwarded-For": [
"10.244.0.9"
],
"X-Forwarded-Proto": [
"http"
],
"X-Request-Id": [
"50f90cdd-9e2b-42e7-960e-9076491a2f15"
]
},
"namespace": "default",
"ingress": "",
"service": "",
"pod": "backend-5cbb9cd947-jqznq"
* Connection #0 to host localhost left intact
}
$ kubectl logs envoy-default-eg-e41e7b31-5cfc544bc6-8p4d6 -c envoy -n envoy-gateway-system
[2024-04-03 03:04:59.234][1][warning][main] [source/server/server.cc:910] There is no configured limit to the number of allowed active downstream connections. Configure a limit in `envoy.resource_monitors.downstream_connections` resource monitor.
{"start_time":"2024-04-03T03:08:54.522Z","method":"GET","x-envoy-origin-path":"/get","protocol":"HTTP/1.1","response_code":"200","response_flags":"-","response_code_details":"via_upstream","connection_termination_details":"-","upstream_transport_failure_reason":"-","bytes_received":"0","bytes_sent":"452","duration":"1","x-envoy-upstream-service-time":"-","x-forwarded-for":"10.244.0.9","user-agent":"curl/8.5.0","x-request-id":"6f3ea943-ca9f-4e71-afa5-842970101665",":authority":"www.example.com","upstream_host":"10.244.0.8:3000","upstream_cluster":"httproute/default/backend/rule/0","upstream_local_address":"10.244.0.9:44718","downstream_local_address":"127.0.0.1:10080","downstream_remote_address":"127.0.0.1:59344","requested_server_name":"-","route_name":"httproute/default/backend/rule/0/match/0/www_example_com"}

$ kubectl logs backend-96f75bbf-f4rsg
Starting server, listening on port 3001 (h2c)
Starting server, listening on port 3000 (http)
Echoing back request made to /get to client (10.244.0.9:44718)

Envoyを通じてサンプルアプリケーションへとリクエストが到達していることを確認出来ました。

所感

Gateway APIとEnvoy Gatewayはまだ新しく、しばらく主流はIngress APIおよびIngress NGINX Controllerであると考えられます。

ただ、より表現力豊かなAPIを使用したい・ロール別にリソースを分けたい・Envoyをすでに利用していてゲートウェイもEnvoyに統一したいなどの要件があれば、採用しても良いのではないかと考えています。

今後も情報を追っていきます。