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

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

环境描述

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

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

1.1 NFS部署

  1. 所有节点安装NFS服务

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

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

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

    sudo systemctl enable rpcbind
    sudo systemctl enable nfs
    sudo systemctl start rpcbind
    sudo systemctl start nfs
    
  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
    

  在宿主机创建一个文件,同时在客户机上看见就说明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

部署命令

kubectl create -f mysql-config.yaml

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

部署pv/pvc

kubectl create -f mysql-storage.yaml

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

参数简介:

  • 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" }}}}}'

部署

kubectl create -f mysql-deploy.yaml

1.5 尝试连接

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

参考文献

  1. Kubernetes 部署 Mysql 8.0 数据库(单节点)
  2. 运行一个单实例有状态应用
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