Kubernetes 服务适用于所有 pod,另一个服务仅适用于领导者

标签 kubernetes client-go leader-election

在 Kubernetes 中,一次部署是否可以有 2 个服务,一个是“标准”服务并在所有就绪 Pod 之前进行代理,另一个服务仅向当选的领导者发送流量?如果是这样怎么办?我正在使用client-go用于领导者选举。这些是第 4 层服务。

我知道服务可以使用标签作为选择器,但 client-go 使用注释来标记领导者。使用 service without selectors并在 leader callbacks 中创建/删除端点看起来很老套/有缺陷。谢谢。

最佳答案

In Kubernetes, is it possible to have 2 services for a single deployment, one which is "standard" and proxies in front of all ready pods, and a second service that sends traffic only the elected leader?

是的,但是看起来有点老套。服务的工作方式是这样的:

服务 -> 服务标签选择端点 -> 端点 -> 端点标签选择 pod -> Pod(PodIP)

  1. 因此,您可以拥有指向 Deployment 或 StatefulSet 上的所有 Pod 的常规“服务”,从而自动配置所有端点。

  2. 您还可以拥有另一组 "Headless Service" + "Endpoint"每个单独手动创建,您可以使它们的标签相互匹配,然后让该端点手动与您选择的 Pod 的标签匹配。

现在关于client-go/leaderelection 。看起来它可以使用 Endpoint 来工作。或ConfigMap领导者锁(示例显示 ConfigMap 锁)。但是,看起来您想使用端点锁。所以这个包不适用于服务或标签,看起来它只适用于端点资源。因此,本质上,如果您有 3 个节点并且想要找到领导者,则必须使用 3 个手动创建的端点资源。领导者将始终拥有注释。

现在如何将其与上面的 2) 联系起来?当您的客户选举或选择领导者时,您还必须更改端点标签,以便它们与您手动创建的 headless 服务相匹配。 (也可以在您的代码中完成)

您也可以选择仅使用端点而不是上面的 2)( headless 服务),并让 client-go/leaderelection 直接与端点对话。

另一种选择是利用 StatefulSets及其必需的headless service 。因此,该服务将解析为基于仲裁的集群中所有副本的 IP 地址。领导者选举将取决于客户端包(client-go 似乎不支持这一点),这对于大多数基于仲裁的应用程序(K8s、Zookeeper、Kafka、Etcd 等)来说都是如此;客户是发现领导者是谁的人。

✌️<​​/p>

关于Kubernetes 服务适用于所有 pod,另一个服务仅适用于领导者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63161883/

相关文章:

cluster-computing - 为什么建议创建节点数为奇数的集群

asp.net - 无法运行kubernetes部署

go - 当我更新节点或使用 client-go 部署时,我偶尔会遇到这样的错误 "the object has been modified"

go - 如何通过k8s.io客户端休息API请求传递容器名称

kubernetes - 领导者连队死亡时,我们可以立即更新k8s领导者吗?

go - 了解 etcd Leader 选举 API

kubernetes - GKE 对一个 CloudSQL 实例使用多个集群

tensorflow - Nightly TF/Cloned TFX - 如何管理 Kubeflow 的图像?

kubernetes - 从裸机 kubernetes 集群向互联网公开服务

kubernetes - 如何使用Client-Go获取有关节点创建的AWS metdata