暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

kubernetes基于StatefulSet部署Mysql

1033

 



上一篇介绍了kubernetes部署Mysql,是基于无状态服务方式进行部署,今天跟大家介绍如何部署有状态服务的Mysql,在部署之前我们先简单了解有状态服务跟无状态服务的区别


 


基本概念
无状态服务:无状态服务不会在本地存储持久化数据.多个服务实例对于同一个用户请求的响应结果是完全一致的.这种多服务实例之间是没有依赖关系,比如web应用,在k8s控制器 中动态启停无状态服务的pod并不会对其它的pod产生影响。
有状态服务:有状态服务需要在本地存储持久化数据,典型的是分布式数据库的应用,分布式节点实例之间有依赖的拓扑关系.比如,主从关系. 如果K8S停止分布式集群中任 一实例pod,就可能会导致数据丢失或者集群的crash。

 


创建持久卷
创建有状态服务需要在本地存储持久化数据,我们还是用上一篇部署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

     


    有状态服务
    上一篇部署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的持久卷。

       


      创建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部署。 


            【图】来源于网络

            【文】https://hongzx.cn/home/blogShow/202

            Follow

            佛布朗斯基博客

            (佛布朗斯基)我是一只热爱编程的码农,已从事后端开发5年以上,也正因此,在日常工作学习中,会遇到蛮多问题需要解决,我希望透过记录,真实地将问题以及解决方法保存下来,更为高效地解决问题是我的初衷。


             


            文章转载自程序员技术笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论