Gateway—— 高级流量路由

Gateway—— 高级流量路由

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 拉取镜像

docker 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 docker 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 docker 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 docker 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 docker 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 docker 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 

3.2 后端镜像

# 安装工具 yum install -y maven npm# 下载rygit clone https://gitee.com/y_project/RuoYi-Vue.git # 修改配置vim RuoYi-Vue/ruoyi-admin/src/main/resources/application-druid.yml ----------------------------------------------------------------------------------------- spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver druid: master: url: ${SPRING_DATASOURCE_URL} username: ${SPRING_DATASOURCE_USERNAME} password: ${SPRING_DATASOURCE_PASSWORD}#----------------------------------------------------------------------------------------vim RuoYi-Vue/ruoyi-admin/src/main/resources/application.yml ----------------------------------------------------------------------------------------- spring: redis: host: ${SPRING_REDIS_HOST}# K8s 内部 Service 名称 port: ${SPRING_REDIS_PORT} database: 0 password: timeout: 10s #----------------------------------------------------------------------------------------# 本地打包cd /opt/ry/RuoYi-Vue mvn clean package # 构建推送cd /opt/ry/RuoYi-Vue/ruoyi-admin/target vim Dockerfile ----------------------------------------------------------------------------------------- FROM openjdk:8-jdk WORKDIR /app COPY ruoyi-admin.jar app.jar EXPOSE 8080 ENTRYPOINT ["java","-Djava.awt.headless=true","-jar","app.jar"]#----------------------------------------------------------------------------------------docker build -t ruoyi-admin:v1.0 .docker push ruoyi-admin:v1.0 # 将镜像传给node节点docker save -o ruoyi-admin-v1.0.tar ruoyi-admin:v1.0 scp ruoyi-admin-v1.0.tar root@node01:/opt scp ruoyi-admin-v1.0.tar root@node02:/opt docker load -i ruoyi-admin-v1.0.tar 

3.3 前端镜像

# 构建镜像cd ruoyi-ui npminstallnpm run build:prod # 编写配置文件vim nginx.conf ----------------------------------------------------------------------------------------- server { listen 80; location / { root /usr/share/nginx/html; index index.html; try_files $uri$uri/ /index.html;} location /prod-api/ { proxy_pass http://ruoyi-admin:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr;}}#----------------------------------------------------------------------------------------vim Dockerfile ----------------------------------------------------------------------------------------- FROM nginx:1.25 COPY dist/ /usr/share/nginx/html/ COPY nginx.conf /etc/nginx/conf.d/default.conf #----------------------------------------------------------------------------------------# 构建推送docker build -t ruoyi-ui:v1.0 .docker push ruoyi-ui:v1.0 # 将镜像传给node节点docker save -o ruoyi-ui-v1.0.tar ruoyi-ui:v1.0 scp ruoyi-ui-v1.0.tar root@node01:/opt scp ruoyi-ui-v1.0.tar root@node02:/opt docker load -i ruoyi-ui-v1.0.tar 

4 部署前后端数据库

4.1 部署MySQL 数据

# 登入数据库 mysql -uroot -p123456 # 创建一个 ry 的数据库 CREATE DATABASE ry DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;# 查看库 SHOW DATABASES;# 退出库 CTRL+D # 下载若依数据库脚本git clone https://gitee.com/y_project/RuoYi-Vue.git cd RuoYi-Vue/sql # 导入数据 mysql -uroot -p ry < ry_*.sql mysql -uroot -p ry < quartz.sql # 验证 USE ry; SHOW TABLES;# 开启远程访问(修改后重启 systemctl restart mysqld )vim /etc/my.cnf ----------------------------------------------------------------------------------------- bind-address =0.0.0.0 # 授权远程访问 CREATE USER'ruoyi'@'%' IDENTIFIED BY '123456'; GRANT ALL PRIVILEGES ON ry.* TO 'ruoyi'@'%'; FLUSH PRIVILEGES;# 验证远程连接 mysql -h 192.168.10.83 -u ruoyi -p 

4.2 完整 K8s YAML

vim ruoyi-full.yaml ----------------------------------------------------------------------------------------- apiVersion: v1 kind: Namespace metadata: name: ruoyi --- apiVersion: apps/v1 kind: Deployment metadata: name: redis namespace: ruoyi spec: replicas: 1 selector: matchLabels: app: redis template: metadata: labels: app: redis spec: containers: - name: redis image: redis:6.2.17 ports: - containerPort: 6379 --- apiVersion: v1 kind: Service metadata: name: redis namespace: ruoyi spec: selector: app: redis ports: - port: 6379 --- apiVersion: v1 kind: ConfigMap metadata: name: ruoyi-config namespace: ruoyi data: "SPRING_DATASOURCE_URL: jdbc:mysql://192.168.10.83:3306/ry?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai" SPRING_DATASOURCE_USERNAME: "ruoyi" SPRING_DATASOURCE_PASSWORD: "123456" SPRING_REDIS_HOST: "redis" SPRING_REDIS_PORT: "6379" --- apiVersion: apps/v1 kind: Deployment metadata: name: ruoyi-admin namespace: ruoyi spec: replicas: 2 selector: matchLabels: app: ruoyi-admin template: metadata: labels: app: ruoyi-admin spec: containers: - name: ruoyi-admin image: ruoyi-admin:v1.0 imagePullPolicy: Always ports: - containerPort: 8080 envFrom: - configMapRef: name: ruoyi-config --- apiVersion: v1 kind: Service metadata: name: ruoyi-admin namespace: ruoyi spec: selector: app: ruoyi-admin ports: - port: 8080 targetPort: 8080 --- apiVersion: apps/v1 kind: Deployment metadata: name: ruoyi-ui namespace: ruoyi spec: replicas: 2 selector: matchLabels: app: ruoyi-ui template: metadata: labels: app: ruoyi-ui spec: containers: - name: ruoyi-ui image: ruoyi-ui:v1.0 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: ruoyi-ui namespace: ruoyi spec: selector: app: ruoyi-ui ports: - port: 80 targetPort: 80

