k8s 部署mysql8(PV和PVC 版本)

一、前置准备

  • 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 部署mysql8(PV和PVC 版本)_第1张图片

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

k8s 部署mysql8(PV和PVC 版本)_第2张图片

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 部署mysql8(PV和PVC 版本)_第3张图片
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 部署mysql8(PV和PVC 版本)_第4张图片

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

k8s 部署mysql8(PV和PVC 版本)_第5张图片
4、测试挂载是否成功,我们在 master节点上 对/test目录下创建修改删除文件,那么node1节点的nfs1目录下也会出现相同的数据
k8s 部署mysql8(PV和PVC 版本)_第6张图片
k8s 部署mysql8(PV和PVC 版本)_第7张图片
5、设置NFS 开机自启动,每一个节点都需要

systemctl enable rpcbind 
systemctl enable nfs

k8s 部署mysql8(PV和PVC 版本)_第8张图片

2.1.2、创建部署 PV

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

k8s 部署mysql8(PV和PVC 版本)_第9张图片

2、点击创建后,如下

k8s 部署mysql8(PV和PVC 版本)_第10张图片
3、pv 创建成功
k8s 部署mysql8(PV和PVC 版本)_第11张图片

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


2.2、创建 PVC

1、这一部分使用,我们还是可以用 kuboard 这个页面工具来创建
k8s 部署mysql8(PV和PVC 版本)_第12张图片

2、点击创建

k8s 部署mysql8(PV和PVC 版本)_第13张图片
3、创建完成后为 pending,要等我们进行绑定使用

k8s 部署mysql8(PV和PVC 版本)_第14张图片

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

三、部署MySQL

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

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

1、创建 my.cnf 文件
k8s 部署mysql8(PV和PVC 版本)_第15张图片

2、具体内容如下
k8s 部署mysql8(PV和PVC 版本)_第16张图片
3、创建成功如下
k8s 部署mysql8(PV和PVC 版本)_第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 部署mysql8(PV和PVC 版本)_第18张图片

2、配置容器基本信息
k8s 部署mysql8(PV和PVC 版本)_第19张图片

3、配置就绪检查

mysqladmin -uroot -p${MYSQL_ROOT_PASSWORD} ping

k8s 部署mysql8(PV和PVC 版本)_第20张图片

k8s 部署mysql8(PV和PVC 版本)_第21张图片

4、配置存活检查

mysqladmin -uroot -p${MYSQL_ROOT_PASSWORD} ping

k8s 部署mysql8(PV和PVC 版本)_第22张图片

k8s 部署mysql8(PV和PVC 版本)_第23张图片

5、挂载卷配置

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

k8s 部署mysql8(PV和PVC 版本)_第24张图片

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

k8s 部署mysql8(PV和PVC 版本)_第26张图片

6、配置SVC
k8s 部署mysql8(PV和PVC 版本)_第27张图片

3.2、结果

1、最后结果如下
k8s 部署mysql8(PV和PVC 版本)_第28张图片
2、链接数据库

k8s 部署mysql8(PV和PVC 版本)_第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 部署mysql8(PV和PVC 版本)_第30张图片
2、如果你不小心,把这个目录删除了,那么mysql 在启动的时候就会说找不到这个nfs的挂载目录,从而会启动失败,这个时候,你只需要去手动创建这个文件夹就好。
在这里插入图片描述

你可能感兴趣的:(k8s,数据库,kubernetes,运维,docker)