Gateway—— 高级流量路由

作者:离恨烟~日期:2026/3/1

0 前言

Gateway API 是 Kubernetes 官方推出的下一代流量管理标准,旨在解决传统 Ingress 在协议支持、扩展性和多租户等方面的不足。它通过 GatewayClass、Gateway、HTTPRoute 等 CRD 实现流量治理的分层解耦,让基础设施和应用团队各司其职。本章将以若依项目为例,实战部署 Envoy Gateway 并实现高级流量路由。

1 Gateway的概念

1.1 什么是Gateway

Gateway API 是 Kubernetes 官方下一代“流量入口”标准,用来统一网关、负载均衡和路由管理。它通过一组新的 CRD 拆分了 Ingress 的角色和功能,使其更灵活、更可扩展、也更易于团队协作。

1.2 资源类型

Gateway API 具有四种稳定的 API 类别:

  • GatewayClass: 定义网关的类型,实现网关的控制器管理(如 Envoy, Istio, Nginx )。
  • Gateway: 定义流量处理基础设施(例如云负载均衡器)的一个实例
  • HTTPRoute: 定义特定于 HTTP 的规则,用于将流量从 Gateway 监听器映射到后端网络端点的某种呈现。 这些端点通常表示为 Service。
  • GRPCRoute: 定义特定于 gRPC 的规则,用于将流量从 Gateway 监听器映射到后端网络端点的某种呈现。 这些端点通常表示为 Service。

1.3 Gateway 和 ingress 的区别

维度IngressGateway API
协议仅 HTTPHTTP/TCP/UDP/TLS/GRPC
扩展依赖 annotation原生扩展字段
架构单一资源多层:Class/Gateway/Route
多租户不支持强支持(网关与路由权限分离)
服务网格支持不直观深度整合(Nginx、Istio、Envoy)
标准化强、实现更一致

1.4 数据流向

请添加图片描述

2 环境准备

此实验所使用的是 k8s-v1.23

节点IP角色
master01192.168.10.80控制平面
node01192.168.10.81工作节点
node02192.168.10.82工作节点
MySQL192.168.10.83数据库

3 镜像准备

3.1 拉取镜像

1docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openjdk:8-jdk && docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openjdk:8-jdk openjdk:8-jdk
2
3docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/nginx:1.25 && docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/nginx:1.25 nginx:1.25
4
5docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/redis:6.2.17 && docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/redis:6.2.17  redis:6.2.17
6
7docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/envoyproxy/gateway:v1.0.0 && docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/envoyproxy/gateway:v1.0.0  envoyproxy/gateway:v1.0.0
8
9docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/envoyproxy/envoy:distroless-v1.29.2 && docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/envoyproxy/envoy:distroless-v1.29.2 envoyproxy/envoy:distroless-v1.29.2
10
11docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/envoyproxy/gateway-dev:72c0cc7 && docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/envoyproxy/gateway-dev:72c0cc7 envoyproxy/gateway-dev:72c0cc7
12

3.2 后端镜像

1# 安装工具
2yum install -y maven npm
3
4# 下载ry
5git clone https://gitee.com/y_project/RuoYi-Vue.git
6
7# 修改配置
8vim RuoYi-Vue/ruoyi-admin/src/main/resources/application-druid.yml
9-----------------------------------------------------------------------------------------
10spring:
11  datasource:
12    type: com.alibaba.druid.pool.DruidDataSource
13    driverClassName: com.mysql.cj.jdbc.Driver
14    druid:
15      master:
16        url: ${SPRING_DATASOURCE_URL}
17        username: ${SPRING_DATASOURCE_USERNAME}
18        password: ${SPRING_DATASOURCE_PASSWORD}
19#----------------------------------------------------------------------------------------
20vim RuoYi-Vue/ruoyi-admin/src/main/resources/application.yml
21-----------------------------------------------------------------------------------------
22spring:
23  redis:
24    host: ${SPRING_REDIS_HOST}       # K8s 内部 Service 名称
25    port: ${SPRING_REDIS_PORT}
26    database: 0
27    password:
28    timeout: 10s
29#----------------------------------------------------------------------------------------
30# 本地打包
31cd /opt/ry/RuoYi-Vue
32mvn clean package
33
34# 构建推送
35cd /opt/ry/RuoYi-Vue/ruoyi-admin/target
36vim Dockerfile
37-----------------------------------------------------------------------------------------
38FROM openjdk:8-jdk
39WORKDIR /app
40COPY ruoyi-admin.jar app.jar
41EXPOSE 8080
42ENTRYPOINT ["java","-Djava.awt.headless=true","-jar","app.jar"]
43#----------------------------------------------------------------------------------------
44docker build -t ruoyi-admin:v1.0 .
45docker push ruoyi-admin:v1.0
46
47# 将镜像传给node节点
48docker save -o ruoyi-admin-v1.0.tar ruoyi-admin:v1.0
49scp ruoyi-admin-v1.0.tar root@node01:/opt
50scp ruoyi-admin-v1.0.tar root@node02:/opt
51
52docker load -i ruoyi-admin-v1.0.tar
53

