一、前置准备

  • k8s环境
  • kuboard 页面工具,后面可以使用页面的方式创建,当然我后面也会提供一份 yaml的配置文件
  • 如果不了解k8s中的存储的相关概念的,可以参考我的这篇文件 (六)k8s存储
  • k8s节点情况如下

角色

地址

master

192.168.160.170

node01

192.168.160.171

node02

192.168.160.172

  • 可以参考下这篇文章 Kubernetes 部署 Mysql 8.0 数据库(单节点),写的很好,我很多都是参考他的写的。

二、安装

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

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

k8s部署mysql实践 k8s中部署mysql缺点_运维

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

k8s部署mysql实践 k8s中部署mysql缺点_docker_02

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

k8s部署mysql实践 k8s中部署mysql缺点_运维_03


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

k8s部署mysql实践 k8s中部署mysql缺点_kubernetes_04

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

k8s部署mysql实践 k8s中部署mysql缺点_k8s部署mysql实践_05


4、测试挂载是否成功,我们在 master节点上 对/test目录下创建修改删除文件,那么node1节点的nfs1目录下也会出现相同的数据

k8s部署mysql实践 k8s中部署mysql缺点_mysql_06


k8s部署mysql实践 k8s中部署mysql缺点_运维_07


5、设置NFS 开机自启动,每一个节点都需要

systemctl enable rpcbind 
systemctl enable nfs

k8s部署mysql实践 k8s中部署mysql缺点_kubernetes_08

2.1.2、创建部署 PV

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

k8s部署mysql实践 k8s中部署mysql缺点_mysql_09

2、点击创建后,如下

k8s部署mysql实践 k8s中部署mysql缺点_运维_10


3、pv 创建成功

k8s部署mysql实践 k8s中部署mysql缺点_mysql_11

4、如果你想使用 yaml,创建,这里给出对应的文件

---
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

2.2、创建 PVC

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

k8s部署mysql实践 k8s中部署mysql缺点_kubernetes_12

2、点击创建

k8s部署mysql实践 k8s中部署mysql缺点_kubernetes_13


3、创建完成后为 pending,要等我们进行绑定使用

k8s部署mysql实践 k8s中部署mysql缺点_kubernetes_14

4、如果你想使用 yaml,创建,这里给出对应的文件,

---
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

三、部署MySQL

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

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

1、创建 my.cnf 文件

k8s部署mysql实践 k8s中部署mysql缺点_k8s部署mysql实践_15

2、具体内容如下

k8s部署mysql实践 k8s中部署mysql缺点_docker_16


3、创建成功如下

k8s部署mysql实践 k8s中部署mysql缺点_mysql_17

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

3.2、创建容器

1、创建

docker pull mysql:8.0.27
MYSQL_ROOT_PASSWORD

k8s部署mysql实践 k8s中部署mysql缺点_k8s部署mysql实践_18

2、配置容器基本信息

k8s部署mysql实践 k8s中部署mysql缺点_docker_19

3、配置就绪检查

mysqladmin -uroot -p${MYSQL_ROOT_PASSWORD} ping

k8s部署mysql实践 k8s中部署mysql缺点_docker_20

k8s部署mysql实践 k8s中部署mysql缺点_k8s部署mysql实践_21

4、配置存活检查

mysqladmin -uroot -p${MYSQL_ROOT_PASSWORD} ping

k8s部署mysql实践 k8s中部署mysql缺点_运维_22

k8s部署mysql实践 k8s中部署mysql缺点_kubernetes_23

5、挂载卷配置

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

k8s部署mysql实践 k8s中部署mysql缺点_运维_24

5、(这一步骤可以不做)其中我们没有配置更新的策略,默认是滚动更新,并且最大超出副本数为25%,最大不可用副本数

也为 25% (这个参数就会导致在更新的时候,最多可能会出现一个实例不可用的情况。),如果你当初这里没有改,后续想要改,可以手动修改文件,或者通过页面修改

k8s部署mysql实践 k8s中部署mysql缺点_运维_25

k8s部署mysql实践 k8s中部署mysql缺点_运维_26

6、配置SVC

k8s部署mysql实践 k8s中部署mysql缺点_运维_27

3.2、结果

1、最后结果如下

k8s部署mysql实践 k8s中部署mysql缺点_k8s部署mysql实践_28


2、链接数据库

k8s部署mysql实践 k8s中部署mysql缺点_docker_29

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、我们知道,通过上述的操作,这个容器的数据是在 node01 的 /nfs1目录,如下

k8s部署mysql实践 k8s中部署mysql缺点_kubernetes_30


2、如果你不小心,把这个目录删除了,那么mysql 在启动的时候就会说找不到这个nfs的挂载目录,从而会启动失败,这个时候,你只需要去手动创建这个文件夹就好。

k8s部署mysql实践 k8s中部署mysql缺点_运维_31