跳到主要内容

Overview

Envoy Gateway是一个用于将Envoy Proxy作为独立或基于 Kubernetes 的应用程序网关进行管理的开源项目

它由 EnvoyProxy 社区发起,联合 ContourEmissary 等基于 EnvoyAPI 网关开源项目及社区共同参与并维护,使用Gateway API资源用于配置语言,并提供一些自定义CRD以支持Envoy的高级功能

traffic

安装

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

快速开始

安装完成后,可以通过创建一个简单的 GatewayClassGatewayHTTPRoute 和示例应用来验证 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
}

也可以直接通过访问 LBIP 以访问后端服务,上面默认定义的 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