019数据库之单节点MySQL8部署(对比版)
docker版(极度简洁,推荐)
首先,把下面的文本保存为docker-compose.yaml文件
yaml
version: '3'
services:
mysql:
image: registry.cn-hangzhou.aliyuncs.com/zhengqing/mysql:8.0 # 原镜像`mysql:8.0`
container_name: mysql8 # 容器名为'mysql8'
restart: unless-stopped # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录
- "./mysql/my.cnf:/etc/mysql/my.cnf"
- "./mysql/data:/var/lib/mysql"
- "./mysql/mysql-files:/var/lib/mysql-files"
environment: # 设置环境变量,相当于docker run命令中的-e
TZ: Asia/Shanghai
LANG: en_US.UTF-8
MYSQL_ROOT_PASSWORD: root # 设置root用户密码
MYSQL_DATABASE: demo # 初始化的数据库名称
privileged: true
user: root
ports: # 映射端口
- "13306:3306"然后,执行脚本即可
shell
mkdir ./mysql/
cat << EOF > ./mysql/my.cnf
[mysqld]
user=mysql # MySQL启动用户
default-storage-engine=INNODB # 创建新表时将使用的默认存储引擎
character-set-server=utf8mb4 # 设置mysql服务端默认字符集
collation-server=utf8mb4_general_ci # 数据库字符集对应一些排序等规则,注意要和character-set-server对应
default-authentication-plugin=mysql_native_password
max_connections=1000 # 允许最大连接数
max_connect_errors=100 # 最大错误连接数
[mysql]
default-character-set=utf8mb4 # 设置mysql服务端默认字符集
[client]
default-character-set=utf8mb4 # 设置mysql客户端默认字符集
EOF
docker-compose -f docker-compose.yaml -p mysql8 up -dk8s版(极度麻烦,不推荐)
理由:配置特别的麻烦,而且会和应用抢性能。数据库本身就不属于频繁变更的资源,最好是用docker-compose部署,或者直接部署在物理机上。
官方文档
https://kubernetes.io/docs/tasks/run-application/run-single-instance-stateful-application/
pv.yaml
yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-share-all # 表示这个是公用的pv
spec:
capacity:
storage: 40Gi
accessModes:
- ReadWriteMany
- ReadWriteOnce
- ReadOnlyMany
hostPath:
path: "/mnt/data" # 对应宿主机上的路径,这个目录一定要是空的,如果里面已经有内容了,会导致mysql启动失败pvc.yaml
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-single-mysql
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gisecret.yaml
yaml
apiVersion: v1
kind: Secret
metadata:
name: secret-single-mysql
labels:
app: pod-single-mysql
type: Opaque
data:
# mysql-root-password需经过base64命令行下使用base64 <<< "密码",默认密码123456
mysql-root-password: "MTIzNDU2"configmap.yaml
yaml
kind: ConfigMap
apiVersion: v1
metadata:
name: configmap-single-mysql
data:
my.cnf: |
[mysqld]
user=mysql # MySQL启动用户
default-storage-engine=INNODB # 创建新表时将使用的默认存储引擎
character-set-server=utf8mb4 # 设置mysql服务端默认字符集
collation-server=utf8mb4_general_ci # 数据库字符集对应一些排序等规则,注意要和character-set-server对应
default-authentication-plugin=mysql_native_password
max_connections=1000 # 允许最大连接数
max_connect_errors=100 # 最大错误连接数
[mysql]
default-character-set=utf8mb4
[client]
default-character-set=utf8mb4 # 设置mysql客户端默认字符集deployment.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: pod-single-mysql
spec:
selector:
matchLabels:
app: pod-single-mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: pod-single-mysql
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/zhengqing/mysql:8.0
imagePullPolicy: IfNotPresent
name: pod-single-mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
key: mysql-root-password
name: secret-single-mysql
- name: TZ
value: Asia/Shanghai
- name: LANG
value: en_US.UTF-8
- name: MYSQL_DATABASE
value: demo
ports:
- name: svc-mysql-1m0s
containerPort: 3306
volumeMounts:
- name: vod-pv-single-mysql
mountPath: /var/lib/mysql # mysql data的持久化文件
- name: vod-cm-single-mysql
mountPath: /etc/mysql/conf.d/ # mysql的 配置文件
securityContext:
privileged: true # 容器提权为拥有特权的容器,可对主机进行任何操作
volumes:
- name: vod-pv-single-mysql
persistentVolumeClaim:
claimName: pvc-single-mysql
- name: vod-cm-single-mysql
configMap:
name: configmap-single-mysql
items:
- key: my.cnf
path: my.cnfservice.yaml
yaml
apiVersion: v1
kind: Service
metadata:
name: svc-mysql-1m0s # 不能超过15个字符
labels:
app: pod-single-mysql
spec:
type: NodePort
ports:
- port: 3306
nodePort: 30006 # 范围 30000-32767
selector:
app: pod-single-mysqlsingle-mysql.yaml
yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-share-all # 表示这个是公用的pv
spec:
capacity:
storage: 40Gi
accessModes:
- ReadWriteMany
- ReadWriteOnce
- ReadOnlyMany
hostPath:
path: "/mnt/data" # 对应宿主机上的路径,这个目录一定要是空的,如果里面已经有内容了,会导致mysql启动失败
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-single-mysql
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
---
apiVersion: v1
kind: Secret
metadata:
name: secret-single-mysql
labels:
app: pod-single-mysql
type: Opaque
data:
# mysql-root-password需经过base64命令行下使用base64 <<< "密码",默认密码123456
mysql-root-password: "MTIzNDU2"
---
kind: ConfigMap
apiVersion: v1
metadata:
name: configmap-single-mysql
data:
my.cnf: |
[mysqld]
user=mysql # MySQL启动用户
default-storage-engine=INNODB # 创建新表时将使用的默认存储引擎
character-set-server=utf8mb4 # 设置mysql服务端默认字符集
collation-server=utf8mb4_general_ci # 数据库字符集对应一些排序等规则,注意要和character-set-server对应
default-authentication-plugin=mysql_native_password
max_connections=1000 # 允许最大连接数
max_connect_errors=100 # 最大错误连接数
[mysql]
default-character-set=utf8mb4
[client]
default-character-set=utf8mb4 # 设置mysql客户端默认字符集
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: pod-single-mysql
spec:
selector:
matchLabels:
app: pod-single-mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: pod-single-mysql
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/zhengqing/mysql:8.0
imagePullPolicy: IfNotPresent
name: pod-single-mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
key: mysql-root-password
name: secret-single-mysql
- name: TZ
value: Asia/Shanghai
- name: LANG
value: en_US.UTF-8
- name: MYSQL_DATABASE
value: demo
ports:
- name: svc-mysql-1m0s
containerPort: 3306
volumeMounts:
- name: vod-pv-single-mysql
mountPath: /var/lib/mysql # mysql data的持久化文件
- name: vod-cm-single-mysql
mountPath: /etc/mysql/conf.d/ # mysql的 配置文件
securityContext:
privileged: true # 容器提权为拥有特权的容器,可对主机进行任何操作
volumes:
- name: vod-pv-single-mysql
persistentVolumeClaim:
claimName: pvc-single-mysql
- name: vod-cm-single-mysql
configMap:
name: configmap-single-mysql
items:
- key: my.cnf
path: my.cnf
---
apiVersion: v1
kind: Service
metadata:
name: svc-mysql-1m0s # 不能超过15个字符
labels:
app: pod-single-mysql
spec:
type: NodePort
ports:
- port: 3306
nodePort: 30006 # 范围 30000-32767
selector:
app: pod-single-mysql执行脚本
shell
kubectl delete -f single-mysql.yaml
kubectl apply -f single-mysql.yaml执行结果


