一、K8s Ingress 路径匹配的基本概念

在 Kubernetes 中,Ingress 是一个非常重要的资源对象,它负责管理外部访问集群内部服务的规则。而路径匹配则是 Ingress 规则中的核心功能之一,它决定了如何将不同的 URL 路径路由到对应的后端服务。常见的路径匹配方式有三种:精确匹配、前缀匹配和正则匹配。

举个例子,假设我们有一个电商网站,需要将 /products 路由到商品服务,将 /cart 路由到购物车服务。这时候,路径匹配规则就能派上用场了。

二、精确匹配:精准命中目标路径

精确匹配(Exact Match)是指只有当请求的 URL 路径完全符合规则时才会被路由到对应的服务。这种匹配方式非常严格,适用于需要精确控制的场景。

示例:精确匹配配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: exact-match-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /products
        pathType: Exact  # 精确匹配
        backend:
          service:
            name: product-service
            port:
              number: 80
      - path: /cart
        pathType: Exact  # 精确匹配
        backend:
          service:
            name: cart-service
            port:
              number: 80

注释说明:

  • pathType: Exact 表示使用精确匹配。
  • 只有 /products/cart 这两个路径会被路由到对应的服务,其他路径(如 /products/123)不会匹配。

适用场景

  • 需要严格限制访问路径的场景,比如 API 网关的特定接口。
  • 避免路径冲突,确保某些关键路径不会被错误匹配。

三、前缀匹配:灵活处理子路径

前缀匹配(Prefix Match)是指只要请求的 URL 路径以指定的前缀开头,就会被路由到对应的服务。这种方式比精确匹配更灵活,适用于需要处理子路径的场景。

示例:前缀匹配配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: prefix-match-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /products
        pathType: Prefix  # 前缀匹配
        backend:
          service:
            name: product-service
            port:
              number: 80
      - path: /cart
        pathType: Prefix  # 前缀匹配
        backend:
          service:
            name: cart-service
            port:
              number: 80

注释说明:

  • pathType: Prefix 表示使用前缀匹配。
  • /products 会匹配 /products/products/123/products/details 等所有以 /products 开头的路径。

适用场景

  • 需要处理动态子路径的场景,比如商品详情页、博客文章分类等。
  • 适用于大部分 Web 应用的路由需求。

四、正则匹配:高级路径控制

正则匹配(Regular Expression Match)允许使用正则表达式来定义路径规则,提供了最灵活的匹配方式。不过,Kubernetes 原生 Ingress 并不直接支持正则匹配,通常需要借助 Nginx Ingress Controller 或其他第三方 Ingress 控制器来实现。

示例:Nginx Ingress 正则匹配配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: regex-match-ingress
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"  # 启用正则匹配
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /products/[0-9]+  # 匹配 /products/123 这样的路径
        pathType: ImplementationSpecific
        backend:
          service:
            name: product-service
            port:
              number: 80
      - path: /cart/.*  # 匹配所有以 /cart/ 开头的路径
        pathType: ImplementationSpecific
        backend:
          service:
            name: cart-service
            port:
              number: 80

注释说明:

  • nginx.ingress.kubernetes.io/use-regex: "true" 启用正则匹配功能。
  • /products/[0-9]+ 会匹配 /products/123,但不会匹配 /products/abc

适用场景

  • 需要复杂路径规则的场景,比如动态 ID、特定格式的 URL。
  • 适用于需要高度定制化路由的应用程序。

五、技术优缺点分析

1. 精确匹配

  • 优点:规则明确,避免误匹配。
  • 缺点:灵活性较差,无法处理子路径。

2. 前缀匹配

  • 优点:灵活,适合大多数 Web 应用。
  • 缺点:可能会意外匹配到不相关的路径。

3. 正则匹配

  • 优点:功能强大,支持复杂规则。
  • 缺点:配置复杂,性能开销较大。

六、注意事项

  1. 路径冲突:如果多个规则匹配同一个路径,Kubernetes 会优先选择最具体的规则(精确匹配 > 前缀匹配 > 正则匹配)。
  2. Ingress 控制器差异:不同 Ingress 控制器(如 Nginx、Traefik)对路径匹配的支持可能不同,需查阅官方文档。
  3. 性能影响:正则匹配可能会增加 Ingress 控制器的处理负担,在高并发场景下需谨慎使用。

七、总结

Kubernetes Ingress 的路径匹配功能为服务路由提供了强大的灵活性。精确匹配适合严格控制的场景,前缀匹配适合大多数 Web 应用,而正则匹配则适合需要高级路由规则的场景。选择合适的匹配方式,可以显著提升应用的可维护性和用户体验。