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

276 天前
 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 的经验吗?想向大佬们征求一些建议,我实在是纠结得不行...

3430 次点击
所在节点    Kubernetes
38 条回复
token10086
276 天前
可行,但没必要。除非加钱
yyttrr
276 天前
用 operator 的注意选能长期维护的,要不然等集群版本要升级了很麻烦
eephee
276 天前
@yyttrr operator 我感觉太麻烦了,用着有点担心,还是直接用 yaml 或者 yaml 模板方便些
eephee
276 天前
@token10086 诶,是说客户加钱还是老板加钱
hervey0424
276 天前
我的建议是别给自己添堵
dululu
276 天前
pharsalia
276 天前
我们有 openstack 也有 k8s 的。用到 mysql 的业务,k8s 好像是单机单集群的,存储用 nfs 。mysql 没有用到 op ,redis 自己魔改了个 operator 。
eephee
276 天前
@pharsalia 诶,好奇 nfs 的话,性能跟得上吗?
pharsalia
276 天前
@eephee 我也不太清楚,是管理某些网元的系统,这个项目平时的负载不高
julyclyde
276 天前
把存储类业务放 k8s 里通常没有什么好下场
buchikoma
276 天前
先看看这个:
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
276 天前
从你列举的内容来看,你是先确定要这么用,然后再“论证”,也就是找证据
你都已经看到了真正的问题了,也找了很多借口去抵制自己不喜欢的做法了,其实没什么必要这么纠结
自己的想法最重要
anubu
276 天前
几乎一样的场景,给客户部署的就是 MySQL 、mongodb 、redis 、minio 都部署在 k8s 集群中。尽量使用 helm 而不是 operator ,存储使用 local pv ,配合 node selector 强制绑定。
肯定不是最佳实践,但还要看具体场景。小规模客户,没有太多资源,在主应用必须部署到 k8s 的情况下,把其它组件拉到集群部署也是一种选择。本身也不是追求高可用、弹性调度,只是借助 k8s 部署和管理。实际上,客户规模够大,有能力的话,也不会同意这样的方案,直接把基础组件甩给客户基础设施团队是最好的。
RangerWolf
276 天前
可以的~ 比如你去看那些开源项目,比如 superset \ sentry ,他们的免费版本都是一个 docker compose 搞定,里面把前后端数据库全都搞定了。
特别是 Sentry ,几年前我部署的版本里面只有 18 个 container ,今年重新部署的里面塞了 24 个 container ...
eephee
276 天前
> 把存储类业务放 k8s 里通常没有什么好下场

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

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

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

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

https://www.fyfyfm.apispeedy.workers.dev/t/1001414

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

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

© 2021 V2EX