原文网址:K8S--安装MySQL8(单机)-CSDN博客
简介
本文介绍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暴露出来。
创建名为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
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测试连接:(连接成功)
-----------------------------------------------------------------------------------------------------------------
分享Java真实高频面试题,吊打面试官: Java后端真实面试题大全 - 自学精灵
分享靠谱的Java高级开发实战,包含:高并发、架构、全局处理、链路追踪等:JavaWeb高级实战 - 自学精灵