3.3 前端镜像

1# 构建镜像
2cd ruoyi-ui
3npm install
4npm run build:prod
5
6# 编写配置文件
7vim nginx.conf
8-----------------------------------------------------------------------------------------
9server {
10    listen 80;
11
12    location / {
13        root   /usr/share/nginx/html;
14        index  index.html;
15        try_files $uri $uri/ /index.html;
16    }
17
18    location /prod-api/ {
19        proxy_pass http://ruoyi-admin:8080/;
20        proxy_set_header Host $host;
21        proxy_set_header X-Real-IP $remote_addr;
22    }
23}
24#----------------------------------------------------------------------------------------
25
26vim Dockerfile
27-----------------------------------------------------------------------------------------
28FROM nginx:1.25
29COPY dist/ /usr/share/nginx/html/
30COPY nginx.conf /etc/nginx/conf.d/default.conf
31#----------------------------------------------------------------------------------------
32
33# 构建推送
34docker build -t ruoyi-ui:v1.0 .
35docker push ruoyi-ui:v1.0
36
37# 将镜像传给node节点
38docker save -o ruoyi-ui-v1.0.tar ruoyi-ui:v1.0
39scp ruoyi-ui-v1.0.tar root@node01:/opt
40scp ruoyi-ui-v1.0.tar root@node02:/opt
41
42docker load -i ruoyi-ui-v1.0.tar
43

4 部署前后端数据库

4.1 部署MySQL 数据

1# 登入数据库
2mysql -uroot -p123456
3
4# 创建一个 ry 的数据库
5CREATE DATABASE ry DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
6# 查看库
7SHOW DATABASES;
8# 退出库
9CTRL+D
10
11# 下载若依数据库脚本
12git clone https://gitee.com/y_project/RuoYi-Vue.git
13
14cd RuoYi-Vue/sql
15
16# 导入数据
17mysql -uroot -p ry < ry_*.sql
18mysql -uroot -p ry < quartz.sql
19
20# 验证
21USE ry;
22SHOW TABLES;
23
24# 开启远程访问(修改后重启 systemctl restart mysqld )
25vim /etc/my.cnf
26-----------------------------------------------------------------------------------------
27bind-address = 0.0.0.0
28
29# 授权远程访问
30CREATE USER 'ruoyi'@'%' IDENTIFIED BY '123456';
31GRANT ALL PRIVILEGES ON ry.* TO 'ruoyi'@'%';
32FLUSH PRIVILEGES;
33
34# 验证远程连接
35mysql -h 192.168.10.83 -u ruoyi -p
36

4.2 完整 K8s YAML

