转发四层流量
API7 网关除了处理应用层(L7)流量外,还可以处理传输层(L4)TCP 和 UDP 流量。
本教程将演示如何配置 四层路由 在客户端和 MySQL 服务器之间代理 L4 流量。
前提条件
- 安装 API7 企业版。
- 网关组中至少有一个 网关实例。
- 安装 MySQL 客户端 以验证四层路由。
启动 MySQL 服务器
- Docker
- Kubernetes
如果你在 Docker 中安装了网关实例并使用 Dashboard 或 ADC 进行配置,请在默认的 API7 企业版网络 api7-ee_api7
中启动 MySQL 服务器:
docker run -d \
--name mysql \
--network=api7-ee_api7 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=password \
mysql:8.4 \
mysqld --mysql-native-password=ON
如果你在 Kubernetes 上安装了网关实例并使用 Ingress Controller 进行配置,请在 Kubernetes 上启动 MySQL 服务器:
kubectl run mysql --image mysql:8.4 --port 3306 --env="MYSQL_ROOT_PASSWORD=password"
通过服务暴露服务器端口:
kubectl expose pod mysql --port 3306
添加具有四层路由的服务
- 控制台
- ADC
- Ingress Controller
- 从侧导航栏中选择网关组的 已发布服务,然后点击 新增服务。
- 选择 手动新增。
- 在表单中执行以下操作:
- 名称 填写
MySQL
。 - 服务类型 选择
Stream(四层代理)
。 - 上游 Scheme 选择
TCP
。 - 如何找到上游 选择
使用节点
。 - 点击新增节点。
- 在表单中执行以下操作:
- 主机 填写
127.0.0.1
。 - 端口 填写
3306
。 - 权重 使用默认值
100
。 - 点击 新增。这将新建一个 “无版本” 状态的新服务。
- 主机 填写
- 在服务内,点击 新增四层路由。
- 在表单中执行以下操作:
- 名称 填写
stream-route-mysql
。 - 服务器地址 填写
127.0.0.1
。 - 在服务器端口 填写
2000
。 - 点击 新增。
要使用 ADC 创建四层路由,请使用以下配置:
adc.yaml
services:
- name: MySQL
upstream:
name: default
scheme: tcp
nodes:
- host: 127.0.0.1
port: 3306
weight: 100
stream_routes:
- name: stream-route-mysql
server_addr: 127.0.0.1
server_port: 2000
将配置同步到 API7 企业版:
adc sync -f adc.yaml
创建一个 Kubernetes manifest 文件,使用 ApisixRoute 自定义资源来配置一个四层路由:
stream-route.yaml
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
name: stream-route-mysql
namespace: api7
spec:
stream:
- name: stream-route-mysql
protocol: TCP
match:
ingressPort: 2000
backend:
serviceName: mysql
servicePort: 3306
将配置应用到你的集群:
kubectl apply -f stream-route.yaml
你应该能看到如下类似的响应:
apisixroute.apisix.apache.org/stream-route-mysql created
验证四层路由
- Docker
- Kubernetes
如果你在 Docker 中安装了网关实例并使用控制台或 ADC 进行配置,在继续验证步骤之前,请确保将服务器端口 2000
暴露给宿主机(-p2000:2000
)。
如果你已经在 Kubernetes 上安装了网关实例,并使用 Ingress Controller 进行配置,那么要添加服务端口,你需要编辑对应的服务。
kubectl edit svc/api7-ee-3-gateway-gateway
为 MySQL 添加服务端口:
spec:
ports:
...
- name: apisix-gateway-mysql
port: 2000
protocol: TCP
targetPort: 2000
...
为服务转发端口 2000
:
kubectl port-forward svc/api7-ee-3-gateway-gateway 2000:2000 &
使用 MySQL 客户端通过 API7 Gateway 与 MySQL 服务器建立连接。以 root 身份连接,并使用之前配置的密码。
mysql --host=127.0.0.1 --port=2000 -u root -p
你应该会看到如下的 MySQL 提示符:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.4.0 MySQL Community Server - GPL
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>