概述
文章目录
- 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
k8s-master nfs-server
k8s-node1 k8s-node2 nfs-client
所有节点安装nfs
yum install -y nfs-common nfs-utils
在master节点创建共享目录
[root@k8s-master k8s]# mkdir /nfsdata
授权共享目录
[root@k8s-master k8s]# chmod 666 /nfsdata
编辑exports文件
[root@k8s-master k8s]# cat /etc/exports
/nfsdata *(rw,no_root_squash,no_all_squash,sync)
配置生效
启动rpc和nfs(注意顺序)
[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
如下:
[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目录所在的机器的地址
意思详解
① `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
:
[root@k8s-master ~]# kubectl apply -f nfs-pv1.yml
STATUS
为 Available
,表示 mypv1
就绪,可以被 PVC 申请。
2.3创建PVC
接下来创建 PVC mypvc1
,配置文件 nfs-pvc1.yml
如下:
[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
:
[root@k8s-master ~]# kubectl apply -f nfs-pvc1.yml
从 kubectl get pvc
和 kubectl get pv
的输出可以看到 mypvc1
已经 Bound 到 mypv1
,申请成功。
2.4创建pod
上面已经创建好了pv和pvc,pod中直接使用这个pvc即可
[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
:
[root@k8s-master ~]# kubectl apply -f pod1.yml
可以写再一个文件里面
2.5验证
[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
[root@k8s-master pvc]# kubectl delete pod mypod1
删除pvc
[root@k8s-master pvc]# kubectl delete pvc mypvc1
再次查看pv的状态
[root@k8s-master pvc]# kubectl get pv
删除pvc之后pv的状态变为Available,,此时解除绑定后则可以被新的 PVC 申请。
/nfsdata文件中的文件被删除了
因为 PV 的回收策略设置为 Recycle
,所以数据会被清除,
但这可能不是我们想要的结果。如果我们希望保留数据,可以将策略设置为 Retain
[root@k8s-master pvc]# vim nfs-pv1.yml
[root@k8s-master pvc]# kubectl apply -f nfs-pv1.yml
回收策略已经变为 Retain
,通过下面步骤验证其效果:
重新创建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 对象,存储空间中的数据并不会被删除。
[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
yum install -y nfs-common nfs-utils
master节点作为nfs服务端
[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
重启一下
systemctl restart nfs rpcbind
master节点操作
#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
[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
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,暴露一下端口
这里暴露不暴露都可以
[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服务器操作
[root@k8s-master pvc2]# echo youngfit >> /data/opv/index.html
#5.访问,看效果
PV&&PVC应用在mysql的持久化存储实战项目
下面演示如何为 MySQL 数据库提供持久化存储,步骤为:
- 创建 PV 和 PVC。
- 部署 MySQL。
- 向 MySQL 添加数据。
- 模拟节点宕机故障,Kubernetes 将 MySQL 自动迁移到其他节点。
- 验证数据一致性。
首先创建 PV 和 PVC,配置如下:
mysql-pv.yml
所有节点下载nfs
yum install -y nfs-common nfs-utils
master节点作为nfs服务端
[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
重启一下
systemctl restart nfs rpcbind
创建pv
[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
[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,配置文件如下:
[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
,模拟节点宕机故障。
[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);
模拟节点故障
[root@k8s-node1 ~]# poweroff
验证数据的一致性:
由于node1节点已经宕机,node2节点接管了这个任务,pod转移,需要等待一段时间,我这里等待了5分钟左右。。
进入新的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的静态供给nginx案例、PV&&PVC应用在mysql的持久化存储实战项目定义pvc的数据来源,根据容量大小来匹配pv所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复