按端口代理 TCP 流量
本指南介绍如何通过 Ingress Controller 按入站端口为 TCP 流量定义路由规则。示例使用 MySQL 服务器作为上游。
前提条件
- 完成设置 Ingress Controller 和网关。
- 安装 MySQL Shell,用于连接 MySQL 服务器。
启动示例上游服务
创建 Kubernetes manifest 文件,部署一个 root 密码为 my-secret-pw 的示例 MySQL 上游服务:
mysql.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
namespace: aic
labels:
app: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:9.4
env:
- name: MYSQL_ROOT_PASSWORD
value: "my-secret-pw"
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumes:
- name: mysql-data
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: aic
spec:
selector:
app: mysql
ports:
- name: mysql
port: 3306
targetPort: 3306
将配置应用到集群:
kubectl apply -f mysql.yaml
启用网关 Stream 代理
升级网关,启用 stream 模式并设置 TCP 端口 9100:
- APISIX 网关
- API7 网关
helm upgrade -n aic apisix apisix/apisix \
--set ... \ # add other parameters
--set "service.stream.enabled=true" \
--set "service.stream.tcp[0]=9100"
helm upgrade -n aic api7-ee-3-gateway api7/gateway \
--set ... \ # add other parameters
--set "gateway.stream.enabled=true" \
--set "gateway.stream.only=false" \
--set "gateway.stream.tcp[0]=9100"
配置 TCP 路由
本节将配置一条监听 9100 端口 TCP 流量的路由。
- Gateway API
- APISIX CRD
更新 Gateway manifest 文件,为 TCP 流量定义监听器:
gateway.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
namespace: aic
name: apisix
spec:
gatewayClassName: apisix
listeners:
- name: http
protocol: HTTP
port: 80
- name: tcp
protocol: TCP
port: 9100
allowedRoutes:
kinds:
- kind: TCPRoute
infrastructure:
parametersRef:
group: apisix.apache.org
kind: GatewayProxy
name: apisix-config
创建 TCPRoute 的 Kubernetes manifest:
tcp-route.yaml
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: TCPRoute
metadata:
name: stream-route-mysql
namespace: aic
spec:
parentRefs:
- name: apisix
sectionName: tcp
rules:
- backendRefs:
- name: mysql
port: 3306
将配置应用到集群:
kubectl apply -f gateway.yaml -f tcp-route.yaml
创建定义四层路由(stream route)的 Kubernetes manifest 文件:
tcp-route.yaml
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
name: stream-route-mysql
namespace: aic
spec:
ingressClassName: apisix
stream:
- name: stream-route-mysql
protocol: TCP
match:
ingressPort: 9100
backend:
serviceName: mysql
servicePort: 3306
将配置应用到集群:
kubectl apply -f tcp-route.yaml
验证
将网关 Service 端口暴露到本地机器:
# 替换为你的网关 Service 名称
kubectl port-forward svc/<gateway-service-name> 9100:9100 &
以 root 用户连接 MySQL 服务器,并在提示时输入密码 my-secret-pw:
mysql --host=127.0.0.1 --port=9100 -u root -p
如果连接成功,你应看到类似如下欢迎信息:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 9.4.0 MySQL Community Server - GPL
Copyright (c) 2000, 2025, Oracle and/or its affiliates.