kubernetes - Kubernetes 为所有 Pod 提供服务,另一个只为领导者提供服务
问题描述
在 Kubernetes 中,是否可以为单个部署提供 2 个服务,一个是“标准”服务,在所有准备好的 pod 前面代理,另一个服务只发送选定的领导者?如果有怎么办?我正在使用client-go进行领导者选举。这些是第 4 层服务。
我知道服务可以使用标签作为选择器,但 client-go 使用注释来标记领导者。使用没有选择器的服务并在领导者回调中创建/删除端点似乎是 hacky/buggy。谢谢你。
解决方案
在 Kubernetes 中,是否可以为单个部署提供 2 个服务,一个是“标准”服务并在所有准备好的 pod 前面代理,另一个服务仅发送选定领导者的流量?
是的,但它似乎有点hacky。服务的工作方式是这样的:
服务 -> 服务标签选择端点 -> 端点 -> 端点标签选择 Pod -> Pods (PodIP)
因此,您可以拥有指向 Deployment 或 StatefulSet 上的所有 pod 的常规“服务”,它会自动配置所有端点。
您还可以单独手动创建另一组“无头服务” + “端点” ,使它们的标签相互匹配,然后让该端点与您选择的 pod 的标签手动匹配。
现在关于client-go/leaderelection。似乎它为领导者使用Endpoint或ConfigMap锁(该示例显示了ConfigMap锁)。但是,看起来你想使用端点锁。所以这个包不适用于服务或标签,看起来它只适用于端点资源。所以本质上,如果你有 3 个节点并且想要找到领导者,你将不得不使用 3 个手动创建的端点资源。领导者将始终具有注释。
现在你如何将它与上面的 2) 联系起来?当您的客户选举或选择领导者时,您还必须更改端点标签,以便它们与您手动创建的无头服务相匹配。(也可以在您的代码中完成)
您也可以选择只使用上面的端点 2)(无无头服务),并让 client-go/leaderelection 直接与端点对话。
另一种选择是利用StatefulSets及其所需的无头服务。因此,该服务将解析为基于仲裁的集群中所有副本的 IP 地址。领导者选举将取决于客户端包(client-go 似乎不支持这一点),这对于大多数基于仲裁的应用程序(K8s、Zookeeper、Kafka、Etcd 等)来说都是如此;客户是找到领导者的人。
✌️
推荐阅读
- c# - RDLC ReportViewer 上的表使用数据库的第一行值填充所有行值
- java - 方法参考:函数接口
- java - 如何在 Java 中使用 AspectJ 记录父级和子级的线程 ID
- android - 如何在画布上以低于 21 的 API 级别绘制圆角矩形
- odoo - 文本中的金额 Odoo 10
- java - 有谁知道 birt 报告 oda jdbc 连接方法?
- codenameone - 将文本提示保留在 textArea 的底行 - cn1
- google-cloud-platform - 气流调度,重新运行失败的任务
- java - 无法使用 Java 读取具有日期字段的 Excel 单元格值
- python - 使用 Python 访问 Fastmail CalDAV