Kubernetes 中部署 NFS 动态存储和 MySQL 集群的详细指南
本指南将详细介绍如何在 Kubernetes 上安装和配置 NFS 动态存储,并使用该存储部署 MySQL 集群。我们将覆盖以下内容:
- 安装和配置 NFS 服务器
- 在 Kubernetes 中部署 NFS 动态存储
- 部署 MySQL 集群
- 配置定期数据备份
1. 安装和配置 NFS 服务器
1.1 安装 NFS 服务器
在 NFS 服务器上运行以下命令来安装 NFS 服务器软件包:
sudo apt update
sudo apt install nfs-kernel-server -y
1.2 配置 NFS 共享目录
创建一个目录并设置为 NFS 共享目录:
sudo mkdir -p /mnt/data
sudo chown nobody:nogroup /mnt/data
sudo chmod 777 /mnt/data
编辑 /etc/exports
文件,添加以下行:
sudo nano /etc/exports
在文件中添加以下内容:
/mnt/data 172.25.125.0/24(rw,sync,no_subtree_check,no_root_squash)
应用更改:
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
1.3 在客户端安装 NFS 客户端
在每个需要访问 NFS 共享的客户端上,运行以下命令安装 NFS 客户端软件包:
sudo apt update
sudo apt install nfs-common -y
2. 在 Kubernetes 中部署 NFS 动态存储
2.1 部署 NFS Provisioner
创建 NFS Provisioner 部署文件 nfs-provisioner-deployment.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-provisioner
spec:
replicas: 1
selector:
matchLabels:
app: nfs-provisioner
template:
metadata:
labels:
app: nfs-provisioner
spec:
containers:
- name: nfs-provisioner
image: quay.io/external_storage/nfs-client-provisioner:latest
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: example.com/nfs
- name: NFS_SERVER
value: 172.25.125.25
- name: NFS_PATH
value: /mnt/data
volumes:
- name: nfs-client-root
nfs:
server: 172.25.125.25
path: /mnt/data
应用配置:
kubectl apply -f nfs-provisioner-deployment.yaml
2.2 创建 StorageClass
创建 StorageClass 文件 nfs-storageclass.yaml
:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-nfs-storage
provisioner: example.com/nfs
reclaimPolicy: Retain
parameters:
archiveOnDelete: "true"
应用配置:
kubectl apply -f nfs-storageclass.yaml
3. 部署 MySQL 集群
3.1 创建 PersistentVolumeClaim
创建 PVC 文件 mysql-pvclaim.yaml
:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: managed-nfs-storage
应用 PVC 配置:
kubectl apply -f mysql-pvclaim.yaml
3.2 部署 MySQL StatefulSet
创建 MySQL StatefulSet 文件 mysql-statefulset.yaml
:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
serviceName: "mysql"
replicas: 3
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: yourpassword
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-storage
spec:
accessModes: [ "ReadWriteMany" ]
storageClassName: "managed-nfs-storage"
resources:
requests:
storage: 5Gi
应用 StatefulSet 配置:
kubectl apply -f mysql-statefulset.yaml
3.3 创建 MySQL Service
创建 MySQL Service 文件 mysql-service.yaml
:
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
name: mysql
selector:
app: mysql
clusterIP: None
应用 Service 配置:
kubectl apply -f mysql-service.yaml
4. 配置定期备份
4.1 配置备份 CronJob
创建定期备份 MySQL 数据的 CronJob 文件 mysql-backup-cronjob.yaml
:
apiVersion: batch/v1
kind: CronJob
metadata:
name: mysql-backup
spec:
schedule: "0 2 * * *" # 每天凌晨2点
jobTemplate:
spec:
template:
spec:
containers:
- name: mysql-backup
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: yourpassword
command:
- /bin/sh
- -c
- >
mysqldump -u root -p${MYSQL_ROOT_PASSWORD} --all-databases > /backup/all-databases.sql
volumeMounts:
- name: backup-storage
mountPath: /backup
restartPolicy: OnFailure
volumes:
- name: backup-storage
persistentVolumeClaim:
claimName: mysql-pvc
应用 CronJob 配置:
kubectl apply -f mysql-backup-cronjob.yaml
注意事项
- NFS 配置:确保 NFS 服务器的共享目录具有适当的权限设置 (
777
) 以允许 Kubernetes Pod 进行读写操作。 - 环境变量:在实际生产环境中,请使用 Kubernetes Secrets 来管理敏感信息,例如 MySQL 的 root 密码。
- 持久化存储:选择合适的存储策略,例如在 StorageClass 中设置
reclaimPolicy
为Retain
,以确保在删除 PVC 后数据不会被自动删除。 - 备份策略:根据实际需求调整 CronJob 的调度策略和备份脚本,确保数据的完整性和可恢复性。
通过以上详细步骤,您可以在 Kubernetes 上成功部署一个使用 NFS 动态存储的 MySQL 集群,并配置定期备份以防止数据丢失。这种方法确保了数据的持久性、自动化管理和高可用性。