k8s怎么装mysql k8s搭建mysql集群

如何访问k8s集群内部署的mysql服务虽然 kubernetes 社区一直在努力使得有状态应用成为一等公民,也推出了 statefulset 控制器支持 pod 的顺序部署,稳定的域名访问和存储访问 。但鉴于 MySQL 部署运维的多样性和复杂性,在 kubernetes 上部署 MySQL 仍然要面临众多挑战 。
1、业务流量入口的配置方式
传统虚拟机环境下,我们通过虚IP的方式,让业务应用都配置事先定义的一个虚IP为链接数据库的地址 , 然后由高可用服务保证虚IP始终能被路由到master数据库 。在kubernetes中,出现了一层网络插件屏蔽了底层网络拓扑,高可用服务管理虚IP的方式需要随之适应调整,比如通过service结合标签完成虚IP的漂移,但service本身是kubernetes提供的一项功能,其可靠性和性能都取决于kubernetes服务的稳定 。以性能来说,service是kubeproxy组件通过配置iptables实现的,当iptables规则较多时不可避免的会产生时延,需要我们针对性的解决 。
2、容器隔离带来的监控视野问题
在 kubernetes 中,如果将 MySQL 制作为 container 运行在一个 pod 中 , container 会将 MySQL 进程和运行环境隔离在一个单独的 namespace 中 。监控组件在获取 MySQL 的一些 metirc 时,可能不得不进入与 MySQL 同一个 namespace 中 , 在部署和设计监控组件时需要考虑到这些限制 。
3、存储在 kubernetes 中,支持配置各种不同的存储 。
如果使用本地存储 local persistent volume , 则需要绑定 MySQL 在一个固定的节点,这就完全浪费了 kubernetes 灵活调度的天然优势;而如果使用远程共享存储,确实是将 MySQL 进程与其存储完全解耦,使得 MySQL 进程可以在任意节点调度 , 然而考虑到高 I/O 吞吐量的情况,就不是那么美好了 。设计时需要考量远程存储是否能够满足 MySQL 的带宽要求 。
4、高可用/备份恢复
kubernetes 提供的 statefulset 控制器只能提供最基本的部署,删除功能,无法实现完善的 MySQL 集群高可用/备份恢复操作 。对于有状态应用的部署,仍需要定制开发 , 所以多数公司提供了定制的 operator 来完成应用容器的管理 。比如 etcd operator,MySQL operator,后文将为大家详述我测试使用 MySQL operator 的一些记录 。
Kubernetes 部署 Mysql 8mysql可以以docker的形式在集群内部署,也可以安装在集群之外,以服务的形式部署到集群内 。
(1)、如果是在集群内部署,可以启动一个ReplicationController , 用以对mysql pod进行监控,并同时启动一个Service , 用以集群访问 。
(2)、如果mysql是安装在集群之外 , 那么可以启动一个Endpoint和Service,将mysql引入集群之中 。
下面分别对这两种方式进行部署 。
创建mysql-rc.yaml和mysql-svc.yaml,分别如下:
mysql-rc.yaml
mysql-svc.yaml
在mysql-rc.yaml中 , image参数可以指定mysql的版本 , 如8.0.11、5.7.22等 。这里省略了,表示用latest 。另外,可以指定镜像库,这里使用阿里云镜像库,在安装docker时进行了配置 。env参数指定了mysql的root密码 。
在mysql-svc.yaml中,targetPort表示mysql pod中mysql窗口的目标端口,默认为3306,type类型为NodePort , 表示将映射到本地端口,本地端口为nodePort: 30306 。
接下来启动ReplicationController和Service , 执行以下命令:
启动后可以查看mysql部署在了哪个node上,执行以下命令可以查看:
【k8s怎么装mysql k8s搭建mysql集群】(6)、退出mysql和容器,执行quit;退出mysql,按ctrl+p后,再按ctrl+q从容器中返回node主机 。
设置好mysql后,可以远程连接node中的mysql,node的ip为127.0.0.1,映射的端口为30306 , 可以用navicat工具连接到这个myql 。

推荐阅读