导语:因为自己写的项目想放到k8s里跑,并且项目用的数据库是mysql8 所以要先试一试k8s部署mysql8
创建pv和pvc文件 mysql-storage.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql
namespace: devops
labels:
app: mysql #设置 pv 的 label 标签
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Delete
nfs:
server: 192.168.1.171
path: /srv/devops
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql
namespace: devops
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 20Gi
selector:
matchLabels:
app: mysql #根据 Label 选择对应 PV
创建configmap文件 mysql-config.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config
namespace: devops
labels:
app: mysql
data:
my.cnf: |-
[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
创建部署yaml文件 mysql-deploy.yaml
apiVersion: extensions/v1beta1 #apiserver的版本
kind: Deployment #副本控制器deployment,管理pod和RS
metadata:
namespace: devops
name: mysql #deployment的名称,全局唯一
spec:
replicas: 1 #Pod副本期待数量
selector:
matchLabels: #定义RS的标签
app: mysql #符合目标的Pod拥有此标签
strategy: #定义升级的策略
type: RollingUpdate #滚动升级,逐步替换的策略
template: #根据此模板创建Pod的副本(实例)
metadata:
labels:
app: mysql #Pod副本的标签,对应RS的Selector
spec:
containers: #Pod里容器的定义部分
- name: mysql #容器的名称
image: mysql:8.0.19 #容器对应的docker镜像
volumeMounts: #容器内挂载点的定义部分
- name: time-zone #容器内挂载点名称
mountPath: /etc/localtime #容器内挂载点路径,可以是文件或目录
- name: mysql-data
mountPath: /var/lib/mysql #容器内mysql的数据目录
- name: config
mountPath: /etc/mysql/conf.d/my.cnf #容器内mysql的数据目录
ports:
- containerPort: 3306 #容器暴露的端口号
env: #写入到容器内的环境容量
- name: MYSQL_ROOT_PASSWORD #定义了一个mysql的root密码的变量
value: "123456"
# health check
# health check
volumes: #本地需要挂载到容器里的数据卷定义部分
- name: time-zone #数据卷名称,需要与容器内挂载点名称一致
hostPath:
path: /etc/localtime #挂载到容器里的路径,将localtime文件挂载到容器里,可让容器使用本地的时区
- name: mysql-data
persistentVolumeClaim:
claimName: mysql
- name: config
configMap:
name: mysql-config
如果需要可以加入健康检查的配置
# health check
resources:
limits:
cpu: 2000m
memory: 512Mi
requests:
cpu: 2000m
memory: 512Mi
livenessProbe:
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
exec:
command: ["mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping"]
readinessProbe:
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
exec:
command: ["mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping"]
# health check
创建svc文件 mysql-svc.yaml
---
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: devops
labels:
app: mysql
spec:
type: NodePort
ports:
- name: tcp
port: 3306
nodePort: 30336
selector:
app: mysql
创建pod
我都是创建在namespace devops下的 如果想创建在别的namespace下 后面加上-n namespace的名称即可
kubectl aaply -f mysql-config.yaml
kubectl aaply -f mysql-storage.yaml
kubectl aaply -f mysql-deploy.yaml
kubectl aaply -f mysql-svc.yaml
# 查看容器的name
kubectl get pods -n devops
# 进入容器
kubectl exec -it $podname /bin/bash -n devops
创建一个test库 测试故障之后pod数据是否会持久化
删除旧pod 等新的pod被拉起
查看创建的test库 在新pod中也是存在的
测试工具navicat连接
使用虚拟机测试连接 发现低版本的mysql 5.7连接会报错
ERROR 2026 (HY000): SSL connection error: unknown error number
用8.0版本连接就不会有问题