MySQL作为广泛使用的关系型数据库,在K8s环境中的部署和数据持久化成为了一个重要课题
本文将详细介绍如何在K8s中实现MySQL数据目录的挂载,确保数据库数据的持久性和可靠性
一、引言 在K8s中部署MySQL时,一个核心问题是如何确保数据的持久化
由于Pod是K8s中最小的可部署计算单元,且其生命周期可能因各种原因(如升级、故障等)而终止,因此直接将数据存储在Pod内部是不安全的
为了实现数据的持久化,我们需要将MySQL的数据目录挂载到外部存储上,这样即使Pod被删除或重启,数据也能得以保留
二、环境准备 在开始之前,请确保您已经安装并配置好了Kubernetes和Docker环境
以下是安装Docker和Kubernetes的基本步骤(以Ubuntu为例): 1.安装Docker: bash sudo apt-get update sudo apt-get install -y docker.io sudo systemctl start docker sudo systemctl enable docker 2.安装Kubernetes: bash sudo apt-get install -y apt-transport-https ca-certificates curl curl -s | sudo apt-key add - cat [eof>/etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo systemctl enable kubelet 3.初始化Kubernetes集群: bash sudo kubeadm init --pod-network-cidr=192.168.0.0/16 4.配置kubectl访问: bash mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown$(id -u):$(id -g) $HOME/.kube/config 5.部署网络插件(如Calico、Flannel等,具体步骤略)
三、创建Persistent Volume(PV)和Persistent Volume Claim(PVC) 在K8s中,Persistent Volume(PV)用于定义存储资源,而Persistent Volume Claim(PVC)则用于请求这些存储资源
以下是一个创建PV和PVC的示例: 1.创建PV: yaml apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv spec: capacity: storage:10Gi 定义存储容量 accessModes: - ReadWriteOnce 存储的访问模式 hostPath: path: /data/mysql主机上的存储路径,确保该路径在宿主机上存在且可写 将上述YAML内容保存为`mysql-pv.yaml`,然后使用`kubectl apply -f mysql-pv.yaml`命令创建PV
2.创建PVC: yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage:10Gi 请求的存储大小应与PV中的定义相匹配 将上述YAML内容保存为`mysql-pvc.yaml`,然后使用`kubectl apply -f mysql-pvc.yaml`命令创建PVC
PVC创建后,K8s会自动将其与匹配的PV进行绑定
四、部署MySQL Deployment 接下来,我们需要定义一个MySQL的Deployment,以便K8s可以管理MySQL的Pod
在Deployment配置中,我们将指定使用之前创建的PVC来挂载MySQL的数据目录
yaml apiVersion: apps/v1 kind: Deployment metadata: name: mysql-deployment spec: replicas:1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:5.7 使用MySQL5.7版本镜像 env: - name: MYSQL_ROOT_PASSWORD value: rootpassword 设置MySQL的root密码 ports: - containerPort:3306 MySQL默认端口 volumeMounts: - mountPath: /var/lib/mysql MySQL数据存储路径 name: mysql-storage volumes: - name: mysql-storage persistentVolumeClaim: claimName: mysql-pvc 使用先前创建的PVC 将上述YAML内容保存为`mysql-deployment.yaml`,然后使用`kubectl apply -f mysql-deployment.yaml`命令创建Deployment
K8s将根据该配置启动MySQL Pod,并将/var/lib/mysql目录挂载到之前创建的PVC所指向的存储上
五、创建Service暴露MySQL服务 为了使外部可以访问MySQL数据库,我们需要创建一个Service
以下是一个创建Service的示例: yaml apiVersion: v1 kind: Service metadata: name: mysql-service spec: type: ClusterIP 默认类型,也可以根据需要设置为NodePort或LoadBalancer等类型 ports: - port:3306 targetPort:3306 selector: app: mysql 选择器匹配到Deployment的标签 将上述YAML内容保存为`mysql-service.yaml`,然后使用`kubectl apply -f mysql-service.yaml`命令创建Service
创建成功后,您可以通过Service的ClusterIP和端口来访问MySQL数据库
六、使用NFS实现动态持久化存储(可选) 除了使用hostPath类型的PV外,我们还可以使用NFS等网络文件系统来实现更灵活和可扩展的持久化存储
以下是一个使用NFS-Client-Provisioner配置MySQL持久化存储的示例: 1.部署NFS服务器(在Master节点上): bash sudo apt install nfs-server sudo mkdir /nfs_data echo /nfs_data(rw,sync,no_root_squash) ] /etc/exports sudo chmod666 /nfs_data sudo mkdir /nfs_data/mysql sudo systemctl restart nfs-server 2.在Node节点上安装NFS客户端: bash sudo apt-get install nfs-common sudo mount -t nfs MASTER_IP:/nfs_data /nfs_data 测试挂