跳到主要内容

按端口代理 TCP 流量

本指南介绍如何通过 Ingress Controller 按入站端口为 TCP 流量定义路由规则。示例使用 MySQL 服务器作为上游。

前提条件

  1. 完成设置 Ingress Controller 和网关
  2. 安装 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

helm upgrade -n aic apisix apisix/apisix \
--set ... \ # add other parameters
--set "service.stream.enabled=true" \
--set "service.stream.tcp[0]=9100"

配置 TCP 路由

本节将配置一条监听 9100 端口 TCP 流量的路由。

更新 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

验证

将网关 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.