如何在 Kubernetes 环境中搭建 MySQL (一):简介
MySQL in Kubernetes
最近因为工作上的需求,搭建了一套部署在 Kubernetes 环境中的 MySQL,可能听起来就是让 MySQL 的 docker image 跑在 Kubernetes 里,应该没什么难度,可实际操作起来,这其实是相当复杂的一个工程:首先要有 Kubernetes 集群,才能谈得到部署应用进去;其次,MySQL 不同于无状态的应用,其中的数据是非常关键的,必须要保证其可用性,这就要求必须有高可靠性的存储集群来存储数据;再者由于众所周知的网络原因,Kubernetes 和 docker 相关的镜像想拿到非常不方便;最后,MySQL 在 cloud native 环境同样需要做主备和高可用的配置。
我计划写一系列文章将自己的经验总结出来,从头到位将这一系列事情讲清楚,并尽量保证感兴趣的朋友可以按照我写的步骤将一个可用的环境搭建出来。
目录
以下是我以后写作的计划和链接,欢迎大家多提意见:
一:简介
二:在 cloud native 环境下配置 MySQL 的几个关键点
三:使用 minikube 部署单节点 Kubernetes
四:使用 kubeadm 部署多节点 Kubernetes 集群
五:手动搭建 Kubernetes 集群
六:使用 ceph-deploy 搭建 ceph 集群
七:部署 RADOSGW、RBD 和 CephFS
八:部署 MySQL,使用 PC、PVC 作为存储
九:部署 MySQL,使用 StorageClass 作为存储
十:使用 StatefulSet 部署主从同步的 MySQL
十一:Vitess 和 Gelera 简介
十二:使用 Ingress 让 MySQL 可以在 Kubernetes 集群外访问
一:简介
作为系列的第一篇,我想写一下解决这个问题的思路,并对用到的开源项目做简要的介绍。
现在越来越流行将各种各样的软件部署在容器环境当中,而非虚拟机环境中,一方面原因是容器环境对于硬件的资源利用率更高,对于云服务来讲更为节省成本;而且容器环境对于微服务架构的支持有着非常明显的优势,微服务化是软件系统演进的一个主要趋势;另外可能就是因为 Kubernetes 提供的大量简单易用的容器调度方式了,虽然 Kubernetes 之前也有一些竞争对手,不过现在的趋势来看 Kubernetes 已经是毫无疑问的胜出者,是事实上的行业标准。那么做容器化,做 cloud native,Kubernetes 是平台的不二选择。
那么为什么要把 MySQL 放进 Kubernetes 里呢?首先 MySQL 是极为重要的,它是开源免费的关系型数据库的首要选择,软件系统如果要用关系型数据库,且不考虑 Oracle 等付费软件的话,除了 MySQL 外,基本是不会做他想了(也许 Windows 环境下会考虑 SQL Server),而现在流行的软件设计方式都是让应用成为无状态,不存储任何数据,数据都放在数据库里,所以 MySQL 有多重要也就不言而喻了。其次还是因为 Kubernetes 非常强大,将 MySQL 放在里面运行,绝大部分情况下就不需要人工干预了,MySQL 进程死掉,会自动再启动新的实例;会把 MySQL 的多个实例分布在不同的服务器上,避免一个服务器出问题,功能不可用;需要多少个 MySQL 实例,系统会自动保证有多少实例在运行......如果这些事情要放在虚拟机环境中,恐怕只能是通过监控系统检测,出现问题手工干预了。
我们已经理解了为什么要把 MySQL 放进 Kubernetes 里,接下来要考虑如何去做。把 MySQL 封装成容器,跑在容器 runtime 里,并让 Kubernetes 系统来调度,这件事本身不难,MySQL 官方已经做好了 MySQL 的 Dockerfile 和 docker image,只需要写个 yaml file 让 MySQL 跑在 Kubernetes 里就行了。但 MySQL 的独特性在于,MySQL 里面的数据是非常重要的,不能像其他软件一样,出了问题直接删掉,再启动一个实例就行了,业务数据丢失可是非常严重的问题。所以要把数据存放在安全可靠的地方,数据外挂有多种方案,这系列文章中选用的是 Ceph RBD,Ceph 是目前开源分布式存储系统中,最为流行的,RBD 是其中的块存储方案。
Kubernetes 是 Google 贡献给开源的软件,所以 Kubernetes 相关的资源自然都是存储在 Google 的服务器上,因为众所周知的原因,正常情况下我们是没法访问到的,为了让读者可以跟着做下去,我会把教程中用到的资源全部下载下来,放在国内可以访问到的服务器上,系列文章中 Kubernetes 对应的版本为 1.10.2,如果有其他版本的需求,大家可以联系我。
最后 MySQL 服务已经就为了,如果只是在 Kubernetes 集群内使用的话,已经没有任何问题了,但是如果要对外开放的话,目前还做不到,原因是 Kubernetes 内部网络不对外开放,那么如何让 MySQL 可以被外面访问到呢?Kubernetes 提供了 NodePort、Load Balance 和 Ingress 三种方式,系列文章的最后会重点谈到如何使用 Ingress。
作者:blackpiglet
链接:https://www.jianshu.com/p/34120dad846f
共同学习,写下你的评论
评论加载中...
作者其他优质文章