【问题标题】:How can a pod know its number of replicas一个 pod 如何知道它的副本数
【发布时间】:2019-10-10 07:46:17
【问题描述】:

我正在开发一项服务(用 Go 编写),预计会收到大量请求。根据架构,服务的每个 pod 都应该服务于特定的客户端。比方说,如果这个服务有 3 个 pod,则拆分为 -> A-HI-PQ-Z,其中每个字母是客户端名称的第一个字母。

但是如果这个服务有 4 个 pod,那么 split 可以是 -> A-F, G-N, O-U, V-Z.

有没有一种方法可以让我在 Go 代码中知道还有多少其他副本?

PS:AFAIK,一种可能性是在deployment.yaml 中有一个environment variable。但是有一些方法可以在不更改 yaml 的情况下进行缩放。

【问题讨论】:

  • 你可能想要StatefulSet
  • 我认为该架构存在缺陷。特别是当您期望有大量请求时,我会避免在负载平衡中添加额外的逻辑,并允许所有实例处理任何请求,然后添加经过测试的自动缩放。让 Kubernetes 和您的应用程序在设置中完成各自的工作(Kubernetes 的扩展和负载平衡,为您的应用程序提供请求),不要试图重新发明彼此的内置功能。
  • 再次:您的架构存在缺陷。如果你想区分客户,这应该通过名称间距来完成。写一个舵图,建立一个新客户变得轻而易举。 @Flimzy 我只能部分同意无状态 pod。即使是大规模的,也很有可能拥有有状态的 Pod。您只需要很好地了解您的数据库。运行 Postgres 或 - 上帝保佑! - k8s 上的 ES?没那么多。 MongoDB、蟑螂、涌入?完全没有问题。
  • 过早的优化是万恶之源。编写一个适用于未来 6 个月的应用程序。然后当你需要扩大规模时,再担心。
  • @MarkusWMahlberg:我知道这是可能的(我自己使用它们)。但它不适合 k8s 新手。这就是为什么我小心翼翼地不主张硬性规定的原因。 :)

标签: go kubernetes kubernetes-pod


【解决方案1】:

根据标题,解决方案是使用StatefulSet,其中每个服务都可以相互了解,并且可以以它们处理这种情况的方式编写应用程序。

但是,对于这个问题,根据提到的细节,不使用StatefulSet 的一个好的解决方案是创建一个带有sessionAffinity: ClientIPService。根据细节的要求是后续请求必须转到为先前请求提供服务的特定 pod。这可以使用sessionAffinity 字段进行配置。 Check documentation for it here 有了这个,当一个新的客户端连接时,service 将在做负载平衡后选择一个pod。发布后,所有后续请求将仅发送到 pod。这可以使用SessionAffinityConfig 进一步配置。

【讨论】:

    猜你喜欢
    • 2021-09-22
    • 2018-07-05
    • 2019-12-29
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2018-05-05
    相关资源
    最近更新 更多