前言
Kubernetes(常简称为 K8s):
是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一个强大的工具集,可以简化容器化应用程序的部署、维护和扩展,从而使开发人员和运维团队更加轻松地管理复杂的容器化工作负载。
NFS (Network File System):
NFS 是一种网络文件系统协议,允许远程计算机通过网络访问共享文件。在 Kubernetes 中,可以将 NFS 服务器挂载到集群中的多个 Pod 上,以提供持久化存储。
PV (PersistentVolume):
PV 是 Kubernetes 中的一种资源,它表示一块持久化存储的卷。PV 独立于 Pod 存在,可以被多个 Pod 使用。管理员需要先创建 PV,然后才能被 Pod 使用。
PVC (PersistentVolumeClaim):
PVC 是对 PV 的请求,用于向 Kubernetes 集群请求持久化存储资源。Pod 通过 PVC 来申请 PV,并且只有在 PVC 和 PV 匹配成功时,Pod 才能成功绑定 PV。
Pod:
Pod 是 Kubernetes 中最小的部署单元,可以包含一个或多个容器。Pod 可以使用 PVC 来请求持久化存储,并且可以将 NFS 挂载到其中的容器中,以便存储和访问数据。
MySQL:
MySQL 是一个流行的开源关系型数据库管理系统,可以在容器中运行。通过将 MySQL Pod 与 PVC 绑定,可以实现 MySQL 数据的持久化存储,即使 Pod 被删除或重启,数据仍然可以被保留。
一、实验环境
三台主机均centos7.9
Ip | 主机名 | cpu | 内存 | 硬盘
----- | ----- | --- | --- | ---
192.168.10.11 | master | 1cpu双核 | 2G | 40G
192.168.10.12 | node01 | 1cpu双核 | 2G | 40G
192.168.10.13 | node02 | 1cpu双核 | 2G | 40g
k8s集群已配置
版本 1.18.0
nfs配置在master上
结尾有所有yaml文件的详细解释
二、具体步骤
1.准备存储设备:这里使用的是NFS
所有节点都安装nfs-utils工具包和rpc-bind服务。
yum -y install nfs-utils rpcbind -y
这里准备将NFS服务部署在master节点上,需要在master节点上提前规划好共享的目录
[root@master ~]# vim /etc/exports
输入 /nfsdata *(rw,sync,no_root_squash)
:wq 保存退出
[root@master ~]# systemctl start rpcbind
[root@master ~]# systemctl enable rpcbind
[root@master ~]# systemctl start nfs-server
[root@master ~]# systemctl enable nfs-server
[root@master ~]# showmount -e
nfs成功部署
2.现在部署一个MySQL服务,并且将MySQL的数据进行持久化存储。
(1)创建PV,PVC
编写pv的yaml文件
[root@master ~]# vim mysql-pv.yaml
kind: PersistentVolume
apiVersion: v1
metadata:
name: mysql-pv
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 1Gi
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
path: /nfsdata/mysql-pv
server: 192.168.10.11
编写pvc的yaml文件
[root@master ~]# vim mysql-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: nfs
resources:
requests:
storage: 1Gi
[root@master ~]# mkdir /nfsdata/mysql-pv
[root@master ~]# kubectl apply -f mysql-pv.yaml
创建pv
[root@master ~]# kubectl apply -f mysql-pvc.yaml
创建pvc
[root@master ~]# kubectl get pv,pvc
获得pv和pvc的信息
(2)部署MySQL
编写关于mysql的deployment与service的yaml文件
[root@master ~]# vim mysql.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_ROOT_PASSWORD
value: 123.com
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-storage
persistentVolumeClaim:
claimName: mysql-pvc
---
kind: Service
apiVersion: v1
metadata:
name: mysql
spec:
type: NodePort
selector:
app: mysql
ports:
- port: 3306
targetPort: 3306
nodePort: 31306
(3)在MySQL数据库中添加数据
获得pod的资源信息
[root@master ~]# kubectl get pod
根据获得的name登录mysql
[root@master ~]# kubectl exec -it mysql-5d86c64fc9-2294l -- mysql -uroot -p123.com
mysql> SHOW DATABASES; //查看当前的库。
mysql> CREATE DATABASE auth; //创建auth库。
mysql> USE auth; //选择使用auth库。
mysql> CREATE TABLE users(user_name char(10),user_passwd char(40)); //创建my_id表
mysql> INSERT users values ('zhangsan','123'); //往my_id表中,插入数据。
mysql> SELECT * FROM users; //查看my_id表中所有数据
(4)模拟MySQ服务器节点故障
获取 Kubernetes 集群中所有 Pod 的信息,并显示更多的详细信息
[root@master ~]# kubectl get pod -o wide
删除pod,k8s集群会产生一个新的Pod,验证这个Pod内是否有之前数据。
[root@master ~]# kubectl delete pod mysql-5d86c64fc9-2294l
[root@master ~]# kubectl get pod -o wide
根据新pod名称登录mysql查看
[root@master ~]# kubectl exec -it mysql-5d86c64fc9-vqkh7 -- mysql -u root -p123.com
mysql> show databases;
mysql> use auth;
mysql> show tables;
mysql> select * from users;
可以发现数据依然存在
查看nfs
[root@master ~]# ls /nfsdata/mysql-pv/
有数据
实验完成
总结
三个yaml文件的详细解释
pv
kind: PersistentVolume:这一行指定了资源对象的类型为持久卷。
apiVersion: v1:指定了Kubernetes API的版本。
metadata: name: mysql-pv:在元数据部分定义了持久卷的名称为mysql-pv。
spec: :这个部分包含了持久卷的规格说明。
accessModes: - ReadWriteOnce:指定了持久卷的访问模式,这里是ReadWriteOnce,表示可以被单个节点挂载为读写模式访问。
capacity: storage: 1Gi:定义了持久卷的存储容量为1GB。
persistentVolumeReclaimPolicy: Retain:指定了当持久卷上的所有声明被删除后,保留持久卷的数据,需要手动处理。
storageClassName: nfs:指定了存储类型的类名为nfs,这将与存储类(StorageClass)相关联,用于动态分配持久卷。
nfs: path: /nfsdata/mysql-pv:这里指定了NFS存储的路径为/nfsdata/mysql-pv。
server: 192.168.10.11:指定了NFS服务器的地址为192.168.10.11,这是提供NFS存储的服务器地址。
pvc
kind: PersistentVolumeClaim:这一行指定了资源对象的类型为持久卷声明。
apiVersion: v1:指定了Kubernetes API的版本。
metadata: name: mysql-pvc:在元数据部分定义了持久卷声明的名称为mysql-pvc。
spec: :这个部分包含了持久卷声明的规格说明。
accessModes: - ReadWriteOnce:指定了持久卷声明的访问模式,这里是ReadWriteOnce,表示需要一个节点挂载为读写模式访问。
storageClassName: nfs:指定了存储类型的类名为nfs,这将与存储类(StorageClass)相关联,用于动态分配持久卷。
resources: requests: storage: 1Gi:定义了持久卷声明需要的存储资源,这里请求了1GB的存储容量。
mysql
Deployment部分:
kind: Deployment:指定了资源对象的类型为部署。
apiVersion: apps/v1:指定了Kubernetes API的版本。
metadata: name: mysql:在元数据部分定义了部署的名称为mysql。
spec: :这个部分包含了部署的规格说明。
selector: matchLabels: app: mysql:指定了用于选择Pod的标签。
template: metadata: labels: app: mysql:定义了Pod的模板,设置了Pod的标签。
spec: containers: - name: mysql:指定了容器的名称为mysql。
image: mysql:5.7:使用的MySQL镜像的版本。
imagePullPolicy: IfNotPresent:设置容器拉取镜像的策略为如果本地不存在才拉取。
env: - name: MYSQL_ROOT_PASSWORD value: 123.com:设置了MySQL根密码的环境变量。
volumeMounts: - name: mysql-storage mountPath: /var/lib/mysql:指定了挂载持久卷的路径。
volumes: - name: mysql-storage persistentVolumeClaim: claimName: mysql-pvc:定义了用于挂载的持久卷声明名称。
Service部分:
kind: Service:指定了资源对象的类型为服务。
apiVersion: v1:指定了Kubernetes API的版本。
metadata: name: mysql:在元数据部分定义了服务的名称为mysql。
spec: type: NodePort:定义了服务的类型为NodePort。
selector: app: mysql:指定了用于选择后端Pod的标签。
ports: - port: 3306 targetPort: 3306 nodePort: 31306:定义了服务暴露的端口以及节点端口。
以上就是今天学习的内容,通过NFS+PV+PVC+POD,部署一个MySQL服务,并将MySQL的数据进行持久化存储,希望对各位有所帮助
若有错误,请指出,见立改