1vim ruoyi-full.yaml
2-----------------------------------------------------------------------------------------
3apiVersion: v1
4kind: Namespace
5metadata:
6  name: ruoyi
7---
8apiVersion: apps/v1
9kind: Deployment
10metadata:
11  name: redis
12  namespace: ruoyi
13spec:
14  replicas: 1
15  selector:
16    matchLabels:
17      app: redis
18  template:
19    metadata:
20      labels:
21        app: redis
22    spec:
23      containers:
24      - name: redis
25        image: redis:6.2.17
26        ports:
27        - containerPort: 6379
28---
29apiVersion: v1
30kind: Service
31metadata:
32  name: redis
33  namespace: ruoyi
34spec:
35  selector:
36    app: redis
37  ports:
38  - port: 6379
39---
40apiVersion: v1
41kind: ConfigMap
42metadata:
43  name: ruoyi-config
44  namespace: ruoyi
45data:
46  "SPRING_DATASOURCE_URL: jdbc:mysql://192.168.10.83:3306/ry?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai"
47  SPRING_DATASOURCE_USERNAME: "ruoyi"
48  SPRING_DATASOURCE_PASSWORD: "123456"
49  SPRING_REDIS_HOST: "redis"
50  SPRING_REDIS_PORT: "6379"
51---
52apiVersion: apps/v1
53kind: Deployment
54metadata:
55  name: ruoyi-admin
56  namespace: ruoyi
57spec:
58  replicas: 2
59  selector:
60    matchLabels:
61      app: ruoyi-admin
62  template:
63    metadata:
64      labels:
65        app: ruoyi-admin
66    spec:
67      containers:
68      - name: ruoyi-admin
69        image: ruoyi-admin:v1.0
70        imagePullPolicy: Always
71        ports:
72        - containerPort: 8080
73        envFrom:
74        - configMapRef:
75            name: ruoyi-config
76---
77apiVersion: v1
78kind: Service
79metadata:
80  name: ruoyi-admin
81  namespace: ruoyi
82spec:
83  selector:
84    app: ruoyi-admin
85  ports:
86  - port: 8080
87    targetPort: 8080
88---
89apiVersion: apps/v1
90kind: Deployment
91metadata:
92  name: ruoyi-ui
93  namespace: ruoyi
94spec:
95  replicas: 2
96  selector:
97    matchLabels:
98      app: ruoyi-ui
99  template:
100    metadata:
101      labels:
102        app: ruoyi-ui
103    spec:
104      containers:
105      - name: ruoyi-ui
106        image: ruoyi-ui:v1.0
107        ports:
108        - containerPort: 80
109---
110apiVersion: v1
111kind: Service
112metadata:
113  name: ruoyi-ui
114  namespace: ruoyi
115spec:
116  selector:
117    app: ruoyi-ui
118  ports:
119  - port: 80
120    targetPort: 80
121

5 部署Gateway

5.1 安装 Gateway API (CRD资源)

1wget https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/standard-install.yaml
2
3kubectl apply -f standard-install.yaml
4

5.2 安装 Envoy Gateway

1wget https://github.com/envoyproxy/gateway/releases/download/v1.0.0/install.yaml
2
3# 修改镜像拉取策略为IfNotPresent
4sed -i 's/imagePullPolicy:[[:space:]]*Always/imagePullPolicy: IfNotPresent/g' install.yaml
5
6kubectl apply -f install.yaml
7

5.3 安装 Gayeway

5.3.1 部署gateway资源
1---
2apiVersion: gateway.networking.k8s.io/v1
3kind: GatewayClass
4metadata:
5  name: eg
6spec:
7  controllerName: gateway.envoyproxy.io/gatewayclass-controller
8---
9apiVersion: gateway.networking.k8s.io/v1
10kind: Gateway
11metadata:
12  name: ruoyi-gateway
13  namespace: ruoyi
14spec:
15  gatewayClassName: eg
16  listeners:
17  - name: http
18    port: 80
19    protocol: HTTP
20---
21apiVersion: gateway.networking.k8s.io/v1
22kind: HTTPRoute
23metadata:
24  name: ruoyi-route
25  namespace: ruoyi
26spec:
27  parentRefs:
28  - name: ruoyi-gateway
29  rules:
30  - matches:
31    - path:
32        type: PathPrefix
33        value: /
34    backendRefs:
35    - name: ruoyi-ui
36      port: 80
37
5.3.2 修改配置
1# 把LoadBalancer改为NodePort
2kubectl get svc -n envoy-gateway-system
3
4kubectl patch service envoy-ruoyi-ruoyi-gateway-1ef7723c -n envoy-gateway-system -p '{"spec":{"type":"NodePort"}}'
5
6# 增加pod数量
7kubectl get deployment -n envoy-gateway-system
8
9kubectl scale deployment envoy-ruoyi-ruoyi-gateway-1ef7723c -n envoy-gateway-system --replicas=2
10

