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

问题描述 投票:0回答:2

场景

我正在将 CQRS 模式 用于处理销售的 REST 服务,如下图所示。 (问题集中在 REST 服务上。)

在 K8S 上我有:

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

两者都在相同的resource上运行:销售。自然的 URL 映射是:

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

为了将这两个微服务部署到 K8S 集群,我为每个分别定义了一个单独的

Service

Deployment
。然后我创建一个 
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
问题

上面的入口定义不起作用,因为它具有相同路径

/api/sales

到两个不同服务的映射。因此,它是不确定的。

入口规范可以允许 HTTP 方法的规范,这是许多人想要的

特性。事实上,当我询问 ChatGPT 时,它建议将这个片段添加到我的 ingress yaml 中,但不幸的是,它是一个不存在的参数......然而。

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

kubernetes kubernetes-ingress cqrs
2个回答
0
投票
我认为基于 URL(如 /queries /commands)而不是基于 HTTP 动词/方法进行路由更好,因为能够对命令服务执行 GET 请求可能很有用。

例如,您可能希望对 /health 端点进行 GET 请求以进行健康检查。

或者,如果您确实想对写端执行一些特定的 READ 查询,是的,当您需要立即一致的答案时,对于某些特定场景,这实际上是可以的。

正如格雷格所说:

“你的聚合状态 IS 只是一个读取模型,它的生命周期通常很短,用于处理事务” https://twitter.com/gregyoung/status/1275467796177137670

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


0
投票
您可以安装Traefik并使用支持

Http方法路由的IngressRoutes。

因此您可以 Method() 规则将您的请求指向所需的服务。

© www.soinside.com 2019 - 2024. All rights reserved.