代理 TCP 流量
API7 网关可以专门处理传输层 (四层) 的 TCP 和 UDP 流量,也可以在处理应用层 (七层) 流量之外处理这些流量。
本教程将引导你完成在发布服务中配置四层代理路由 (stream route) 的过程,以代理客户端和 MySQL 服务器之间的四层流量。
前提条件
- 安装 API7 企业版。
- 在你的网关组中至少有一个网关实例。
- 安装一个 MySQL 客户端以验证四层代理路由。
启动 MySQL 服务器
- Docker
- Kubernetes
启动一个 MySQL 服务器:
docker run -d \
--name mysql \
--network host \
-e MYSQL_ROOT_PASSWORD=password \
mysql:8.4 \
mysqld --mysql-native-password=ON
在 Kubernetes 上启动一个 MySQL 服务器:
kubectl run mysql \
--image=mysql:8.4 \
--port=3306 \
--env="MYSQL_ROOT_PASSWORD=password" \
-n api7
通过服务暴露服务器端口:
kubectl expose pod mysql --port=3306 -n api7
启用传输层 (四层) 代理
默认情况下,API7 网关(数据面)仅启用了应用层 (七层) 代理。为了也能够接收传输层 (四层) 流量,请暴露 TCP 服务端口并配置 stream_proxy。
- Docker
- Kubernetes
如果你在 Docker 中安装了网关实例,并使用控制台或 ADC 进行配置,在进入验证步骤之前,请确保将服务器端口 2000 暴露给主机 (-p2000:2000)。
如果网关实例已经在 Docker 中运行,请将其移除,并启动一个新的实例,同时映射 2000 端口。你的命令应该类似于以下内容:
docker run -d -e API7_DP_MANAGER_ENDPOINTS='["https://{HOST_ADDR}:7943"]' \
-e API7_GATEWAY_GROUP_SHORT_ID=default \
-e API7_DP_MANAGER_CERT="-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----" \
-e API7_DP_MANAGER_KEY="-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----" \
-e API7_CONTROL_PLANE_CA="-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----" \
-e API7_DP_MANAGER_SNI="api7ee3-dp-manager" \
-p 9080:9080 \
-p 9443:9443 \
-p 2000:2000 \
--name $container_name \
-h api7-gateway \
api7/api7-ee-3-gateway:$TAG
将以下配置追加到你的网关配置文件中:
container_name=your-gateway-container-name
docker exec $container_name /bin/sh -c "echo '
apisix:
stream_proxy:
only: false
tcp:
- 2000
' >> /usr/local/apisix/conf/config.yaml"
重新加载 API7 网关容器以使配置更改生效:
docker exec $container_name apisix reload
升级你的网关以启用 stream 模式,并设置 TCP 端口 2000:
helm upgrade --install -n api7 api7-ee-3-gateway api7/gateway \
--set ... \ # 添加其他参数
--set "gateway.stream.enabled=true" \
--set "gateway.stream.only=false" \
--set "gateway.stream.tcp[0]=2000"
添加带有四层代理路由的服务
- 控制台 (Dashboard)
- ADC
- Ingress Controller
- 从侧边导航栏选择你网关组的 已发布服务 (Published Services),然后点击 添加服务 (Add Service)。
- 选择 手动添加 (Add Manually)。
- 在对话框中,执行以下操作:
- 在 名称 (Name) 字段中,输入
MySQL。 - 在 服务类型 (Service Type) 字段中,选择
TCP/UDP (四层代理)(Stream(Layer 4 Proxy))。 - 在 上游协 议 (Upstream Scheme) 字段中,选择
TCP。 - 在 如何查找上游 (How to find the upstream) 字段中,选择
使用节点(Use Nodes)。 - 点击 添加节点 (Add Node)。
- 在添加节点对话框中,执行以下操作:
- 在 主机 (Host) 字段中,输入你的私有 IP 地址,例如
192.168.2.103。 - 在 端口 (Port) 字段中,输入
3306。 - 在 权重 (Weight) 字段中,使用默认值
100。 - 点击 添加 (Add)。这将创建一个状态为“无版本”(No Version) 的新服务。
- 在 主机 (Host) 字段中,输入你的私有 IP 地址,例如
- 在服务内部,点击 添加四层代理路由 (Add Stream Route)。
- 在对话框中,执行以下操作:
- 在 名称 (Name) 字段中,输入
stream-route-mysql。 - 在 网关端口 (Gateway Port) 字段中,输入
2000。 - 点击 添加 (Add)。
要使用 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_port: 2000
将配置同步到 API7 企业版:
adc sync -f adc.yaml
- Gateway API
- APISIX CRD
首先,如下更新你的网关清单:
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
namespace: api7
name: apisix
spec:
gatewayClassName: apisix
listeners:
- name: http
protocol: HTTP
port: 80
- name: tcp
protocol: TCP
port: 2000
allowedRoutes:
kinds:
- kind: TCPRoute
infrastructure:
parametersRef:
group: apisix.apache.org
kind: GatewayProxy
name: apisix-proxy-config
为 TCPRoute 创建一个 Kubernetes 清单:
tcp-route.yaml
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: TCPRoute
metadata:
name: stream-route-mysql
namespace: api7
spec:
parentRefs:
- name: apisix
sectionName: tcp
rules:
- backendRefs:
- name: mysql
port: 3306
将配置应用到你的集群:
kubectl apply -f gateway.yaml -f tcp-route.yaml
创建一个 Kubernetes 清单文件以配置四层代理路由:
tcp-route.yaml
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
name: stream-route-mysql
namespace: api7
spec:
ingressClassName: apisix
stream:
- name: stream-route-mysql
protocol: TCP
match:
ingressPort: 2000
backend:
serviceName: mysql
servicePort: 3306
将配置应用到你的集群:
kubectl apply -f tcp-route.yaml
验证四层代理路由
- Docker
- Kubernetes
为该服务转发端口 2000:
kubectl port-forward svc/api7-ee-3-gateway-gateway 2000:2000 &
使用 MySQL 客户端,通过 API7 网关建立与 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>