如何基于HTTP方法在Kubernetes上路由HTTP请求?

lnlaulya  于 2023-04-05  发布在  Kubernetes
关注(0)|答案(2)|浏览(170)

场景

我正在使用CQRS pattern来处理REST服务,这些服务处理销售,如下图所示。

在K8S上,我有:

  • 在给定pod上运行的GET端点(查询)的微服务。
  • POST和PUT端点(命令)达特另一个微服务在不同的pod上运行。

这两种方法都在同一个资源上运行:销售。自然的URLMap将是:

  • mydomain.com/api/sales/*上的GET端点应转到第一个pod。
  • mydomain.com/api/sales/*上的POST和PUT端点应转到第二个pod。

入口

为了将这两个微服务部署到K8S集群,我为每个微服务定义了一个单独的ServiceDeployment。然后我创建了一个Ingress定义来将请求路由到服务:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
    - host: mydomain.com
      http:
        paths:
          - path: /api/sales
            pathType: Prefix
            backend:
              service:
                name: sales-queries-service
                port:
                  name: 80
          - path: /api/sales
            pathType: Prefix
            backend:
              service:
                name: sales-commands-service
                port:
                  name: 80     
  ingressClassName: ingress-nginx

问题

上面的ingress定义不起作用,因为它将相同的路径/api/salesMap到两个不同的服务。因此,它是不确定的。
许多人都希望ingress规范能够允许HTTP方法的规范。事实上,当我询问ChatGPT时,它建议将此片段添加到我的ingress yaml中,但不幸的是,它是一个不存在的参数......还没有。

httpMethods:
      - GET

在K8S集群中是否有其他选项可以指定路由(不安装API网关产品)?

btqmn9zl

btqmn9zl1#

我认为最好基于URL(如/queries /commands)而不是HTTP动词/方法进行路由,因为能够对命令服务进行GET请求可能会很有用。
例如,您可能希望对/health端点执行GET请求以进行健康检查。
或者,如果您确实想对写端执行一些特定的READ查询,是的,当您需要立即一致的答案时,在某些特定场景中这样做实际上是可以的。
正如Greg所说:

这里的关键是要敏捷,灵活,不要太严格。

nc1teljy

nc1teljy2#

您可以安装和Traefik并使用支持Http方法路由的IngressRoutes。
因此您可以使用Method()规则将请求指向所需的服务。

相关问题