Overview
Envoy Gateway是一个用于将Envoy Proxy作为独立或基于 Kubernetes 的应用程序网关进行管理的开源项目
它由 EnvoyProxy 社区发起,联合 Contour,Emissary 等基于 Envoy 的 API 网关开源项目及社区共同参与并维护,使用Gateway API资源用于配置语言,并提供一些自定义CRD以支持Envoy的高级功能

安装
Envoy Gateway 可以通过多种方式安装,最常见的是使用 Helm 进行安装,其helm chart存储在 Docker Hub OCI 仓库中,包含 eg 本身的 CRD 以及最新的 Gateway API CRD
其版本号v0.0.0-latest表示最新版本,这里以1.5.0版本为例进行安装
helm install eg oci://docker.io/envoyproxy/gateway-helm --version v1.5.0 -n envoy-gateway-system --create-namespace
也可以先将helm repo拉取到本地,修改values.yaml文件,再进行安装
helm pull oci://registry-1.docker.io/envoyproxy/gateway-helm --version v1.5.0 --untar --untardir ./gateway-helm-1.5.0
安装后等待 Envoy Gateway 可用
~ kubectl wait --timeout=5m -n envoy-gateway-system deployment/envoy-gateway --for=condition=Available
快速开始
安装完成后,可以通过创建一个简单的 GatewayClass、Gateway、HTTPRoute 和示例应用来验证 Envoy Gateway 是否工作正常
~ kubectl apply -f https://github.com/envoyproxy/gateway/releases/download/latest/quickstart.yaml -n default
上面创建的Gateway定义 Envoy Gateway 将侦听其全局可路由 IP 地址上的端口 80 上的流量,以便于使用浏览器测试 Envoy Gateway。当 Envoy Gateway 发现其侦听器正在使用特权端口 (<1024) 时,它会在内部将其映射到非特权端口,以便 Envoy Gateway 不需要额外的权限。从下面的输出中可以看到,Gateway 监听端口 80 的流量其实被映射到了 Envoy 容器内的 10080 端口
查看部署的资源
~ kubectl get pod,svc -n default -l app=backend
NAME READY STATUS RESTARTS AGE
pod/backend-66549c5965-vgmz5 1/1 Running 0 78s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/backend ClusterIP 172.29.179.131 <none> 3000/TCP 8m51
获取 Gateway 关联的 Service 并访问
~ export ENVOY_SERVICE=$(kubectl get svc -n envoy-gateway-system --selector=gateway.envoyproxy.io/owning-gateway-namespace=default,gateway.envoyproxy.io/owning-gateway-name=eg -o jsonpath='{.items[0].metadata.name}')
~ kubectl -n envoy-gateway-system port-forward service/${ENVOY_SERVICE} 8888:80
Forwarding from 127.0.0.1:8888 -> 10080
Forwarding from [::1]:8888 -> 10080
测试通过 Envoy Gateway 请 求目标 App
~ curl --verbose --header "Host: www.example.com" http://localhost:8888/get
* Host localhost:8888 was resolved.
* IPv6: ::1
* IPv4: 127.0.0.1
* Trying [::1]:8888...
* Connected to localhost (::1) port 8888
> GET /get|pbcopy HTTP/1.1
> Host: www.example.com
> User-Agent: curl/8.7.1
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 200 OK
< content-type: application/json
< x-content-type-options: nosniff
< date: Mon, 15 Sep 2025 06:33:12 GMT
< content-length: 479
<
{
"path": "/get%7Cpbcopy",
"host": "www.example.com",
"method": "GET",
"proto": "HTTP/1.1",
"headers": {
"Accept": [
"*/*"
],
"User-Agent": [
"curl/8.7.1"
],
"X-Envoy-External-Address": [
"127.0.0.1"
],
"X-Forwarded-For": [
"192.168.65.89"
],
"X-Forwarded-Proto": [
"http"
],
"X-Request-Id": [
"4247e786-0b8e-46b2-910d-0c3f45894d20"
]
},
"namespace": "default",
"ingress": "",
"service": "",
"pod": "backend-66549c5965-vgmz5"
* Connection #0 to host localhost left intact
}
也可以直接通过访问 LB 的 IP 以访问后端服务,上面默认定义的 Service 类型是 LoadBalancer,等待 EXTERNAL-IP 出现
~ export GATEWAY_HOST=$(kubectl get svc/${ENVOY_SERVICE} -n envoy-gateway-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
~ curl --verbose --header "Host: www.example.com" http://$GATEWAY_HOST/get