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

完成加载后可以查看部署的情况

微信截图_20211203094143.png

发现有成功运行,并且部署了3个副本,我们本地连接下是否可以连接Mysql服务

微信截图_20211203094319.png

本地发现也可以成功连接。

       这样我们就完成了有状态Mysql部署。

1条评论

  • 图图 2021-12-03 16:35:53

    学到了~666

    回复
    • 佛布朗斯基 【回复】 图图 2021-12-10 09:14:58

      我也是刚入坑没多久

      回复

发表评论