k8s存储-pv和pvc
PersistentVolume (PV)是集群中配置好的一个网络存储,是集群的全局资源,不属于任何namespace;PV无法与pod直接关联,它的设计是用来和存储对接的,所以用于绑定后端存储,写入PV的数据最终都是存放在后端存储服务器上
PersistentVolumeClaim (PVC)可以直接被pod挂载,同时可以绑定PV,从而让pod使用PV; PVC与挂载它的pod隶属于同一个namespace。
总结: 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 被释放或 PVC 与其解绑时,PV 不会被自动删除,而是保留在集群中。这个策略适用于需要手动处理和回收 PV 的情况。
Delete(删除):当 PV 被释放或 PVC 与其解绑时,PV 将被自动删除。这个策略会立即删除 PV 及其底层的存储资源。
Recycle(回收):这是一种已经过时的策略,不推荐使用。当 PV 被释放或 PVC 与其解绑时,PV 的数据将被删除,但 PV 对象本身被保留。这个策略通常用于简单的本地存储。
可通过kubectl get pv指令看结果RECLAIM POLICY 列或者kubectl get pv <pv-name> -o=jsonpath='{.spec.persistentVolumeReclaimPolicy}'来确定删除策略
卷类型:
定义存储卷使用的文件系统是块设备还是文件系统,默认是文件系统
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的空间
实现案例
1.部署存储卷
1.1、安装nfs服务端 root@haproxy02:~# yum install nfs-utils 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
2.客户端检查nfs共享目录
#yum install nfs-utils时已安装客户端 1、检查能否识别到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 #被单个节点以读写权限挂载
persistentVolumeReclaimPolicy: Retain #删除机制为保留 nfs: path: /data/k8sdata/myappdata #nfs共享目录 server: 172.31.7.109 #nfs server端地址
#hostpath: #本地目录模式
#path: /mnt/data
#type: DirectoryOrCreate 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内容
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