小规模私有部署场景下,将 mysql/redis/sentinel/minio 这些放到 k8s 里面是否可行呢

2023-12-18 18:04:26 +08:00
 eephee

公司目前是 springboot 微服务 + mysql/minio/redis/redis-sentinel 的服务搭配

在企业版环境下,springboot 这套部署在 k8s 集群上面,mysql 这些是直接用的云厂商提供的服务 在私有部署环境下,springboot 这套部署在 k8s/k3s 集群上面,mysql 这些是直接装在机器上面

我现在想将私有化部署的 mysql 这些也放到 k8s 集群中运行,主要考虑是:

  1. 使得部署起来更加方便

    1.1 目前服务的安装部署太麻烦麻烦,就算用 ansible 脚本,还是需要去适配不同的操作系统,而且对于离线部署的情形也是方便了许多,直接一个镜像就搞定,否则还需要去下载离线软件包/离线软件镜像,如果软件存在依赖那就很麻烦...

    1.2 因为 mysql 部署完需要创建库表,redis 部署完需要加载 lua 脚本,minio 部署完需要创建 bucket 等,虽然用一些脚本可以做到,还是感觉不太方便。用 k8s 的话,用 job/initContainer/sidecar 之类的就可以自动搞定,写成 helm 模板就可以一键部署,很方便

  2. 提高对机器资源的利用。目前我们给客户做私有化部署的话,如果是钱多的客户,会给 mysql, redis, minio 每个服务分别给机器;如果是钱少的客户,最终讨论下来的结果一般是 将几个服务挤在一台机器上面,这样虽然可以,但是不好限制不同服务进程的资源占用,可能会存在某个服务影响其他服务的情况。部署到集群中的话,限制服务的资源就很容易

  3. 部署到集群中,对于备份、监控等设施,都可以做得相对集中,易于维护。不需要搞各种脚本,那样太离散了,很容易搞错搞漏

可能存在的挑战或者问题,我能想到的大概是

  1. 存储问题,目前看起来使用 local pv 或者 local-path-provisioner 是最好的选择,但这个毕竟不是共享存储的方式,因此还是会将 mysql 这些分别固定在某个特定节点上,这样做丢失了 k8s 调度的优势

  2. 目前可能只能做单实例,没法做到真正的高可用。对于 mysql 主从,mysql cluster 可能会有问题:一方面可用的经验不多,另一方面可能服务本身不太适合上 k8s 集群,比如 redis sentinel 自身对于服务的监控和 k8s 对服务的监控和重启可能会存在冲突...

  3. mysql/minio 好像有官方那个的 operator ,但是我担心把握不住或者不够自定义化,大概率不会去用这些 operator ,而是自己写 yaml ,可能会比较麻烦,还有 redis sentinel 这种,目前要怎么做心里还没底

  4. 性能问题,比如 mysql ,在 k8s 中性能到底怎么样还是个未知数,可能需要做实验测一测

  5. 因为我只会做单实例,不会做高可用,所以这一套只适合小规模的私有化部署场景( 100 人左右吧),我担心到时候架构图给出去,会被客户 challenge:把 mysql 放到 k8s 中的稳定性问题。因为我看到网上有人提到过这点

有吃过螃蟹的前辈分享一些在 k8s 中使用 mysql/redis/minio 的经验吗?想向大佬们征求一些建议,我实在是纠结得不行...

