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

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

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

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

4354 次点击
所在节点    Kubernetes
33 条回复
sampeng
2020-07-31 08:36:04 +08:00
那你们上 k8s 的意义是什么?硬上么?不支持多节点就改称支持。哪里有状态就用 redis,数据库等稳定的服务分离状态。硬上 k8s 没收益还带来复杂度
sampeng
2020-07-31 08:37:06 +08:00
我们刚上 k8s 的时候也是这样,尤其是定时任务。我一个一个盯着全改成 xxl-job,可以支持了就切
xuanbg
2020-07-31 08:47:24 +08:00
楼主你这个需求叫“热备”,主备热切换,非常古老的可用性方案了。现在流行的可用性方案是无状态的分布式,核心就是不管谁挂,反正流量都是活着的分摊,费效比比热备不知道高哪里去了……

所以 k8s 在设计的时候根本就没有考虑热备这种古老的需求,这就比较僵硬。不过,办法还是有的。楼主你在 k8s 外面再做一套热备就是了。
yushiwho
2020-07-31 08:47:37 +08:00
controller 都是这种机制 参考 kuberbuilder
abowloflrf
2020-07-31 09:00:40 +08:00
deployment 下的所有 pod 都是无差别对待的也就是无状态的,楼主的需求感觉应用还是有状态。解决办法想到有一个就是楼上所说,用一个锁,若是 golang,client-go 自带 leaderelection 的包,用了 apiserver 里一个唯一的资源做 leader 选举,非 leader 的 pod 在探针里返回失败就行这样 endpoint 就不会加入到 service 里。另外一个想法就是部署两个副本数为 1 的 deployment 再控制流量。
rrfeng
2020-07-31 09:57:49 +08:00
你应该去看 service 的实现。

这个需求不在 k8s 上加功能的前提下自己实现的思路有以下几种:
1. 用 statefulset,这样每个 pod 有独立的 service name,然后 client 去搞切换
2. 继续用 deployment ( replicaset ),然后 client 不直接调用 service,而是去拿 service 对应的 endpoint 对应的 pod,还是 client 去搞切换
3. 继续用 deployment,然后自己搞个额外小程序跑起来,选主然后注册成一个 service
4. 加个 proxy,proxy 帮你做切换
5. server 代码里加竞争机制,只有一个可以提供服务。
Illusionary
2020-07-31 10:07:34 +08:00
单节点要求高可用? 你们的开发水平配不上在运维层面使用 k8s,建议用回单 docker 部署,或者 tomcat 也行嗷
rushssss
2020-07-31 10:08:11 +08:00
@yisaYisa 这个方案除了不满足 “应该让应用对 k8s 无感知" 这条最佳实践外,几乎是最好的方案,当然就算你不用 k8s 的 api, 也必须要有其他的分布式的,强一致的组件来做协调
lostsquirrelX
2020-07-31 14:30:58 +08:00
nginx 支持主备,但要注意解析缓存, 可以考虑 nginx + (service + pod x 1) x n
UnknownR
2020-07-31 16:11:30 +08:00
@sampeng 没错。。。就是硬伤,我们是软件提供商,客户需要 linux 加容器,本来是 windows 软件,现在硬上 k8s,后续开发这边只能开任务做分布式或者无状态
v2Geeker
2020-07-31 19:45:21 +08:00
statefulset 搞定,用 headless service 指定就行了呀~
dreamusername
2020-08-07 00:36:06 +08:00
最好的方式肯定是用通用的方式,不要去使用那些不常用的功能。
流量层面考虑,你可以考虑使用 istio,借助 envoy 可以对流量进行精准的控制,缺点就是对运维的要求很高。
kiddingU
2020-10-09 15:43:51 +08:00
上层挂一个 lb,指定节点跑流量

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

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

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

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

© 2021 V2EX