上一篇介绍了kubernetes部署Mysql,是基于无状态服务方式进行部署,今天跟大家介绍如何部署有状态服务的Mysql,在部署之前我们先简单了解有状态服务跟无状态服务的区别
基本概念无状态服务:无状态服务不会在本地存储持久化数据.多个服务实例对于同一个用户请求的响应结果是完全一致的.这种多服务实例之间是没有依赖关系,比如web应用,在k8s控制器中动态启停无状态服务的pod并不会对其它的pod产生影响。有状态服务:有状态服务需要在本地存储持久化数据,典型的是分布式数据库的应用,分布式节点实例之间有依赖的拓扑关系.比如,主从关系.如果K8S停止分布式集群中任一实例pod,就可能会导致数据丢失或者集群的crash。创建持久卷创建有状态服务需要在本地存储持久化数据,我们还是用上一篇部署mysql的教程所用的目录(/home/storageVolume/mysql)来当作Mysql本地存储,分配20个G的空间来使用#设置持久卷apiVersion:v1kind:PersistentVolumeClaimmetadata:name:mysql-pv-claimlabels:app:mysqlspec:accessModes:-ReadWriteOnceresources:requests:storage:20Gi#持久卷的容量是20GB有状态服务上一篇部署Mysql的教程使用的是Deployment方式去部署,Deployment组件是为无状态服务而设计的,其中的Pod名称,主机名,存储都是随机,不稳定的,并且Pod的创建与销毁也是无序的.这个设计决定了无状态服务并不适合数据库领域的应用,而Stateful管理有状态的应用,所以我们使用StatefulSet方式去部署Mysql服务。
#有状态服务apiVersion:apps/v1kind:StatefulSetmetadata:name:mysql-deploymentspec:selector:matchLabels:app:mysqlreplicas:3#创建3个副本serviceName:mysqltemplate:metadata:labels:app:mysqlspec:containers:-name:mysqlimage:mysql:latest#mysql镜像,直接选择最高版本imagePullPolicy:Always#允许自动拉取镜像env:-name:MYSQL_ROOT_PASSWORD#这里设置root的密码value:testargs:["--default-authentication-plugin=mysql_native_password"]#作用是解除高版本Mysql不允许账号密码连接远程mysqlresources:requests:cpu:"50m"memory:1Gilimits:cpu:"50m"memory:1GivolumeMounts:-name:mysql-storemountPath:/home/storageVolume/mysql#MySQL容器的数据默认都是存在这个目录subPath:mysqldata#这里通过subPath挂载到子目录,就可以避免出错volumes:-name:mysql-storepersistentVolumeClaim:claimName:mysql-pv-claim#存储卷名称使用上一步创建的持久卷名称
以上配置我们部署有状态Mysql服务,开启了3个副本,如果不存在Mysql镜像,允许自动拉取镜像,同时设置密码为test,并且分配了一个20G的持久卷。
创建Service完成以上部署之后,我们需要创建一个Service来允许外部访问,这里我们指定一个外部访问端口
#对外服务apiVersion:v1kind:Servicemetadata:name:mysql-servicelabels:app:mysqlspec:type:NodePortselector:app:mysqlports:-protocol:TCPnodePort:port:targetPort:整合加载配置以上所有配置,我们可以直接放在一个yaml文件里,这样方便加载跟删除配置,我们创建一个命名为mysql-deployment-status-scale.yaml的文件,配置如下
#设置持久卷apiVersion:v1kind:PersistentVolumeClaimmetadata:name:mysql-pv-claimlabels:app:mysqlspec:accessModes:-ReadWriteOnceresources:requests:storage:20Gi#持久卷的容量是20GB---#有状态服务apiVersion:apps/v1kind:StatefulSetmetadata:name:mysql-deploymentspec:selector:matchLabels:app:mysqlreplicas:3serviceName:mysqltemplate:metadata:labels:app:mysqlspec:containers:-name:mysqlimage:mysql:latestimagePullPolicy:Alwaysenv:-name:MYSQL_ROOT_PASSWORD#这里设置root的密码value:testargs:["--default-authentication-plugin=mysql_native_password"]resources:requests:cpu:"50m"memory:1Gilimits:cpu:"50m"memory:1GivolumeMounts:-name:mysql-storemountPath:/home/storageVolume/mysql#MySQL容器的数据默认都是存在这个目录subPath:mysqldata#这里通过subPath挂载到子目录,就可以避免出错volumes:-name:mysql-storepersistentVolumeClaim:claimName:mysql-pv-claim---#对外服务apiVersion:v1kind:Servicemetadata:name:mysql-servicelabels:app:mysqlspec:type:NodePortselector:app:mysqlports:-protocol:TCPnodePort:port:targetPort:
保存之后加载配置文件,在服务器上输入以下命令
kubectlapply-fmysql-deployment-status-scale.yaml
完成加载后可以查看部署的情况
发现有成功运行,并且部署了3个副本,我们本地连接下是否可以连接Mysql服务
本地发现也可以成功连接。
这样我们就完成了有状态Mysql部署。来源于网络