k8s 该怎么在多个 replica 的情况下只让其中一个接受流量

2020-07-30 20:36:48 +08:00
 UnknownR

目前业务遇到了比较蛋疼的问题,虽然要上 k8s 但是应用本身不支持 replica,不然会出重复数据 看了一圈发现好像 k8s 不管是 replicaset 还是 hpa 好像都只支持多个 pod 同时 active 然后随机接受流量,请问有什么方法能同时跑多个 pod 但是只让其中一个接受流量,剩下的只是运行状态?类似 DB 的 primary 和 secondary,只有 primary 接受流量,剩下的只要在 primary 挂掉时能及时接上就好。

数据是统一写入数据库的,所以不存在数据差异问题

4602 次点击
所在节点    Kubernetes
33 条回复
kaikai5601
2020-07-30 20:37:59 +08:00
你就起一个 pod 不就好了
wxsm
2020-07-30 20:39:32 +08:00
就起 1 个,挂掉了会自动重启
UnknownR
2020-07-30 20:40:03 +08:00
@kaikai5601 但是挂掉时就没法快速切换另一个上。。启动再快也需要时间
wetist
2020-07-30 20:42:11 +08:00
让开发试试分布式锁?
UnknownR
2020-07-30 20:42:33 +08:00
@wxsm 想要达到的效果是能无缝切换,自动重启的话用户的体验可能就会差,重启能被感知
wxsm
2020-07-30 20:46:44 +08:00
提供一个思路:利用 readinessProbe
从节点定时检测主节点是否存活,存活的话该检测提供失败返回,就不会被 k8s 分配流量,同时也不会被杀死。
UnknownR
2020-07-30 20:47:41 +08:00
@wetist 哎这个需求时间紧迫,开发这边的方案已经提了好几个了
Reficul
2020-07-30 20:49:40 +08:00
用 APIServer 里的资源对象来实现分布式锁,锁释放下一个顶上
UnknownR
2020-07-30 20:49:52 +08:00
@wxsm 非常感谢!我去试试,就是为了确保故障不被感知,检测频率可能要非常高。。。
BigBrother1024
2020-07-30 21:00:24 +08:00
可以在负载均衡层考虑
derek80
2020-07-30 23:59:18 +08:00
上 istio
derek80
2020-07-31 00:00:29 +08:00
或者在自定义的 ingress controller 层面控制。有已有的实现
bwangel
2020-07-31 00:07:40 +08:00
@UnknownR readinessProbe 每 10 秒检测一次,这个故障恢复时间应该很快了。
gleymonkey
2020-07-31 01:05:06 +08:00
单节点就是个坑
yisaYisa
2020-07-31 01:18:48 +08:00
这个需求其实非常简单也非常普遍。 比如 kubernetes 的 controller-manager 是怎么做 HA 的?常用的 k8s 上的 operator 的 controller 组件是怎么做 HA 的? 其实上面已经有人给出答案了就是用分布式锁。当然这个分布式锁的轮子也不需要你重复造,kubernetes 早就帮你搞好了。k8s project 里 client-go 中就有 "leaderelection" 可以直接用。具体例子可以参考这个项目。

https://github.com/pingcap/tidb-operator/blob/8a86f9a661aa30393ce8f087aa388d107e57e72b/cmd/controller-manager/main.go#L241-L253
wd
2020-07-31 04:10:15 +08:00
又不要重复数据,也不要当机时间,数据库搞了那么多年你看他们实现了没?你可以掂量掂量自己可以做到什么程度。
zliea
2020-07-31 05:02:16 +08:00
lb+有状态服务?
yuaner
2020-07-31 07:31:21 +08:00
用 istio
haidii
2020-07-31 07:58:03 +08:00
多个 replica 下,可以通过 给 pod 添加标签的方式,根据标签值,让流量只流向其中一个 pod 。
sampeng
2020-07-31 08:34:25 +08:00
所以一个无服务状态是多么得重要。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/694433

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX