我是靠谱客的博主 激动项链,这篇文章主要介绍k8s、持久化存储PV和PVC、PV/PVC的静态供给nginx案例、PV&&PVC应用在mysql的持久化存储实战项目定义pvc的数据来源,根据容量大小来匹配pv,现在分享给大家,希望可以做个参考。

文章目录

    • 1.PV和PVC的引入
    • 2.通过NFS实现持久化存储
      • 2.1 配置nfs
    • 2.2 创建PV
    • 2.3创建PVC
    • 2.4创建pod
    • 2.5验证
    • 3.PV的回收
    • 4.PV/PVC的静态供给nginx案例
    • 定义pvc和deployment
  • 定义pvc的数据来源,根据容量大小来匹配pv
    • 3,暴露一下端口
    • PV&&PVC应用在mysql的持久化存储实战项目
    • 创建pv
    • 创建pvc
    • 创建pod
    • 测试

1.PV和PVC的引入

Volume 提供了非常好的数据持久化方案,不过在可管理性上还有不足。
拿前面 AWS EBS 的例子来说,要使用 Volume,Pod 必须事先知道如下信息:
当前 Volume 来自 AWS EBS。
EBS Volume 已经提前创建,并且知道确切的 volume-id。
Pod 通常是由应用的开发人员维护,而 Volume 则通常是由存储系统的管理员维护。开发人员要获得上面的信息:
要么询问管理员。
要么自己就是管理员。
这样就带来一个管理上的问题:应用开发人员和系统管理员的职责耦合在一起了。如果系统规模较小或者对于开发环境这样的情况还可以接受。但当集群规模变大,特别是对于生成环境,考虑到效率和安全性,这就成了必须要解决的问题。

2.通过NFS实现持久化存储

2.1 配置nfs

复制代码
1
2
3
4
k8s-master nfs-server k8s-node1 k8s-node2 nfs-client

所有节点安装nfs

复制代码
1
2
yum install -y nfs-common nfs-utils

在master节点创建共享目录

复制代码
1
2
[root@k8s-master k8s]# mkdir /nfsdata

授权共享目录

复制代码
1
2
[root@k8s-master k8s]# chmod 666 /nfsdata

编辑exports文件

复制代码
1
2
3
[root@k8s-master k8s]# cat /etc/exports /nfsdata *(rw,no_root_squash,no_all_squash,sync)

配置生效

启动rpc和nfs(注意顺序)

复制代码
1
2
3
[root@k8s-master k8s]# systemctl start rpcbind [root@k8s-master k8s]# systemctl start nfs

作为准备工作,我们已经在 k8s-master 节点上搭建了一个 NFS 服务器,目录为 /nfsdata

2.2 创建PV

三个配置文件可以放到一起,这一种方法就是,删除pod,pvc,共享目录里面的文件会被删除
下面创建一个 PV mypv1,配置文件 nfs-pv1.yml 如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@k8s-master ~]# vim nfs-pv1.yml apiVersion: v1 kind: PersistentVolume metadata: name: mypv1 spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClassName: nfs nfs: path: /nfsdata server: 192.168.153.148 #指定nfs目录所在的机器的地址

意思详解

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
`capacity` 指定 PV 的容量为 1G。 ② `accessModes` 指定访问模式为 `ReadWriteOnce`,支持的访问模式有: ReadWriteOnce – PV 能以 read-write 模式 mount 到单个节点。 ReadOnlyMany – PV 能以 read-only 模式 mount 到多个节点。 ReadWriteMany – PV 能以 read-write 模式 mount 到多个节点。 ③ `persistentVolumeReclaimPolicy` 指定当 PV 的回收策略为 `Recycle`,支持的策略有: Retain – 需要管理员手工回收。 Recycle – 清除 PV 中的数据,效果相当于执行 `rm -rf /nfsdata/*`。 Delete – 删除 Storage Provider 上的对应存储资源,例如 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume 等。 ④ `storageClassName` 指定 PV 的 class 为 `nfs`。相当于为 PV 设置了一个分类,PVC 可以指定 class 申请相应 class 的 PV。 ⑤ 指定 PV 在 NFS 服务器上对应的目录。

