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