所有人 pods 的 Kubernetes 服务和仅领导者的另一个
Kubernetes services for all pods and another for only the leader
在Kubernetes中,是否可以有2个用于单个部署的服务,一个是“标准”,而所有准备就绪的代理人pods,第二次服务仅发送流量?如果是这样怎么办?我正在使用 client-go 进行领导选举。这些是第 4 层服务。
我知道服务可以为选择器使用标签,但是client-go使用注解来标记leader。使用 service without selectors and creating/removing an endpoint in the leader callbacks 似乎 hacky/buggy。谢谢。
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?
是的,但似乎有点老套。服务的工作方式是这样的:
服务 -> 服务标签 select 端点 -> 端点 -> 端点标签 select pods -> Pods (PodIP)
所以你可以让你的常规“服务”指向你的 Deployment 或 StatefulSet 上的所有 pods,它会自动提供所有端点。
您还可以有另一组 "Headless Service" + "Endpoint",每个单独手动创建,让它们的标签彼此匹配,然后让该端点与您的 pod 的标签手动匹配选择.
现在相对于client-go/leaderelection. It seems like it works using an Endpoint or ConfigMap lock for the leader (The example shows a ConfigMap锁定)。但是,看起来您想使用端点锁。所以这个包不适用于服务或标签,看起来它只适用于端点资源。所以本质上,如果你有 3 个节点并且想要找到领导者,你将不得不使用 3 个手动创建的端点资源。领导者将始终具有注释。
现在你如何将它与上面的 2) 联系起来?当您的客户选择或 selects 领导者时,您还必须更改端点标签,以便它们与您手动创建的无外设服务相匹配。 (也可以在您的代码中完成)
您也可以选择只使用 Endpoints 而不是上面的 2)(无无头服务)并让 client-go/leaderelection 直接与端点对话。
另一种选择是利用StatefulSets and its required headless service。因此该服务将解析为基于仲裁的集群中所有副本的 IP 地址。领导者选举将取决于客户端包(client-go 似乎不支持这一点),这对于大多数基于仲裁的应用程序(K8s、Zookeeper、Kafka、Etcd 等)来说都是如此;客户是找到领导者的人。
✌️
在Kubernetes中,是否可以有2个用于单个部署的服务,一个是“标准”,而所有准备就绪的代理人pods,第二次服务仅发送流量?如果是这样怎么办?我正在使用 client-go 进行领导选举。这些是第 4 层服务。
我知道服务可以为选择器使用标签,但是client-go使用注解来标记leader。使用 service without selectors and creating/removing an endpoint in the leader callbacks 似乎 hacky/buggy。谢谢。
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?
是的,但似乎有点老套。服务的工作方式是这样的:
服务 -> 服务标签 select 端点 -> 端点 -> 端点标签 select pods -> Pods (PodIP)
所以你可以让你的常规“服务”指向你的 Deployment 或 StatefulSet 上的所有 pods,它会自动提供所有端点。
您还可以有另一组 "Headless Service" + "Endpoint",每个单独手动创建,让它们的标签彼此匹配,然后让该端点与您的 pod 的标签手动匹配选择.
现在相对于client-go/leaderelection. It seems like it works using an Endpoint or ConfigMap lock for the leader (The example shows a ConfigMap锁定)。但是,看起来您想使用端点锁。所以这个包不适用于服务或标签,看起来它只适用于端点资源。所以本质上,如果你有 3 个节点并且想要找到领导者,你将不得不使用 3 个手动创建的端点资源。领导者将始终具有注释。
现在你如何将它与上面的 2) 联系起来?当您的客户选择或 selects 领导者时,您还必须更改端点标签,以便它们与您手动创建的无外设服务相匹配。 (也可以在您的代码中完成)
您也可以选择只使用 Endpoints 而不是上面的 2)(无无头服务)并让 client-go/leaderelection 直接与端点对话。
另一种选择是利用StatefulSets and its required headless service。因此该服务将解析为基于仲裁的集群中所有副本的 IP 地址。领导者选举将取决于客户端包(client-go 似乎不支持这一点),这对于大多数基于仲裁的应用程序(K8s、Zookeeper、Kafka、Etcd 等)来说都是如此;客户是找到领导者的人。
✌️