6 访问测试

1curl 192.168.10.81:30269
2
3# 浏览器访问
4192.168.10.81:30269
5

7 总结

本章围绕 Gateway API 展开,从理论到实践全面介绍了其在 Kubernetes 环境中的应用。通过部署若依项目并结合 Envoy Gateway,我们实现了以下目标:

  • 理解 Gateway API 的核心资源模型:包括 GatewayClass、Gateway、HTTPRoute 等,明确了它们的分工与协作关系。
  • 掌握 Gateway API 与传统 Ingress 的区别:从协议支持、扩展性、多租户支持等多个维度进行对比,突出 Gateway API 的优势。
  • 完成完整的应用部署与流量接入:从前端到后端,再到数据库,完整构建了一套微服务应用,并通过 Gateway API 实现统一流量入口。
  • 体验 Envoy Gateway 的实际部署与配置:包括 CRD 安装、Gateway 资源配置、服务类型调整等操作,为后续生产环境的使用打下基础。

Gateway API 作为 Kubernetes 流量管理的下一代标准,正在被越来越多的网关控制器(如 Envoy、Istio、Nginx)所支持。掌握它,不仅有助于提升集群流量治理能力,也为未来多云、多集群场景下的统一路由管理奠定基础。


Gateway—— 高级流量路由》 是转载文章,点击查看原文


相关推荐


2026年,我的AI编程助手使用心得(纯个人体验,非评测)
PieroPc2026/2/21

今年在AI编程助手上摸索出一套自己的组合拳,分享给同样在路上的创作者们: 初稿设计 首选小米MiMo。不是因为它功能多强,而是因为它出设计稿真的快、真的漂亮。脑子里的想法扔给它,几分钟就能看到赏心悦目的初稿,这种“即时满足感”别的工具给不了。 aistudio.xiaomimimo.com/ 数据处理 遇到图片要转CSV或JSON,我会切到豆包Doubao。它的综合模型对图片支持确实好,识别准、转换快。不过坦白说,深入问下去就容易卡壳,这时候别硬撑。 www.doubao.c


从少年到父亲:我在异乡的第一个年
修己xj2026/2/13

今天是老历腊月二十五。写下“老历”这两个字时,忽然觉得它们只在过年时才被记起——像老家,那个我长到二十岁的地方。工作以后,也就过年才回了。 今年不同了。我的身份栏里添了“父亲”二字,恍惚间,竟像回到了我小时候。今天,想和家人们聊聊年味,聊聊这些年,我是有着怎样不一样的感受的。 🧨 童年的年:年是撒欢的鞭炮 小的时候,特别喜欢过年,那会的过年,从进入腊月开始,过年的氛围越来越浓了,那会我们每天兜里揣满鞭炮,满村子放鞭炮,今天给二大爷家的房顶上扔,明天炸五太爷家的果园,虽然因此也挨了不少的打,可


网络接口设备详解:从 `eth0`、`lo` 到 `br0`,看懂 Linux 网络的“器官”
哈里谢顿2026/2/4

在 Linux 系统中,执行 ip addr 或 ifconfig 命令时,你会看到形如 eth0、lo、br0、docker0、vethxxx 的网络接口。它们有的代表真实网卡,有的却是纯软件构造的“虚拟器官”。 这些接口共同构成了 Linux 强大而灵活的网络能力,支撑着从本地通信到容器化、虚拟化的复杂场景。 本文将以 eth0(物理接口)、lo(回环接口)、br0(网桥接口) 为例,深入解析各类网络接口的本质、作用及典型应用场景。 一、什么是网络接口(Network Interface)


Langchain学习笔记(一):认识Langchain-调用LLM的正确姿势
Shawn_Shawn2026/1/26