3822 次点击
所在节点    Kubernetes
38 条回复
token10086
2023-12-18 18:13:08 +08:00
可行,但没必要。除非加钱
yyttrr
2023-12-18 18:18:08 +08:00
用 operator 的注意选能长期维护的,要不然等集群版本要升级了很麻烦
eephee
2023-12-18 18:32:09 +08:00
@yyttrr operator 我感觉太麻烦了,用着有点担心,还是直接用 yaml 或者 yaml 模板方便些
eephee
2023-12-18 18:32:57 +08:00
@token10086 诶,是说客户加钱还是老板加钱
hervey0424
2023-12-18 19:45:00 +08:00
我的建议是别给自己添堵
dululu
2023-12-18 19:46:40 +08:00
pharsalia
2023-12-18 19:50:30 +08:00
我们有 openstack 也有 k8s 的。用到 mysql 的业务,k8s 好像是单机单集群的,存储用 nfs 。mysql 没有用到 op ,redis 自己魔改了个 operator 。
eephee
2023-12-18 20:04:40 +08:00
@pharsalia 诶,好奇 nfs 的话,性能跟得上吗?
pharsalia
2023-12-18 20:13:15 +08:00
@eephee 我也不太清楚,是管理某些网元的系统,这个项目平时的负载不高
julyclyde
2023-12-18 20:15:25 +08:00
把存储类业务放 k8s 里通常没有什么好下场
buchikoma
2023-12-18 20:26:14 +08:00
先看看这个:
https://mp.weixin.qq.com/s/4a8Qy4O80xqsnytC4l9lRg
https://mp.weixin.qq.com/s/IDsF_f7ZnB19jEu8ZtO-Nw

再说下部分公司数据库上云的技术方案:
1.openstack 全套
2.虚机+传统有状态服务(自研框架实现的控制面+数据面)
3.k8s 、StatefulSet 、自己开发 operator

数据库上云核心就是怎么做高可用,怎么处理 failover ,怎么处理各种备份恢复场景
julyclyde
2023-12-18 20:26:33 +08:00
从你列举的内容来看,你是先确定要这么用,然后再“论证”,也就是找证据
你都已经看到了真正的问题了,也找了很多借口去抵制自己不喜欢的做法了,其实没什么必要这么纠结
自己的想法最重要
anubu
2023-12-18 21:20:40 +08:00
几乎一样的场景,给客户部署的就是 MySQL 、mongodb 、redis 、minio 都部署在 k8s 集群中。尽量使用 helm 而不是 operator ,存储使用 local pv ,配合 node selector 强制绑定。
肯定不是最佳实践,但还要看具体场景。小规模客户,没有太多资源,在主应用必须部署到 k8s 的情况下,把其它组件拉到集群部署也是一种选择。本身也不是追求高可用、弹性调度,只是借助 k8s 部署和管理。实际上,客户规模够大,有能力的话,也不会同意这样的方案,直接把基础组件甩给客户基础设施团队是最好的。
RangerWolf
2023-12-18 21:23:00 +08:00
可以的~ 比如你去看那些开源项目,比如 superset \ sentry ,他们的免费版本都是一个 docker compose 搞定,里面把前后端数据库全都搞定了。
特别是 Sentry ,几年前我部署的版本里面只有 18 个 container ,今年重新部署的里面塞了 24 个 container ...
eephee
2023-12-18 22:09:00 +08:00
> 把存储类业务放 k8s 里通常没有什么好下场

@julyclyde 大佬是亲身经历过相关的事故吗?可以分享一下吗?毕竟这么用的案例应该不多,比较想知道
eephee
2023-12-18 22:11:59 +08:00
@buchikoma 感谢,我看了下公众号的观点,对于大型项目确实不能用 mysql in k8s ,只是我在想对于小规模的话,做好数据备份的前提下能不能这么搞,主要还是为了部署方便
eephee
2023-12-18 22:15:09 +08:00
@anubu 哇这样子,感谢感谢!
方便了解下你们部署完有遇到过稳定性和性能方面的问题吗?还有你们的 helm 是自己写吗还是参考一些开源的实现呢?以及你们用 k3s 还是 k8s 呀?

大规模客户的话,这套确实就不适用了,用他们提供的集群和各种服务
eephee
2023-12-18 22:16:09 +08:00
@RangerWolf 嗯嗯是的,毕竟 sentry 他们是面向开发,所以给 docker compose 也完全 OK
PhosphorLin
2023-12-18 22:26:31 +08:00
可以但没必要,大规模部署放 k8s 里方便,小规模部署就是给自己增加麻烦
eephee
2023-12-18 22:32:15 +08:00
@PhosphorLin 大规模的话,我们是 hold 不住的,所以大规模还是让云厂商去做

小规模部署增加麻烦是为什么呢

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

https://tanronggui.xyz/t/1001414

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

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

© 2021 V2EX