简介
本文介绍K8S部署MySQL8(单机)的方法。
本文的目标
1.通过PV和PVC(hostPath方式)存储MySQL的数据
2.通过Deployment、Service部署MySQL8,并通过NodePort暴露给外部
3.使用Navicat进行测试
官网网址
所需的文件
文件下载地址
概述
1.持久化PV存储方式
数据库必须持久化数据,否则节点重启后数据就没了。PV和PVC可以对数据持久化,支持多种方式:
hostPath、NFS、RDB等等。数据要节点共享的,否则如果节点在其他机器上启动了,就无法访问到数据了。所以,生产环境一般采用这些方式:NFS挂载、用云服务器的RDB等。
本文为了简单,只部署一个MySQL节点,使用hostPath方式,不支持节点共享。
2.持久化PV分配方式
本文我直接手动预先创建。生产环境应该通过StorageClass采用Dynamic Provisioning。
3.数据库高可用
数据库一般要配置主从或者集群,实现高可用。一般使用StatefulSet部署,StatefulSet用于管理有状态应用的负载均衡,管理一组Pod的实现、扩容、缩容,并保证它们的顺序和唯一性。
StatefulSets维护的Pod有唯一的、持久的身份和稳定的主机名,不用管它们位于哪个节点上。即使StatefulSet中的Pod发生故障,存储卷与新Pod进行匹配也很容易。
1.创建PV和PVC存储
先创建目录:
mkdir -p /work/devops/k8s/app/mysql/mnt
创建名为 pv.yaml的文件,内容如下:
apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv namespace: db labels: type: db-pv spec: storageClassName: manual capacity: storage: 5Gi accessModes: - ReadWriteOnce hostPath: path: "/work/devops/k8s/app/mysql/mnt" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc namespace: db spec: storageClassName: manual accessModes: - ReadWriteOnce resources: requests: storage: 5Gi
创建pv:
kubectl apply -f pv.yaml
查看PV
kubectl get pv mysql-pv
结果:(创建成功)
查看PVC
kubectl get pvc -A
或者
get pvc mysql-pvc -n db
结果 (创建成功,绑定到了mysql-pv)
2.创建MySQL应用
1.创建命名空间
用于数据库相关应用。
创建名为db-namespace.yaml的文件,内容如下:
# 创建命名空间 apiVersion: v1 kind: Namespace metadata: name: db labels: name: db
执行命令创建它:
kubectl apply -f db-namespace.yaml
2.创建MySQL应用
这里用Configmap配置MySQL、用Deployment部署mysql镜像、用Service将MySQL暴露出来。
这里只能用ConfigMap,因为PV不能挂载单个文件,只能挂载目录。ConfigMap可以单独挂载配置文件。(想要挂载单个文件可以用hostPath方式)。
创建名为k8s.yaml的文件,内容如下:
apiVersion: v1 kind: ConfigMap metadata: name: mysql-config namespace: db data: my.cnf: |- [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] #服务端口号 默认3306 port=3306 # 数据路径,默认是/var/lib/mysql/ #datadir = /app/data/ init_connect='SET NAMES utf8mb4' character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci # 最大连接数 max_connections=200 # 连接失败的最大次数。防止有人从该主机试图攻击数据库系统 max_connect_errors=20 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB --- apiVersion: apps/v1 kind: Deployment metadata: name: mysql-deployment namespace: db spec: replicas: 1 selector: matchLabels: name: mysql template: metadata: labels: name: mysql spec: containers: - name: mysql8 image: mysql:8.0 imagePullPolicy: IfNotPresent ports: - containerPort: 3306 env: - name: TZ value: Asia/Shanghai - name: MYSQL_ROOT_PASSWORD value: "123456" - name: MYSQL_USER value: admin - name: MYSQL_PASSWORD value: "222333" volumeMounts: - name: volume mountPath: /var/lib/mysql/ subPath: data - name: volume mountPath: /var/log/mysql/ subPath: log - name: config mountPath: /etc/mysql/conf.d/my.cnf # subPath: my.cnf #有的镜像必须指定subPath才能成功,比如nacos。 volumes: - name: volume persistentVolumeClaim: claimName: mysql-pvc - name: config configMap: name: mysql-config --- apiVersion: v1 kind: Service metadata: name: mysql-service namespace: db labels: app: mysql spec: type: NodePort ports: - port: 3306 targetPort: 3306 nodePort: 30005 selector: name: mysql
查看结果(已成功启动)
kubectl get pods -A
结果
3.用Navicat测试
用Navicat测试连接:(连接成功)
请先
!