创建 mypv1

复制代码
1
2
[root@k8s-master ~]# kubectl apply -f nfs-pv1.yml

在这里插入图片描述
STATUSAvailable,表示 mypv1 就绪,可以被 PVC 申请。

2.3创建PVC

接下来创建 PVC mypvc1,配置文件 nfs-pvc1.yml 如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@k8s-master ~]# cat nfs-pvc1.yml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mypvc1 spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: nfs

在这里插入图片描述
PVC 就很简单了,只需要指定 PV 的容量,访问模式和 class。

执行命令创建 mypvc1

复制代码
1
2
[root@k8s-master ~]# kubectl apply -f nfs-pvc1.yml

在这里插入图片描述
kubectl get pvckubectl get pv 的输出可以看到 mypvc1 已经 Bound 到 mypv1,申请成功。

2.4创建pod

上面已经创建好了pv和pvc,pod中直接使用这个pvc即可

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@k8s-master ~]# cat pod1.yml apiVersion: v1 kind: Pod metadata: name: mypod1 spec: containers: - name: mypod1 image: busybox volumeMounts: - mountPath: "/mydata" name: mydata volumes: - name: mydata persistentVolumeClaim: claimName: mypvc1

在这里插入图片描述
与使用普通 Volume 的格式类似,在 volumes 中通过 persistentVolumeClaim 指定使用 mypvc1 申请的 Volume。

通过命令创建mypod1

复制代码
1
2
[root@k8s-master ~]# kubectl apply -f pod1.yml

可以写再一个文件里面
在这里插入图片描述
在这里插入图片描述

2.5验证

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@k8s-master ~]# kubectl exec -it mypod1 /bin/sh / # ls mydata/ / # echo "youngfit" > mydata/hello.txt / # ls mydata/ hello.txt / # exit [root@k8s-master ~]# ls /nfsdata/ #也可在nfs的共享目录中查看到,说明卷共享成功 hello.txt [root@k8s-master ~]# cat /nfsdata/hello.txt youngfit 可见,在 Pod 中创建的文件 /mydata/hello.txt 确实已经保存到了 NFS 服务器目录 /nfsdata中。 如果不再需要使用 PV,可用删除 PVC 回收 PV。 在这里,可以尝试在任何一方删除文件,文件在两端都会消失;

3.PV的回收

当 PV 不再需要时,可通过删除 PVC 回收。未删除pvc之前 pv的状态是Bound
在这里插入图片描述
删除pod

复制代码
1
2
[root@k8s-master pvc]# kubectl delete pod mypod1

删除pvc

复制代码
1
2
[root@k8s-master pvc]# kubectl delete pvc mypvc1

再次查看pv的状态

复制代码
1
2
[root@k8s-master pvc]# kubectl get pv

删除pvc之后pv的状态变为Available,,此时解除绑定后则可以被新的 PVC 申请。
/nfsdata文件中的文件被删除了
在这里插入图片描述
因为 PV 的回收策略设置为 Recycle,所以数据会被清除,
在这里插入图片描述
但这可能不是我们想要的结果。如果我们希望保留数据,可以将策略设置为 Retain

复制代码
1
2
[root@k8s-master pvc]# vim nfs-pv1.yml

在这里插入图片描述

复制代码
1
2
[root@k8s-master pvc]# kubectl apply -f nfs-pv1.yml

