【问题标题】:Synchronize HTTP requests between several service instances in Kubernetes在 Kubernetes 中的多个服务实例之间同步 HTTP 请求
【发布时间】:2019-12-25 15:27:52
【问题描述】:

我们有一个具有多个副本的服务,它可以在没有事务和阻塞方法的情况下与存储一起使用。所以我们需要以某种方式通过一些“分片”键来同步多个实例之间的并发请求。现在我们在 Kubernetes 环境中将这个服务作为 ReplicaSet 托管。

您不知道如何做到这一点而不是从头开始实施任何简单的开箱即用方法吗?

以下是我们关于如何做到这一点的几个想法:

  1. 将服务部署为 StatefulSet 并实现一些代理 API,该 API 将通过 HTTP 请求中的分片密钥将流量路由到此 StatefulSet 中的特定 pod。在这种情况下,所有应该同步的请求都将由一个实例处理,处理这种情况不会有问题。

  2. 将服务部署为 StatefulSet 并在同一服务中实现一些自定义逻辑,以将流量重新路由到特定实例(或该实例上的进程)。据我了解,不可能有抽象实现,它只能在 Kubernetes 环境中工作。

  3. 以某种方式将每个 pod IP 暴露在集群外部,并在客户端实现路由逻辑。

  4. 只需通过 Redis 等第三方服务实现实例之间的同步即可。

我想尝试将流量路由到特定的 pod。如果您知道如何处理这种情况的标准方法,我将不胜感激。

非常感谢您!

【问题讨论】:

    标签: kubernetes microservices


    【解决方案1】:

    请记住,网络策略不是流量路由!

    Pod 旨在成为无状态且彼此无法区分的,pod-networking

    我推荐 Istio。它具有负责或路由的特殊组件-Envoy。它是用 C++ 开发的高性能代理,用于调解服务网格中所有服务的所有入站和出站流量。

    有用的文章:istio-envoy-proxy

    Istio 文档:istio-documentation

    有用的 Istio 解释https://www.youtube.com/watch?v=e2kowI0fAz0

    但是您应该能够为每个客户组创建一个部署,并为每个部署创建一个服务。 Ingress nginx 应该能够被告知通过与特定客户组服务相关的任何属性来映射传入的请求。

    其他解决方案是使用kube-router

    Kube-router 可以在每个节点上作为代理或 Pod(通过 DaemonSet)运行,并利用标准 Linux 技术 iptablesipvs/lvs ipsetiproute2.

    Kube-router 使用 Linux 内置的 IPVS/LVS 技术来提供 L4 负载均衡。每个 ClusterIP、NodePort 和 LoadBalancer Kubernetes 服务类型都配置为 IPVS 虚拟服务。每个服务端点都配置为虚拟服务的真实服务器。标准的 ipvsadm 工具可用于验证配置和监控活动连接。

    工作原理:service-proxy

    【讨论】:

      【解决方案2】:

      另一种方法是在您的服务前面放置一个消息队列(如 Kafka 和 RabbitMq)。 然后您的 pod 将订阅 MQ 主题/流。 pod 将决定它是否应该处理消息。

      另外,请尝试研究像 IstioLinkerd 这样的服务网格。 他们可能为您的用例提供 OOTB 解决方案,尽管我找不到。

      【讨论】:

        猜你喜欢
        • 2016-03-07
        • 2017-08-16
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多