• K8S(八):NFS + PV + ConfigMap + Service 部署MySQL


    𝑰’𝒎 𝒉𝒉𝒈, 𝑰 𝒂𝒎 𝒂 𝒈𝒓𝒂𝒅𝒖𝒂𝒕𝒆 𝒔𝒕𝒖𝒅𝒆𝒏𝒕 𝒇𝒓𝒐𝒎 𝑵𝒂𝒏𝒋𝒊𝒏𝒈, 𝑪𝒉𝒊𝒏𝒂.

    • 🏫 𝑺𝒉𝒄𝒐𝒐𝒍: 𝑯𝒐𝒉𝒂𝒊 𝑼𝒏𝒊𝒗𝒆𝒓𝒔𝒊𝒕𝒚
    • 🌱 𝑳𝒆𝒂𝒓𝒏𝒊𝒏𝒈: 𝑰’𝒎 𝒄𝒖𝒓𝒓𝒆𝒏𝒕𝒍𝒚 𝒍𝒆𝒂𝒓𝒏𝒊𝒏𝒈 𝒅𝒆𝒔𝒊𝒈𝒏 𝒑𝒂𝒕𝒕𝒆𝒓𝒏, 𝑳𝒆𝒆𝒕𝒄𝒐𝒅𝒆, 𝒅𝒊𝒔𝒕𝒓𝒊𝒃𝒖𝒕𝒆𝒅 𝒔𝒚𝒔𝒕𝒆𝒎, 𝒎𝒊𝒅𝒅𝒍𝒆𝒘𝒂𝒓𝒆 𝒂𝒏𝒅 𝒔𝒐 𝒐𝒏.
    • 💓 𝑯𝒐𝒘 𝒕𝒐 𝒓𝒆𝒂𝒄𝒉 𝒎𝒆:𝑽𝑿
    • 📚 𝑴𝒚 𝒃𝒍𝒐𝒈: 𝒉𝒕𝒕𝒑𝒔://𝒉𝒉𝒈𝒚𝒚𝒅𝒔.𝒃𝒍𝒐𝒈.𝒄𝒔𝒅𝒏.𝒏𝒆𝒕/
    • 💼 𝑷𝒓𝒐𝒇𝒆𝒔𝒔𝒊𝒐𝒏𝒂𝒍 𝒔𝒌𝒊𝒍𝒍𝒔:𝒎𝒚 𝒅𝒓𝒆𝒂𝒎

    环境描述

    • Mysql 版本:8
    • Kubernetes 版本:1.18.16
    • 操作系统版本:CentOS 7

    前置知识你需要知道的,不然部署文件看不懂的。前置知识,在之前的几个博客里面都有的。我最后会列出来的。

    1.1 NFS部署

    1. 所有节点安装NFS服务

      yum install -y nfs-common nfs-utils rpcbind
      
      • 1
    2. 在宿主机上创建共享文件夹,并且修改文件夹的访问权限

      mkdir /data/nfsData
      chmod 755 /data/nfsData/
      
      • 1
      • 2
    3. 设置NFS文件夹的可访问权限。192.168.88.0 是允许这个网段的去访问这个nfs目录。

      /data/nfsData     192.168.88.0/24(rw,sync,no_root_squash,no_all_squash)
      
      • 1
    4. 启动服务,并且设置开机自启

      sudo systemctl enable rpcbind
      sudo systemctl enable nfs
      sudo systemctl start rpcbind
      sudo systemctl start nfs
      
      • 1
      • 2
      • 3
      • 4
    5. 客户端验证

      [root@k8s-node11 ~]# mkdir /nfs
      [root@k8s-node11 ~]# mount -t nfs 192.168.88.130:/data/nfsData /nfs
      [root@k8s-node11 ~]# df -Th
      192.168.88.130:/data/nfsData nfs4       46G  7.7G   39G  17% /nfs
      
      • 1
      • 2
      • 3
      • 4

      在宿主机创建一个文件,同时在客户机上看见就说明NFS没问题了。因为我是事后记录的,可能忘记了什么东西。可以再找找,其他人的教程。

       到这里我们就在宿主机上有一个NFS目录了。

    1.2 MySQL 参数配置

      从Docker过来我们都知道,配置文件需要外置,这样修改起来也很方便,配置也不会丢失,那么K8S里面我们同样可以用configMap去实现这个。,用 ConfigMap 存储,然后挂载进入镜像内部。这样,只要修改 ConfigMap 里面的配置,再重启应用就能很方便就能够使应用重新加载新的配置,很方便。

    • mysql-config.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: mysql-config
      labels:
        app: mysql
    data:
      my.cnf: |-
        [client]
        default-character-set=utf8mb4
        [mysql]
        default-character-set=utf8mb4
        default-time_zone = '+8:00'
        [mysqld] 
        max_connections = 2000
        secure_file_priv=/var/lib/mysql
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    部署命令

    kubectl create -f mysql-config.yaml
    
    • 1

    1.3 数据存储

    docker里面我们用的是用宿主机映射到docker容器里面,这样即使容器出现了问题,MySQL里面的数据也是不会丢失的,那么我们在k8s里面怎么实现呢?

    kubernetes 部署的应用一般都是无状态应用,部署后下次重启很可能会漂移到不同节点上,所以不能使用节点上的本地存储,而是需要网络存储对应用数据持久化,PV 和 PVC 是 Kubernetes 用于与储空关联的资源,可与不同的存储驱动建立连接,存储应用数据,所以接下来我们要创建 Kubernetes PV、PVC 资源。

    关于PV和PVC可以参考:缺省

    PV,PVC定义
    这里我们PV存储在NFS服务器上,这就是为什么一开始要先部署NFS,可能是我刚接触到这一个,其他存储方式还不了解。

    ## PV
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: mysql
      labels:
        app: mysql             #设置 pv 的 label 标签
    spec:
      capacity:          
        storage: 5Gi          #设置 pv 存储资源大小 
      accessModes:       
      - ReadWriteOnce
    #  mountOptions:
    #  - hard
    #  - nfsvers=4.1    
      nfs:                     #指定使用 NFS 存储驱动
        server: 192.168.88.130   #指定 NFS 服务器 IP 地址
        path: /data/nfsData/mysql #/nfs/mysql       #指定 NFS 共享目录的位置,且需提前在该目录中创建 mysql 目录
      persistentVolumeReclaimPolicy: Retain  
    ---
    ## PVC
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: mysql
    spec:
      resources:
        requests:
          storage: 5Gi        #设置 pvc 存储资源大小
      accessModes:
      - ReadWriteOnce
      selector:
        matchLabels:
          app: mysql           #根据 Label 选择对应 PV
    
    • 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

    部署pv/pvc

    kubectl create -f mysql-storage.yaml
    
    • 1

    1.4 deployment+service部署MySQL

    创建用于 Kubernetes Deployment 来配置部署 Mysql 的参数,需要配置 Mysql 的镜像地址、名称、版本号,还要配置其 CPU 与 Memory 资源的占用,通过环境变量配置 Mysql 的 root 用户默认密码,配置探针监测应用可用性,配置 Volume 挂载之前创建的 PV、PVC、ConfigMap 资源等等,内容如下:

    ## Service
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql
      labels:
        app: mysql
    spec:
      type: NodePort
      ports:
      - name: mysql 
        port: 3306                            # 集群内部访问service的端口
        targetPort: 3306                      # 容器映射在pod上面的端口
        nodePort: 30336                       # 对外暴露端口
      selector:
        app: mysql
    ---
    ## Deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mysql
      labels:
        app: mysql
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mysql
      template:
        metadata:
          labels:
            app: mysql
        spec:     
          containers:
          - name: mysql
            image: mysql:8.0.19
            ports:
            - containerPort: 3306             # 容器上面的端口
            env:
            - name: MYSQL_ROOT_PASSWORD    ## 配置Root用户默认密码
              value: "123456"
            # resources:
            #   limits:
            #     cpu: 2000m
            #     memory: 512Mi
            #   requests:
            #     cpu: 2000m
            #     memory: 512Mi
            # livenessProbe:
            #   initialDelaySeconds: 30
            #   periodSeconds: 10
            #   timeoutSeconds: 5
            #   successThreshold: 1
            #   failureThreshold: 3
            #   exec:
            #     command: ["mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping"]
            # readinessProbe:  
            #   initialDelaySeconds: 10
            #   periodSeconds: 10
            #   timeoutSeconds: 5
            #   successThreshold: 1
            #   failureThreshold: 3
            #   exec:
            #     command: ["mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping"]
            volumeMounts:
            - name: data
              mountPath: /var/lib/mysql               # 数据文件,用的NFS
            - name: config
              mountPath: /etc/mysql/conf.d/my.cnf     # mysql的配置文件
              subPath: my.cnf
            - name: localtime                         # 改时区
              #readOnly: true
              mountPath: /etc/localtime
          volumes:
          - name: data
            persistentVolumeClaim:
              claimName: mysql
          - name: config      
            configMap:
              name: mysql-config
          - name: localtime
            hostPath:
              type: File
              path: /etc/localtime
    
    • 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
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85

    参数简介:

    • ports: 配置镜像映射端口。
    • env: 镜像环境变量配置,其中 MYSQL_ROOT_PASSWORD 是 Mysql 镜像用于配置 root 用户默认密码变量。
    • resources: 配置 CPU、Memory 资源限制,可以通过配置该值来配置 Pod 的 QoS 级别。
    • livenessProbe: 配置存活探针,定时检测 Mysql 应用运行状态,如果检测到 Mysql 挂掉将进行重启操作。
    • readinessProbe: 配置就绪探针,定时检测 Mysql 应用启动状态,如果启动成功将允许流量涌入,启动失败将进行重启操作。
    • command: 探针执行探测时执行的探测命令。
    • volumeMounts: 存储卷挂载配置,用于镜像内存储的挂载配置,与 volumes 中对于的 name 进行绑定。
    • volumes: 存储卷配置,可配置使用 pvc、hostPath、emptyDir、nfs 等存储,需要配置 name 值与 VolumeMounts 进行绑定。

    注意为什么volume中用的subPath是因为不加的话,会对容器/etc/mysql/conf.d/这个目录,进行全覆盖,也就是容器里面的所有的文件都没了,但是我们只需要把configMap里面的一个key-value映射进去,并且名字叫my.cnf,这里就可以这么做。我会在configMap讲解中,再次说明这个问题,同时subPath有一个弊端,就是configMap修改之后,subPath是不会自动更新的,必须要手动更新。这跟普通的挂载整个目录是有区别的。你可以修改一下试试看

    可以通过改annotations的方法去强制更新。

    kubectl patch deployment mysql --patch '{"spec": {"template": {"metadata": {"annotations": {"update": "2" }}}}}'
    
    • 1

    部署

    kubectl create -f mysql-deploy.yaml
    
    • 1

    1.5 尝试连接

    在这里插入图片描述
    看一眼配置里面的MySQL正确设置没有就行,并且进入pod里面,输入date看映射的hostpath有没有成功更改容器系统的时区。

    参考文献

    1. Kubernetes 部署 Mysql 8.0 数据库(单节点)
    2. 运行一个单实例有状态应用
  • 相关阅读:
    CSS篇十六——盒子模型之边框
    user32dIl出错,丢失条目:lockworkstation是怎么回事
    Java并发编程第10讲——CAS相关知识点详解
    985、211毕业生涌入小县城求职,是“抢饭碗”,还是“摆烂”?
    【密评】商用密码应用安全性评估从业人员考核题库(十一)
    NC338 删除升序数组的重复元素
    【1】前端学习笔记
    Mysql 性能分析(慢日志、profiling、explain)、读写分离(主从架构)、分库分表(垂直分库、垂直分表、水平分表)
    鲸鱼优化算法改进风储机组一次调频出力分配系数,以频率偏差最小为目标优化函数,结合鲸鱼算法WOA捕食过程,改进风储出力分配系数simulink与matlab联合
    通俗理解计算机操作系统的作用
  • 原文地址:https://blog.csdn.net/qq_41376740/article/details/126393960