在这里插入图片描述
回收策略已经变为 Retain,通过下面步骤验证其效果:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
重新创建mypvc1 [root@k8s-master pvc]# kubectl apply -f nfs-pvc1.yml 重新创建pod,引用mypvc1 [root@k8s-master pvc]# kubectl apply -f pod1.yml 进入pod中,创建文件 [root@k8s-master pvc]# kubectl exec -it mypod1 /bin/sh / # echo 'youngfit' > mydata/hello.txt / # ls mydata/ hello.txt / # exit 在nfs目录下检验 [root@k8s-master pvc]# ls /nfsdata/ hello.txt [root@k8s-master pvc]# cat /nfsdata/hello.txt youngfit 删除pod [root@k8s-master pvc]# kubectl delete -f pod1.yml pod "mypod1" deleted [root@k8s-master pvc]# ls /nfsdata/ hello.txt 删除pvc(mypvc1) [root@k8s-master pvc]# kubectl delete pvc mypvc1 persistentvolumeclaim "mypvc1" deleted [root@k8s-master pvc]# ls /nfsdata/ hello.txt [root@k8s-master pvc]# cat /nfsdata/hello.txt youngfit 发现数据仍然保留

虽然 mypv1 中的数据得到了保留,但其 PV 状态会一直处于 Released,不能被其他 PVC 申请。为了重新使用存储资源,可以删除并重新创建 mypv1。删除操作只是删除了 PV 对象,存储空间中的数据并不会被删除。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
[root@k8s-master pvc]# ls /nfsdata/ hello.txt [root@k8s-master pvc]# kubectl delete pv mypv1 persistentvolume "mypv1" deleted [root@k8s-master pvc]# ls /nfsdata/ hello.txt [root@k8s-master pvc]# kubectl apply -f nfs-pv1.yml persistentvolume/mypv1 created [root@k8s-master pvc]# kubectl get pod No resources found in default namespace. [root@k8s-master pvc]# kubectl get pv

在这里插入图片描述
新建的 mypv1 状态为 Available,已经可以被 PVC 申请。

PV 还支持 Delete 的回收策略,会删除 PV 在 Storage Provider 上对应存储空间。NFS 的 PV 不支持 Delete,支持 Delete 的 Provider 有 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume 等。

4.PV/PVC的静态供给nginx案例

我这里遇到的错误就是,前面的共享目录没有更改,
所有节点下载nfs

复制代码
1
2
yum install -y nfs-common nfs-utils

master节点作为nfs服务端

复制代码
1
2
3
4
5
6
7
[root@k8s-master k8s]# cat /etc/exports /data/opv *(rw,no_root_squash,no_all_squash,sync) [root@k8s-master k8s]# mkdir /data/opv [root@k8s-master k8s]# chmod 777 -R /data/opv

重启一下

复制代码
1
2
systemctl restart nfs rpcbind

master节点操作

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#1.定义pv [root@k8s-master pvc2]# cat pv-pod.yaml apiVersion: v1 kind: PersistentVolume metadata: name: my-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteMany nfs: path: /data/opv #nfs服务端共享的目录 server: 192.168.153.148 #nfs服务器的地址 [root@k8s-master pvc2]# kubectl apply -f pv-pod.yaml

在这里插入图片描述

定义pvc和deployment

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@k8s-master pvc2]# cat pvc-pod.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: daocloud.io/library/nginx #启用数据卷的名字为wwwroot,并挂载到nginx的html目录下 volumeMounts: - name: wwwroot mountPath: /usr/share/nginx/html ports: - containerPort: 80 #定义数据卷名字为wwwroot,类型为pvc volumes: - name: wwwroot persistentVolumeClaim: claimName: my-pvc

在这里插入图片描述

定义pvc的数据来源,根据容量大小来匹配pv

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1 kind: PersistentVolumeClaim metadata: #对应上面的名字 name: my-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 5G [root@k8s-master pvc2]# kubectl apply -f pvc-pod.yaml

在这里插入图片描述

3,暴露一下端口

这里暴露不暴露都可以

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@k8s-master pvc2]# cat pv-service.yaml apiVersion: v1 kind: Service metadata: name: pv-svc spec: type: NodePort ports: - port: 8080 nodePort: 30001 targetPort: 80 selector: #选择器 app: nginx

#4.nfs服务器操作

复制代码
1
2
[root@k8s-master pvc2]# echo youngfit >> /data/opv/index.html

#5.访问,看效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

PV&&PVC应用在mysql的持久化存储实战项目

