• k8s 部署mysql8(PV和PVC 版本)


    一、前置准备

    • k8s环境

    • kuboard 页面工具,后面可以使用页面的方式创建,当然我后面也会提供一份 yaml的配置文件

    • 如果不了解k8s中的存储的相关概念的,可以参考我的这篇文件 (六)k8s存储

    • k8s节点情况如下

    角色地址
    master192.168.160.170
    node01192.168.160.171
    node02192.168.160.172

    二、安装

    1、因为在k8s安装中,如果你没有指定数据挂载的话,那么容器重启的时候,数据就丢失了。

    2、而且我们在安装的时候,是不建议直接使用 hostPath,因为如果下次镜像实例跑到另一个节点上去了,那么可能执行的结果回不同。

    在这里插入图片描述

    3、所以这里采用 PV + PVC 的方式,其中PV我们采用 NFS的方式,,存储卷的类型有如下几种方式

    在这里插入图片描述

    2.1、创建PV

    1、PV 支持多种存储驱动,不同存储驱动的 PV 配置方式是不同的,需要根据你的存储系统来配置 PV 参数。我这里用的是 NFS 存储(共享网络文件存储系统)

    这里的PV你也可以使用 hostPath,但是不建议吧

    2.1.1、安装 NFS 服务器

    1、安装nfs命令

    # 每个机器都需要安装 包括k8s集群,不然不能使用挂载命令,因为后续如果重启,你不知道这个实例会跑到那个节点上去.
    yum install -y nfs-common nfs-utils  rpcbind
    
    • 1
    • 2

    在这里插入图片描述
    2、这里准备将nfs 放在 node01 也就是 192.168.160.171上面,即在node01 上面执行如下命令,创建nfs

    # 每个节点
    mkdir /nfs1
    chmod 777 /nfs1
    chown nfsnobody /nfs1
    vim /etc/exports
        /nfs1 *(rw,no_root_squash,no_all_squash,sync)
    
    
    # 如果重启失败,可以尝试 start    
    systemctl restart rpcbind
    systemctl restart nfs
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    3、 nfs 挂载,即将master节点的 /test 挂载到 node01 的的/nfs1 目录

    在这里插入图片描述
    4、测试挂载是否成功,我们在 master节点上 对/test目录下创建修改删除文件,那么node1节点的nfs1目录下也会出现相同的数据
    在这里插入图片描述
    在这里插入图片描述
    5、设置NFS 开机自启动,每一个节点都需要

    systemctl enable rpcbind 
    systemctl enable nfs
    
    • 1
    • 2

    在这里插入图片描述

    2.1.2、创建部署 PV

    1、这一部分使用,我们可以用 kuboard 这个页面工具来创建

    在这里插入图片描述

    2、点击创建后,如下

    在这里插入图片描述
    3、pv 创建成功
    在这里插入图片描述

    4、如果你想使用 yaml,创建,这里给出对应的文件,如下,你也可以参考前面文章里面提到的他也有给出 Kubernetes 部署 Mysql 8.0 数据库(单节点)

    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      annotations:
        pv.kubernetes.io/bound-by-controller: 'yes'
      finalizers:
        - kubernetes.io/pv-protection
      name: nfs-pv-mysql-pv-nfs
      resourceVersion: '2532545'
    spec:
      accessModes:
        - ReadWriteMany
      capacity:
        storage: '20'
      claimRef:
        apiVersion: v1
        kind: PersistentVolumeClaim
        name: nfs-pvc-mysql-pv-nfs
        namespace: kube-system
        resourceVersion: '2532543'
        uid: 262c36d1-d10d-47f0-a627-d97979e6d7f9
      nfs:
        path: /nfs1
        server: 192.168.160.171
      persistentVolumeReclaimPolicy: Retain
      storageClassName: nfs-storageclass-provisioner
      volumeMode: Filesystem
    status:
      phase: Bound
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    2.2、创建 PVC

    1、这一部分使用,我们还是可以用 kuboard 这个页面工具来创建
    在这里插入图片描述

    2、点击创建

    在这里插入图片描述
    3、创建完成后为 pending,要等我们进行绑定使用

    在这里插入图片描述

    4、如果你想使用 yaml,创建,这里给出对应的文件,如下,你也可以参考前面文章里面提到的他也有给出 Kubernetes 部署 Mysql 8.0 数据库(单节点)

    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      annotations:
        k8s.kuboard.cn/pvcType: Dynamic
      finalizers:
        - kubernetes.io/pvc-protection
      name: mysql-pvc
      namespace: test
      resourceVersion: '2533536'
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
      storageClassName: mysql-pv-nfs
      volumeMode: Filesystem
    status:
      phase: Pending
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    三、部署MySQL

    3.1、创建 my.cnf 文件 为cm类型

    1、因为MySQL启动的时候需要加载 my.cnf 文件,这个文件是肯定需要挂载出来的,但是这个文件,我们不是很想都去系统种找使用 vim命令去修改,所以我们可以创建成configMap的类型,后面创建MySQL的时候使用它就好了。

    1、创建 my.cnf 文件
    在这里插入图片描述

    2、具体内容如下
    在这里插入图片描述
    3、创建成功如下
    在这里插入图片描述

    4、具体内容如下

    [client]
    default-character-set=utf8mb4
    [mysql]
    default-character-set=utf8mb4
    [mysqld] 
    max_connections = 2000
    secure_file_priv=/var/lib/mysql
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.2、创建容器

    1、创建

    docker pull mysql:8.0.27
    MYSQL_ROOT_PASSWORD
    
    • 1
    • 2

    在这里插入图片描述

    2、配置容器基本信息
    在这里插入图片描述

    3、配置就绪检查

    mysqladmin -uroot -p${MYSQL_ROOT_PASSWORD} ping
    
    • 1

    在这里插入图片描述

    在这里插入图片描述

    4、配置存活检查

    mysqladmin -uroot -p${MYSQL_ROOT_PASSWORD} ping
    
    • 1

    在这里插入图片描述

    在这里插入图片描述

    5、挂载卷配置

    /var/lib/mysql # MySQL的数据目录
    /etc/mysql/conf.d/my.cnf  # MySQL的配置文件
    
    • 1
    • 2

    在这里插入图片描述

    5、(这一步骤可以不做)其中我们没有配置更新的策略,默认是滚动更新,并且最大超出副本数为25%,最大不可用副本数
    也为 25% (这个参数就会导致在更新的时候,最多可能会出现一个实例不可用的情况。),如果你当初这里没有改,后续想要改,可以手动修改文件,或者通过页面修改
    在这里插入图片描述

    在这里插入图片描述

    6、配置SVC
    在这里插入图片描述

    3.2、结果

    1、最后结果如下
    在这里插入图片描述
    2、链接数据库

    在这里插入图片描述

    3.3、最终的yaml 文件

    1、你也可以参考前面文章里面提到的他也有给出 Kubernetes 部署 Mysql 8.0 数据库(单节点)

    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      annotations:
        k8s.kuboard.cn/displayName: 业务数据库mysql8
      labels:
        k8s.kuboard.cn/layer: db
        k8s.kuboard.cn/name: mysql-bussiness
      name: mysql-bussiness
      namespace: test
    spec:
      progressDeadlineSeconds: 600
      replicas: 1
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          k8s.kuboard.cn/layer: db
          k8s.kuboard.cn/name: mysql-bussiness
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
        type: RollingUpdate
      template:
        metadata:
          creationTimestamp: null
          labels:
            k8s.kuboard.cn/layer: db
            k8s.kuboard.cn/name: mysql-bussiness
        spec:
          containers:
            - env:
                - name: MYSQL_ROOT_PASSWORD
                  value: '123456'
              image: 'mysql:8.0.27'
              imagePullPolicy: IfNotPresent
              livenessProbe:
                exec:
                  command:
                    - mysqladmin
                    - '-uroot'
                    - '-p${MYSQL_ROOT_PASSWORD}'
                    - ping
                failureThreshold: 1
                initialDelaySeconds: 30
                periodSeconds: 10
                successThreshold: 1
                timeoutSeconds: 5
              name: mysql-bussiness-mysql8
              readinessProbe:
                exec:
                  command:
                    - mysqladmin
                    - '-uroot'
                    - '-p${MYSQL_ROOT_PASSWORD}'
                    - ping
                failureThreshold: 3
                initialDelaySeconds: 30
                periodSeconds: 10
                successThreshold: 3
                timeoutSeconds: 5
              volumeMounts:
                - mountPath: /var/lib/mysql
                  name: volume-ype3p
                - mountPath: /etc/mysql/conf.d/my.cnf
                  name: volume-z6icw
                  subPath: my.cnf
          volumes:
            - name: volume-ype3p
              persistentVolumeClaim:
                claimName: mysql-pvc
            - configMap:
                defaultMode: 420
                name: mysql-config
              name: volume-z6icw
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    四、注意点

    1、我们知道,通过上述的操作,这个容器的数据是在 node01 的 /nfs1目录,如下
    在这里插入图片描述
    2、如果你不小心,把这个目录删除了,那么mysql 在启动的时候就会说找不到这个nfs的挂载目录,从而会启动失败,这个时候,你只需要去手动创建这个文件夹就好。
    在这里插入图片描述

  • 相关阅读:
    【论文阅读】PSDF Fusion:用于动态 3D 数据融合和场景重建的概率符号距离函数
    2、SySeVR环境配置(下)
    时间复杂度与空间复杂度
    Java | 一分钟掌握定时任务 | 8 - XXL-Job分布式定时任务
    Linux Vim撤销和恢复撤销快捷键
    Ubuntu系统下anaconda的安装与使用
    Linux8-fork父子进程逻辑地址相同、进程的逻辑地址与物理地址、fork相关例题、僵死进程
    Nwafu-OJ-1508 Problem 阶段2考试题目5 变位词统计
    golang保留小数点后两位,不四舍五入
    adb&monkey
  • 原文地址:https://blog.csdn.net/qq_38263083/article/details/126048821