在 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)
因此,您可以拥有指向 Deployment 或 StatefulSet 上的所有 Pod 的常规“服务”,从而自动配置所有端点。
您还可以拥有另一组 "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/