下面演示如何为 MySQL 数据库提供持久化存储,步骤为:

  1. 创建 PV 和 PVC。
  2. 部署 MySQL。
  3. 向 MySQL 添加数据。
  4. 模拟节点宕机故障,Kubernetes 将 MySQL 自动迁移到其他节点。
  5. 验证数据一致性。

首先创建 PV 和 PVC,配置如下:
mysql-pv.yml
所有节点下载nfs

复制代码
1
2
yum install -y nfs-common nfs-utils

master节点作为nfs服务端

复制代码
1
2
3
4
5
6
7
[root@k8s-master k8s]# cat /etc/exports /nfsdata/mysql-pv*(rw,no_root_squash,no_all_squash,sync) [root@k8s-master k8s]# mkdir /nfsdata/mysql-pv [root@k8s-master k8s]# chmod 777 -R /nfsdata/mysql-pv

重启一下

复制代码
1
2
systemctl restart nfs rpcbind

创建pv

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@k8s-master mysqlpv]# cat mysql-pv.yml apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: nfs nfs: path: /nfsdata/mysql-pv server: 192.168.153.148 [root@k8s-master mysqlpv]# kubectl apply -f mysqlpv.yml

创建pvc

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@k8s-master mysqlpv]# cat mysql-pvc.yml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: nfs [root@k8s-master mysqlpv]# kubectl apply -f mysql-pvc.yml

我都放在一起啦
在这里插入图片描述
在这里插入图片描述

创建pod

接下来部署 MySQL,配置文件如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
[root@k8s-master mysqlpv]# cat mysqlpod.yml apiVersion: v1 kind: Service metadata: name: mysql spec: ports: - port: 3306 selector: app: mysql --- apiVersion: apps/v1 kind: Deployment metadata: name: mysql spec: selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - image: daocloud.io/library/mysql:5.7.5-m15 #这里的镜像一定要选对,能确保拉取到,而且能使用变量 name: mysql env: - name: MYSQL_ROOT_PASSWORD value: password ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mysql-pvc [root@k8s-master mysqlpv]# kubectl apply -f mysqlpod.yml

在这里插入图片描述
PVC mysql-pvc Bound 的 PV mysql-pv 将被 mount 到 MySQL 的数据目录 /var/lib/mysql

MySQL 被部署到 k8s-node1
在这里插入图片描述

测试

① 切换到数据库 mysql。

② 创建数据库表 my_id。

③ 插入一条数据。

④ 确认数据已经写入。

关闭 k8s-node1,模拟节点宕机故障。

复制代码
1
2
3
4
5
6
[root@k8s-master mysqlpv]# kubectl exec -it mysql-6654fcb867-mqtcl /bin/bash root@mysql-6654fcb867-mqtcl:/# mysql -uroot -p'password' mysql> create database feige; mysql> create table feige.t1(id int); mysql> insert into feige.t1 values(2);

模拟节点故障

复制代码
1
2
[root@k8s-node1 ~]# poweroff

验证数据的一致性:

由于node1节点已经宕机,node2节点接管了这个任务,pod转移,需要等待一段时间,我这里等待了5分钟左右。。
在这里插入图片描述

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
进入新的pod中,数据仍然存在,持久化成功。很安全 [root@k8s-master mysqlpv]# kubectl exec -it mysql-6654fcb867-mqtcl /bin/bash root@mysql-6654fcb867-mqtcl:/# mysql -uroot -p'password' mysql> select * from feige.t1; +------+ | id | +------+ | 1 | | 2 | +------+ 2 rows in set (0.01 sec)

MySQL 服务恢复,数据也完好无损。

最后

以上就是激动项链最近收集整理的关于k8s、持久化存储PV和PVC、PV/PVC的静态供给nginx案例、PV&&PVC应用在mysql的持久化存储实战项目定义pvc的数据来源,根据容量大小来匹配pv的全部内容,更多相关k8s、持久化存储PV和PVC、PV/PVC内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(94)

评论列表共有 0 条评论

立即
投稿
返回
顶部