步骤 1: 创建 PersistentVolume 和 PersistentVolumeClaim
首先为 MySQL 创建一个 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 来确保数据的持久性。
mysql-pv.yaml:
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv-volume
spec:
capacity:
storage: 5Gi # 根据需要调整大小
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: "/mnt/data/mysql" # 根据实际环境调整路径。注意:hostPath仅适用于单节点测试环境。
mysql-pvc.yaml:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi # 确保与PV请求的大小一致
storageClassName: ""
应用 PV 和 PVC:
kubectl apply -f mysql-pv.yaml
kubectl apply -f mysql-pvc.yaml
步骤 2: 创建 Secret 存储 MySQL Root 密码
创建一个 Kubernetes Secret 来安全地存储 MySQL 的 root 用户密码。
mysql-secret.yaml:
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
# 使用 base64 编码你的密码, 例如 echo -n 'yourpassword' | base64
mysql-root-password: UUxJMjUwMjA1 # 替换为你的base64编码后的密码
应用 Secret:
kubectl apply -f mysql-secret.yaml
步骤 3: 部署 MySQL Deployment
使用以下配置来部署 MySQL 8。
mysql-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-deployment
labels:
app: mysql8
spec:
replicas: 1
selector:
matchLabels:
app: mysql8
template:
metadata:
labels:
app: mysql8
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-root-password
ports:
- containerPort: 3306
args:
# 添加了 --skip-grant-tables 参数以跳过授权表
- --bind-address=0.0.0.0
- --skip-grant-tables
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
应用 Deployment:
kubectl apply -f mysql-deployment.yaml
步骤 4: 创建 MySQL Service
为了让外部可以访问 MySQL 服务,我们需要创建一个 NodePort 类型的服务。
mysql-service.yaml:
apiVersion: v1
kind: Service
metadata:
name: mysql-service
labels:
app: mysql8
spec:
type: NodePort
ports:
- port: 3306
targetPort: 3306
nodePort: 31001 # 确保选择一个未被占用的 NodePort
selector:
app: mysql8
应用 Service:
kubectl apply -f mysql-service.yaml
遇到的问题:
问题描述:
部署完成之后,查询对应的pod进入容器,登陆mysql,正确的密码却无法登陆,外部管理软件如navicat和idea的datasource均连接失败!
解决办法
我确认了很多次不是密码的问题,所以在配置mysql-deployment.yaml文件的时候添加了 --skip-grant-tables 参数以跳过授权表 ;此时得以进入mysql内部;
解决步骤:
1、查看mysqlpod
kubectl get pod
2、进入对应pod容器
kubectl exec -it pod/mysql-deployment-7d987fb4bd-8wzfp -- mysql -uroot -p
3、刷新权限,修改权限插件、密码(密码以防万一可不修改)
FLUSH PRIVILEGES;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Ql250205';
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Ql250205';
FLUSH PRIVILEGES;
4、退出容器后修改mysql-deployment.yaml文件,将skip-grant-tables 注释掉
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-deployment
labels:
app: mysql8
spec:
replicas: 1
selector:
matchLabels:
app: mysql8
template:
metadata:
labels:
app: mysql8
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-root-password
ports:
- containerPort: 3306
args:
# 添加了 --skip-grant-tables 参数以跳过授权表
- --bind-address=0.0.0.0
# - --skip-grant-tables
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
5、删除原msql的pod,k8s会自动根据最新的mysql-deployment生成新的pod,此时同样查看新pod容器名称,进入容器并登录,外部mysql工具连接尝试。(命令参考上文)