转发四层流量
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>