跳到主要内容

为四层路由应用插件

L4RoutePolicy 用于将 APISIX Stream 插件挂载到 Gateway API TCP、UDP 和 TLS 路由。本指南将为一条 TCPRoute 应用 IP 访问限制,并验证该策略能够阻止连接。

产品可用性

L4RoutePolicy 可用于 APISIX Ingress Controller 2.2。API7 Ingress Controller 尚未发布包含此资源的版本或 Helm Chart。

前置条件

  1. 使用 Gateway API 页签完成按端口代理 TCP 流量。该示例会在 aic 命名空间中创建 stream-route-mysql TCPRoute。
  2. 应用策略前,确认能够连接到 MySQL 后端。

应用 Stream 插件

创建一个 L4RoutePolicy,将 ip-restriction Stream 插件挂载到 stream-route-mysql。以下示例中的黑名单会阻止所有 IPv4 客户端地址:

l4-route-policy.yaml
apiVersion: apisix.apache.org/v1alpha1
kind: L4RoutePolicy
metadata:
name: block-mysql-connections
namespace: aic
spec:
targetRefs:
- group: gateway.networking.k8s.io
kind: TCPRoute
name: stream-route-mysql
plugins:
- name: ip-restriction
config:
blacklist:
- 0.0.0.0/0

应用策略:

kubectl apply -f l4-route-policy.yaml

验证策略

检查策略状态:

kubectl get l4routepolicy block-mysql-connections -n aic \
-o jsonpath='{range .status.ancestors[*].conditions[*]}{.type}{"="}{.status}{" ("}{.reason}{")\n"}{end}'

已接受的策略应报告:

Accepted=True (Accepted)

再次尝试连接 MySQL:

mysqlsh --sqlc --host=127.0.0.1 --port=9100 --user=root --password

由于插件会拒绝客户端地址,连接应当失败。

删除策略,并确认连接恢复成功:

kubectl delete l4routepolicy block-mysql-connections -n aic

策略挂载规则

  • 策略可以指向与其位于同一命名空间的 TCPRouteUDPRouteTLSRoute 资源。
  • targetRefs 必须使用 gateway.networking.k8s.io 组。一条策略可以包含 1 至 16 个目标引用。
  • 四层路由不公开可寻址的区段。包含 sectionName 的目标引用不会挂载。
  • 仅 APISIX Stream 插件有效,例如 ip-restrictionlimit-conn;仅支持 HTTP 的插件无法在四层路由上运行。
  • 多条策略指向同一路由时,应用最早创建的策略。后续策略会报告 Accepted=False,原因为 Conflicted