【问题标题】:Kubernetes service with exactly one pod from a deployment?Kubernetes 服务只有一个部署中的 pod?
【发布时间】:2019-02-03 15:40:59
【问题描述】:

我有一个包含 3 个 pod 的 k8s 部署,并且我已经设置了一个 NodePort 服务来将 SSH(端口 22)转发到 3 个 pod。一切都按预期工作,但每次我通过 SSH 登录时,我都会得到一个随机的 pod。我想让它变得粘稠,这样我总是能得到同一个豆荚,但我不确定这是否可能。

根据the documentation,设置sessionAffinity: ClientIP 可能不适用于NodePorts。我认为externalTrafficPolicy: Local 不会起作用,因为您需要使用 LoadBalancer 服务。我认为 LoadBalancer 服务对我来说不可行,因为我需要创建数百个这样的服务,而每个 LoadBalancer 都需要花钱并用完配额。

我在这里想知道的是,是否有可能创建一个服务,它不指向部署中的所有 3 个 pod,而是恰好指向 1 个 pod。这将有助于我的情况。我可以手动将一个特殊标签附加到 1 个 pod 并将服务选择器设置为该标签,但如果 pod 死亡并被替换,我觉得它很脆弱。

【问题讨论】:

  • 一个服务不指向部署中的所有 3 个 pod,而是恰好指向 1 个 pod 我希望你能理解 kubernetes 的世界观与什么相反您正在描述,这将继续使这项任务越来越难。话虽如此,您是否愿意编写您的 own controller 来监视 pod 并移动标签?

标签: networking ssh kubernetes google-cloud-platform google-compute-engine


【解决方案1】:

解决此问题的一种方法是使用 StatefulSet 而不是部署来创建您的 pod。然后你的 pod 有一个确定的名称,并且在重新启动时,将保留它们的名称。这样,您可以创建一个指向myapp-0、myapp-1 等的服务,并且可以合理地确保中断,虽然在重新安排/重新启动 pod 时会中断一段时间,但也会恢复到工作状态。但是,在扩展 StatefulSet 时,您将需要处理此类服务创建的自动化,并且您的“亲和力”将基于客户端连接到的服务端口(同一端口上不能有多个服务)

也就是说,这绝对不是一个好的模式。您应该确保您的客户端可以连接到任何 Pod,并且它们通过他们都使用的另一个服务或共享的 RWX 卷(如果是关于文件)共享所需的状态。

【讨论】:

  • 感谢您的周到回答,Radek。如果您对我的问题有更深入的了解,我很乐意听取您对不遵循不良模式的替代解决方案的想法。在我的情况下,3 个 pod 正在运行想要形成集群的 Elixir 节点。他们在随机端口上相互通信,我想知道那个端口是什么。如果我通过 SSH 进入并获取端口,然后尝试在该端口上创建一个 SSH 隧道,我使用不同的端口访问了另一个 pod,因此它不起作用。
猜你喜欢
  • 2019-11-22
  • 1970-01-01
  • 2019-04-23
  • 2023-04-03
  • 2020-06-08
  • 2020-06-24
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多