5 部署Gateway

5.1 安装 Gateway API (CRD资源)

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

5.2 安装 Envoy Gateway

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

5.3 安装 Gayeway

5.3.1 部署gateway资源
--- apiVersion: gateway.networking.k8s.io/v1 kind: GatewayClass metadata: name: eg spec: controllerName: gateway.envoyproxy.io/gatewayclass-controller --- apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: ruoyi-gateway namespace: ruoyi spec: gatewayClassName: eg listeners: - name: http port: 80 protocol: HTTP --- apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: ruoyi-route namespace: ruoyi spec: parentRefs: - name: ruoyi-gateway rules: - matches: - path: type: PathPrefix value: / backendRefs: - name: ruoyi-ui port: 80 
5.3.2 修改配置
# 把LoadBalancer改为NodePort kubectl get svc -n envoy-gateway-system kubectl patch service envoy-ruoyi-ruoyi-gateway-1ef7723c -n envoy-gateway-system -p '{"spec":{"type":"NodePort"}}'# 增加pod数量 kubectl get deployment -n envoy-gateway-system kubectl scale deployment envoy-ruoyi-ruoyi-gateway-1ef7723c -n envoy-gateway-system --replicas=2

6 访问测试

curl192.168.10.81:30269 # 浏览器访问192.168.10.81:30269 

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)所支持。掌握它,不仅有助于提升集群流量治理能力,也为未来多云、多集群场景下的统一路由管理奠定基础。

Read more

【金仓数据库】ksql 指南(五) —— 创建与管理索引和视图(KingbaseES 查询优化核心)

【金仓数据库】ksql 指南(五) —— 创建与管理索引和视图(KingbaseES 查询优化核心)

引言 掌握表的基本运作之后,若想优化查询效率并简化数据访问,就要去学习“索引”和“视图”的运用,索引类似于“书籍目录”,可以极大地加快查询速度;视图类似“数据窗口”,能够隐藏复杂的查询逻辑,还能控制数据的可见性。本文就“ksql命令行操作索引与视图”展开论述,把从“作用到创建,再到查看,维持直至删除”的全过程拆解成实际操作步骤,并结合例子和避坑提示,以使初学者能够领悟并付诸实行。 文章目录 * 引言 * 一、前置准备:确认操作基础(衔接前文,确保连贯) * 1.1 1. 连接数据库并切换目标模式 * 1.2 2. 插入测试数据(用于验证索引 / 视图效果) * 二、索引管理:给表 “加目录”,加速查询 * 2.1 1.

By Ne0inhk
从 Express 到企业级架构:NestJS 实战指南与深度解析

从 Express 到企业级架构:NestJS 实战指南与深度解析

在 Node.js 的后端开发生态中,Express 长期以来以其极简主义占据统治地位。然而,随着项目规模的扩大,缺乏约束的“自由”往往会导致代码结构混乱,也就是我们常说的“意大利面条式代码”。 为了解决这个问题,NestJS 应运而生。NestJS 是一个用于构建高效、可扩展且易于维护的企业级后端应用的框架。它基于 TypeScript 构建,深受 Angular 架构的影响,引入了模块化、依赖注入(DI)和装饰器等先进概念。 本文将结合一个包含待办事项(Todos)管理和 PostgreSQL 数据库连接的实战 Demo,带你深入理解 NestJS 的核心架构。 一、 为什么选择 NestJS? 在开始写代码之前,我们需要理解 NestJS 试图解决什么问题。 1. 架构标准化:Express 让你自己决定文件放哪,而

By Ne0inhk
Go语言零基础小白学习知识点【基础版详解】

Go语言零基础小白学习知识点【基础版详解】

✅ 纯白话拆解+代码示例+实战场景,零基础能直接照着敲 ✅ 技术适配:基于Go 1.23(LTS长期支持版,企业主流),聚焦高并发、云原生核心场景 ✅ 条理清晰:从“环境搭建→基础语法→核心特性→实战入门”层层拆解,每个知识点落地到代码 ✅ 核心目标:小白不仅“懂概念”,更能“写得出、跑得起”,掌握Go语言入门核心能力 一、前置准备:先搞定环境和核心认知 1. Go语言是什么? Go(又称Golang)是谷歌2009年推出的编程语言,2026年已是云原生、高并发后端的首选语言——简单说: * 快:运行速度接近C/C++,编译速度秒杀Java; * 简单:语法比Java/Python更简洁,零基础3天能写业务代码; * 强:天生支持高并发,写直播、聊天、

By Ne0inhk
告别重复数据烦恼!MySQL ON DUPLICATE KEY UPDATE 优雅解决存在更新/不存在插入难题

告别重复数据烦恼!MySQL ON DUPLICATE KEY UPDATE 优雅解决存在更新/不存在插入难题

目录 * 前言 * 一、基本概念 * 1、什么是 ON DUPLICATE KEY UPDATE? * 2、工作原理 * 3、基本语法 * 二、使用场景 * 1、计数器更新 * 2、配置项更新 * 3、购物车商品更新 * 三、高级用法 * 1、条件更新 * 2、多表关联 * 3、批量操作优化 * 四、其他处理冲突的方案 * 1、REPLACE INTO * 2、INSERT IGNORE 前言 在日常的数据库操作中,我们经常会遇到这样的场景:“如果数据存在,就更新它;如果不存在,就插入一条新的”。这种模式通常被称为 “Upsert”(Update + Insert)。在

By Ne0inhk