简介:
PersistentVolume (PV): PV是集群中配置好的一个网络存储,是集群的全局资源,不属于任何namespace;PV无法与pod直接关联,它的设计是用来和存储对接的,所以用于绑定后端存储,写入PV的数据最终都是存放在后端存储服务器上
PersistentVolumeClaim (PVC):PVC可以直接被pod挂载,同时可以绑定PV,从而让pod使用PV; PVC与挂载它的pod隶属于同一个namespace
官网资料: https://v1-22.docs.kubernetes.io/zh/docs/concepts/storage/persistent-volumes
总结: PV是对底层网络存储的抽象,将网络存储定义为一种存储资源,将一个整体的存储资源拆分成多份后给不同的业务使用
PVC是对PV资源的申请调用,pod是通过PVC将数据保存到PV,PV再把数据保存至真正的硬件存储
pod-pvc-pv关系图如下:
可以看出层级关系最底层是存储,上层是PV,再上层是PVC,最上层是pod ;因此创建的话就得从底层往上层开始
PV参数
访问模式:
ReadWriteOnce : PV只能被单个节点以读写权限挂载,rwo
ReadOnlyMany: PV可以被多个节点挂载但是权限是只读的,rox
ReadWrieMany: PV可以被多个节点以读写方式挂载使用, rwx
删除机制:
Retain : 删除PV后保持原状,如果需要删除数据需要管理员到存储上手动删除(建议)
Recycle : 空间回收,直接删除存储卷上所有数据,目前仅支持NFS和hostPath (不建议)
Delete : 自动删除存储卷
卷类型:
定义存储卷使用的文件系统是块设备还是文件系统,默认是文件系统
PVC参数
访问模式:
ReadWriteOnce : PVC只能被单个节点以读写权限挂载,rwo
ReadOnlyMany: PVC可以被多个节点挂载但是权限是只读的,rox
ReadWrieMany: PVC可以被多个节点以读写方式挂载使用, rwx
resources : 定义PVC创建存储卷的大小
PVC如何绑定PV:(两种方式)
1、seletcot : 标签选择器,用来选择需要绑定的PV
# matchLabels : 匹配标签名称
# matchExpressions : 基于正则表达式匹配
2、volumeName : 直接点名要绑定的PV名称(相较于上面的标签选择器更精准)
volumeMode : 卷类型
定义PVC使用的文件系统是块设备还是文件系统,默认是文件系统
注:PVC空间要小于PV的空间
主机用途 | IP | 主机名 |
K8S集群node | 172.31.7.111 | node1 |
nfs网络存储服务器 | 172.31.7.109 | haproxy02 |
K8S集群管理节点 | 172.31.7.110 | k8s-deploy |
一、部署存储卷
1、把172.31.7.109主机设置为nfs共享存储服务器
1.1、安装nfs服务端
root@haproxy02:~# apt install nfs-server
1.2、创建共享目录
root@haproxy02:~# mkdir /data/k8sdata/myappdata -p
root@haproxy02:/data/k8sdata# echo pv >> /data/k8sdata/myappdata/index.html
1.3、设置共享,把目录进行共享,赋予读写权限,不做权限映射,是哪个用户写的就是哪个用户的uid和gid权限
root@haproxy02:~# echo -e "/data/k8sdata *(rw,no_root_squash)" >> /etc/exports
1.4、重启服务并设置开机自启
root@haproxy02:~# systemctl restart nfs-server && systemctl enable nfs-server
在nfs服务端创建共享目录文件 /data/k8sdata/myappdata/index.html
2、客户端检查nfs共享目录
1、安装showmount命令客户端
root@k8s-deploy:~/yaml/yl# apt install nfs-common
2、检查能否识别到nfs服务器,和权限
root@k8s-deploy:~/yaml/yl# showmount -e 172.31.7.109
Export list for 172.31.7.109:
/data/k8sdata *
3、在K8S集群创建PV
root@k8s-deploy:~/yaml/yl# vim pv.yaml
kind: PersistentVolume #资源类型是PV
apiVersion: v1
metadata: #因为是全局资源不需要指定namespace
name: myserver-myapp-static-pv #PV名称
spec:
capacity:
storage: 2Gi
accessModes: #访问模式
- ReadWriteOnce #被单个节点以读写权限挂载
nfs:
path: /data/k8sdata/myappdata #nfs共享目录
server: 172.31.7.109 #nfs server端地址
root@k8s-deploy:~/yaml/yl# kubectl apply -f pv.yaml
root@k8s-deploy:~/yaml/yl# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
myserver-myapp-static-pv 2Gi RWO Retain Available 4s
PV的状态必须要是Available 可用的
4、在K8S集群创建PVC
root@k8s-deploy:~/yaml/yl# vim pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: myserver-myapp-static-pvc
namespace: myserver
spec:
volumeName: myserver-myapp-static-pv #指定要绑定的PV名称
accessModes: #访问模式
- ReadWriteOnce #访问模式是只能被单个节点以读写权限挂载
resources: #定义PVC创建存储卷的大小
requests: #大小请求
storage: 2Gi #PVC 2G大小
创建namespace
root@k8s-deploy:~/yaml/yl# kubectl create ns myserver
启动pvc
root@k8s-deploy:~/yaml/yl# kubectl apply -f pvc.yaml
可以看见PVC已经绑定到PV上了
5、在K8S集群创建pod资源
root@k8s-deploy:~/yaml/yl# cat nginx-pvc-pod.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: myserver-myapp-deployment
namespace: myserver
labels:
app: myserver-myapp
spec:
replicas: 1
selector:
matchLabels:
app: myserver-app
template:
metadata:
labels:
app: myserver-app
spec:
containers:
- name: myapp-container
image: nginx:1.20.0
volumeMounts:
- mountPath: "/usr/share/nginx/html/statics" #容器的挂载点
name: statics-datadir #被挂载卷的名称
volumes:
- name: statics-datadir #共享存储卷名称,把下面的PVC声明一个卷叫做statics-datadir,再把这个卷挂载到上面的容器目录
persistentVolumeClaim: #类型是PVC
claimName: myserver-myapp-static-pvc #指定要绑定的PVC,前面已经创建好了
---
kind: Service
apiVersion: v1
metadata:
name: myserver-myapp-service
namespace: myserver
labels:
app: service-nginx
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30080
selector:
app: myserver-app #这里调用这个标签的pod,跟上面容器中定义的标签一致
root@k8s-deploy:~/yaml/yl# kubectl apply -f nginx-pvc-pod.yaml
root@k8s-deploy:~/yaml/yl# kubectl get pod -n myserver
NAME READY STATUS RESTARTS AGE
myserver-myapp-deployment-6bdbb5c6b-jqclx 1/1 Running 0 16m
进入nginx容器看下存储卷挂载,可以看见之前写入的文件index.html内容
访问node节点30080端口的static目录, 能看见之前写入存储卷里的文件内容PV
6、 删除资源:
可以看见之前创建了三个yaml资源文件,之前创建需要从底层往上层建,删除的话需要从上层往下层删除
root@k8s-deploy:~/yaml/yl# ls
nginx-pvc-pod.yaml pvc.yaml pv.yaml
删除pod,删除pvc,删除pv
root@k8s-deploy:~/yaml/yl# kubectl delete -f nginx-pvc-pod.yaml
root@k8s-deploy:~/yaml/yl# kubectl delete -f pvc.yaml
root@k8s-deploy:~/yaml/yl# kubectl delete -f pv.yaml
总结:以上就是PV和PVC最简单的使用方式了,是静态存储卷,需要在使用前手动创建PV,然后创建PVC并绑定到PV上,挂载到pod上使用,适用于PV和PVC比较固定的业务场景