在云原生架构中,服务网格和 API 网关是构建现代化微服务的关键组件。作为 CNCF 毕业项目 Envoy 的官方子项目,Envoy Gateway (EG) 凭借其与 Kubernetes 原生 API(Gateway API)的深度集成,正成为新一代网关的重要选择。本文将指导你从零开始,部署并配置 Envoy Gateway,并通过一个完整示例快速掌握其核心用法。

前提条件
- 一个可用的 Kubernetes 集群。
- 客户端已安装并配置好
kubectl 命令行工具。
- 已部署 Envoy Gateway 控制平面。若未部署,可参考相关部署指南进行安装。作为云原生生态中的重要一环,掌握其部署是第一步。
部署示例 Web 应用
-
部署简单 Web 应用
首先,我们创建一个简单的 Deployment 和 Service 作为后端服务。
cat << 'EOF' | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: simple
spec:
selector:
matchLabels:
app: simple
template:
metadata:
labels:
app: simple
spec:
containers:
- image: core.jiaxzeng.com/jiaxzeng/simple:v1.4.3
imagePullPolicy: Always
name: simple
imagePullSecrets:
- name: harbor-admin-secret
---
apiVersion: v1
kind: Service
metadata:
name: simple
spec:
selector:
app: simple
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8090
EOF
-
验证服务
部署完成后,验证服务是否正常运行。
$ kubectl get svc simple
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
simple ClusterIP 10.105.166.245 <none> 80/TCP 3m39s
$ curl 10.105.166.245:80/version
{"BuildTime":"2025-09-11","CommitID":"668bb13195e51a0020c416901a3c5ef38264b945","Version":"v1.4.3"}
通过 Envoy Gateway 暴露服务
-
创建 GatewayClass 资源
GatewayClass 定义了共享配置的网关类。如果集群中已存在,可忽略此步。
cat << 'EOF' | kubectl apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: envoy-proxy-gwc
spec:
# 此值需与 Envoy Gateway 控制器配置中的 `gateway.controllerName` 参数一致
controllerName: gateway.envoyproxy.io/gatewayclass-controller
EOF
-
创建 Gateway 资源
Gateway 资源在特定命名空间中实例化一个网关,并配置监听器。
cat <<'EOF' | kubectl apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: simple-gw
spec:
# 关联上述创建的 GatewayClass
gatewayClassName: envoy-proxy-gwc
# 配置 Envoy 监听端口
listeners:
- name: http
protocol: HTTP
port: 80
EOF
提示:
- Gateway 资源是命名空间级别的。
- 此处配置 Envoy 监听 80 端口,但外部访问的实际端口由对应的 Service 类型决定(如 NodePort 或 LoadBalancer)。
-
配置流量路由 (HTTPRoute)
HTTPRoute 资源定义了如何将到达网关的流量路由到后端服务。
cat <<'EOF' | kubectl apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: simple
spec:
# 关联对应的 Gateway
parentRefs:
- name: simple-gw
# 配置访问规则:将指定域名的流量路由到后端服务
hostnames:
- "simple.jiaxzeng.com"
rules:
- backendRefs:
- group: ""
kind: Service
name: simple
port: 80
matches:
- path:
type: PathPrefix
value: /
EOF
-
验证网关配置
配置完成后,查看 Envoy Proxy Pod 和对应的 Service,获取访问地址。
# 获取 Envoy Proxy Pod 的 IP
$ kubectl -n envoy-gateway-system get pod -owide -l gateway.envoyproxy.io/owning-gateway-name=simple-gw
NAME READY STATUS RESTARTS AGE IP NODE
envoy-default-simple-gw-d9e70e75-56689dbc76-8828x 2/2 Running 0 26m 10.244.85.208 k8s-node01
# 获取网关服务的外部访问端口(本例为 NodePort)
$ kubectl -n envoy-gateway-system get svc -l gateway.envoyproxy.io/owning-gateway-name=simple-gw
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
envoy-default-simple-gw-d9e70e75 LoadBalancer 10.96.93.31 <pending> 80:30874/TCP 25m
根据上述信息,可以通过 http://<Node_IP>:30874 并设置 Host 头为 simple.jiaxzeng.com 来访问您的应用,这与许多传统 Ingress 控制器的使用体验相似,但底层是基于更现代、更灵活的 Gateway API 标准。

结语
Envoy Gateway 以 Gateway API 为核心,将 Envoy 高性能的代理能力与 Kubernetes 的原生化管理体验深度融合,显著降低了在云原生环境中部署和管理现代化 API 网关的复杂度。无论是为全新项目进行技术选型,还是计划渐进式地替换现有的 Ingress 控制器,Envoy Gateway 都是一个极具潜力和价值的选择。
|