Langchain是一款开源框架,用于构建Agent,集成了众多大模型供应商和工具。 langchain主要负责与LLM交互,Tool,Rag,Memory,Agent等功能。 LangGraph负责实现Agent编排,专用于构建、管理和部署长时间运行(long-running)且具备状态管理(stateful的智能体。 LangSmith则负责提升Agent的可观测性,提供了用于开发、调试和部署 LLM 应用程序的工具。 它能够帮助您在一个统一的平台上追踪请求、评估输出、测试提示词(Prom


Vercel React 最佳实践 中文版
ssshooter2026/1/17

React 最佳实践 版本 1.0.0 Vercel 工程团队 2026年1月 注意: 本文档主要供 Agent 和 LLM 在 Vercel 维护、生成或重构 React 及 Next.js 代码库时遵循。人类开发者也会发现其对于保持一致性和自动化优化非常有帮助。 摘要 这是一份针对 React 和 Next.js 应用程序的综合性能优化指南,专为 AI Agent 和 LLM 设计。包含 8 个类别的 40 多条规则,按影响力从关键(消除瀑布流、减少打包体积)到增量(高级模式)排序。每


PHP 8.5 #[\NoDiscard] 揪出“忽略返回值“的 Bug
catchadmin2026/1/9

PHP 8.5 #[\NoDiscard] 揪出"忽略返回值"的 Bug 有些 bug 会导致异常、致命错误、监控面板一片红。 还有一类 bug 长这样:“一切都跑了,但什么都没发生”。方法调了,副作用也有了,但关键返回值(成功标志、错误列表、新的不可变实例)被扔掉了。粗看代码没毛病,测试没覆盖到边界情况也能过。bug 就这么混进生产环境。 PHP 一直允许这种风格的失误: doSomethingImportant(); // 返回了一个值……但没人用 PHP 8.5 新增了一种原生


React 从入门到出门第一章 JSX 增强特性与函数组件入门
怕浪猫2026/1/1

今天咱们从 React 19 的基础语法入手,聊聊 JSX 增强特性和函数组件的核心用法。对于刚接触 React 19 的同学来说,这两块是搭建应用的基石——函数组件是 React 19 的核心载体,而 JSX 则让我们能以更直观的方式描述 UI 结构。 更重要的是,React 19 对 JSX 做了不少实用增强,比如支持多根节点默认不包裹、改进碎片语法等,这些特性能直接提升我们的开发效率。下面咱们结合具体案例,从“是什么→怎么用→为什么”三个维度,把这些知识点讲透~ 一、先搞懂核心概念:函数组


数据挖掘12
upper20202025/12/22

数据挖掘12 – 零样本分类 一、预备知识 1.底层特征(Low-level Features) 底层特征是从原始输入数据中直接提取的、最基础的、通常不具有明确语义含义的数值或信号特征。 例子(以图像为例): 像素强度(灰度值、RGB值) 2.中层属性(Mid-level Attributes / Mid-level Features) 中层属性是在底层特征基础上进一步组合、聚合或抽象得到的具有一定结构或局部语义的特征。它们比底层特征更接近人类可理解的概念,但尚未达到高层语义(如“猫”、“汽车”


JConsole 中 GC 时间统计的含义
千百元2025/12/14

要理解 JConsole 中 GC 时间统计的含义,需结合 垃圾收集器类型​ 和 统计维度​ 拆解: 1. 关于 PS MarkSweep 上的 12.575 秒 (16 收集) PS MarkSweep:是 JVM 中用于清理 老年代(PS Old Gen)​ 的垃圾收集器(属于 Full GC 收集器,触发时会暂停所有应用线程,即 STW)。 16 收集:表示该收集器 总共执行了 16 次 Full GC。 12.575 秒:这 16 次 Full GC 的 总耗


智能家政系统架构设计与核心模块解析
小码哥0682025/12/5

一、开发背景           上班族家庭:由于工作繁忙,无暇顾及家务,对日常保洁、家电清洗等便捷高效的家政服务需求强烈,希望能够通过简单的操作,在合适的时间预约到专业的家政人员上门服务,并且对服务质量和服务人员的专业性有较高要求         一些企业为员工提供福利,会定期采购家政服务,如办公室清洁、企业食堂后勤服务等;同时,医疗机构、学校、酒店等也需要专业的家政服务来保障环境清洁和卫生维护,对服务的标准化、规模化有较高要求。 二、家政服务平台技术分析 前端展示层      

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客