88、k8s之pv+pvc

2024-09-05 19:12
文章标签 云原生 k8s 88 pv pvc

本文主要是介绍88、k8s之pv+pvc,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、pv和pvc

pv

pv:Persistent volume

是k8s虚拟化的存储资源,实际上就是存储,例如本地的硬盘,网络文件系统(nfs)

lvm RAID oss(ceph) 云存储。

pvc

pvc:Persistent volume claim

用户对存储资源的请求,定义了需要存储的空间大小,以及对存储空间的访问模式。

有了pvc请求之后 ,和pv进行匹配,匹配到了之后绑定,绑定成功,就可以使用pv的存储空间。

1.1、静态-----手动创建pv

1.2、动态----自动创建pv

在这里插入图片描述

1.3、pv和pvc的生命周期

1、配置 定义pvc的请求详细情况-------匹配pv------绑定-------使用--------释放--------pv回收

pv的状态有四种:

1、Available:可用的,可以被pvc匹配。未绑定状态。

2、bound:已绑定,pv已经被pvc绑定,正在使用。

3、released:已释放,pvc以及被删除,但是pv的资源还没有被回收,pv不可用的状态。

4、failed失败 pv自动回收失败,pv不可用。

1.4、pvc在请求的过程中支持的权限控制选项:

ReadWriteOnce RWO : 存储目录可读,可写,但是这个目录只能被一个pod挂载。

ReadOnlyMany:ROX 存储可以以只读的方式被多个pod挂载

ReadWriteMany:RWX 存储目录可以读写的方式被多个pod挂载

NFS支持以上三种所有模式。

hostPath只支持ReadWriteOnce: 存储目录可读,可写,但是这个目录只能被一个pod挂载。

云存储(对象存储可以支持动态扩缩容)

ISCSI不支持ReadWriteMany

ISCSI是一种在网络上运行SCSI协议的网络存储技术

[root@master01 k8s-yaml]# lsscsi
[0:0:0:0] disk VMware, VMware Virtual S 1.0 /dev/sda
[2:0:0:0] cd/dvd NECVMWar VMware IDE CDR10 1.00 /dev/sr0

1.5、pv的回收策略:

Retain: 保留

虽然pvc被删除了,但是pv还是处于released的状态,即使恢复到available状态,上一个挂载的数据也不会丢失。

Delete:删除

虽然pvc被删除了,但是pv还是处于released的状态,即使恢复到available状态,数据全部删除

Recycle回收:

虽然pvc被删除了,但是pv还是处于released的状态,pv会自动的对资源进行回收,删除数据,然后pv自动回到available状态。

我们使用的文件系统是nfs共享

nfs共享文件
[root@k8s5 ~]# vim /etc/exports/data/v1 192.168.168.0/24(rw,no_root_squash)
/data/v2 192.168.168.0/24(rw,no_root_squash)
/data/v3 192.168.168.0/24(rw,no_root_squash)
[root@k8s5 /]# rm -rf data
[root@k8s5 /]# mkdir -p /data/v{1,2,3}
[root@k8s5 /]# cd data
[root@k8s5 data]# ls
v1  v2  v3
[root@k8s5 data]# systemctl restart rpcbind
[root@k8s5 data]# systemctl restart nfs
[root@k8s5 data]# showmount -e
Export list for k8s5:
/data/v3 192.168.168.0/24
/data/v2 192.168.168.0/24
/data/v1 192.168.168.0/24
[root@master01 k8s-yaml]# showmount -e 192.168.168.85
Export list for 192.168.168.85:
/data/v3 192.168.168.0/24
/data/v2 192.168.168.0/24
/data/v1 192.168.168.0/24
pv指定
[root@master01 k8s-yaml]# kubectl explain pv
KIND:     PersistentVolume[root@master01 k8s-yaml]# vim pv.yaml#我们定义3个pv,定义目录的路径,访问模式,pv的大小
apiVersion: v1
kind: PersistentVolume
metadata:name: pv001labels:name: pv001
spec:nfs:
#定义pv使用的文件系统server: 192.168.168.85path: /data/v1
#如果请求匹配到这个pv,使用的是目标主机的/data/v1accessModes: ["ReadWriteOnce"]
#定义访问模式capacity:storage: 1Gi
#Mi Gi Ti
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv002labels:name: pv002
spec:nfs:server: 192.168.168.85path: /data/v2accessModes: ["ReadWriteMany"]capacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv003labels:name: pv003
spec:nfs:server: 192.168.168.85path: /data/v3accessModes: ["ReadOnlyMany"]capacity:storage: 3Gi[root@master01 k8s-yaml]# kubectl apply -f pv.yaml 
persistentvolume/pv001 created
persistentvolume/pv002 created
persistentvolume/pv003 created[root@master01 k8s-yaml]# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM           STORAGECLASS   REASON   AGE
pv001   1Gi        RWO            Retain           Available                                           49m
pv002   2Gi        RWX            Retain           Bound       default/mypvc                           49m
pv003   3Gi        ROX            Retain           Available   
pvc
[root@master01 k8s-yaml]# kubectl explain pvc
KIND:     PersistentVolumeClaim[root@master01 k8s-yaml]# vim pvc.yamlapiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mypvc
spec:accessModes: ["ReadWriteMany"]resources:requests:storage: 2Gi
#我需要pv,权限ReadWriteMany,空间是2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx1labels:app: nginx1
spec:replicas: 3selector:matchLabels:app: nginx1template:metadata:labels:app: nginx1spec:containers:- name: nginx1image: nginx:1.22volumeMounts:- name: xy102mountPath: /usr/share/nginx/html/volumes:- name: xy102persistentVolumeClaim:
#直接使用pvc的请求把容器内目录挂载pv请求对应的目录。claimName: mypvc[root@master01 k8s-yaml]# kubectl apply -f pvc.yaml 
persistentvolumeclaim/mypvc unchanged
deployment.apps/nginx1 created
[root@master01 k8s-yaml]# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM           STORAGECLASS   REASON   AGE
pv001   1Gi        RWO            Retain           Available                                           23m
pv002   2Gi        RWX            Retain           Bound       default/mypvc                           23m
pv003   3Gi        ROX            Retain           Available                                           23m[root@master01 k8s-yaml]# kubectl exec -it nginx1-7fd846678-jfs42 bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginx1-7fd846678-jfs42:/# cd /usr/share/nginx/
root@nginx1-7fd846678-jfs42:/usr/share/nginx# ls
html
root@nginx1-7fd846678-jfs42:/usr/share/nginx# cd html/
root@nginx1-7fd846678-jfs42:/usr/share/nginx/html# ls
index.html
root@nginx1-7fd846678-jfs42:/usr/share/nginx/html# cat index.html 
123[root@master01 k8s-yaml]# kubectl expose deployment nginx1 --port=80 --target-port=80 --type=NodePort
service/nginx1 exposed            ##开启主机和service服务
[root@master01 k8s-yaml]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        9d
nginx1       NodePort    10.96.38.241   <none>        80:30972/TCP   21s
[root@master01 k8s-yaml]# curl 192.168.168.81:30972
123[root@k8s5 v2]# ls
index.html
[root@k8s5 v2]# rm -rf *
[root@k8s5 v2]# ls
[root@k8s5 v2]# echo 456 > index.html
[root@master01 k8s-yaml]# curl 192.168.168.81:30972
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.22.1</center>
</body>
</html>
[root@master01 k8s-yaml]# curl 192.168.168.81:30972
456

1、卸载回收默认策略Retain

[root@master01 k8s-yaml]# kubectl delete -f pvc.yaml 
persistentvolumeclaim "mypvc" deleted
deployment.apps "nginx1" deleted
[root@master01 k8s-yaml]# kubectl get pod -o wide
No resources found in default namespace.
[root@master01 k8s-yaml]# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM           STORAGECLASS   REASON   AGE
pv001   1Gi        RWO            Retain           Available                                           55m
pv002   2Gi        RWX            Retain           Released    default/mypvc                           55m
pv003   3Gi        ROX            Retain           Available    [root@master01 k8s-yaml]# kubectl edit pv pv002
claimRef:                 ##进去删除nfs:persistentvolume/pv002 edited[root@master01 k8s-yaml]# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv001   1Gi        RWO            Retain           Available                                   56m
pv002   2Gi        RWX            Retain           Available                                   56m
pv003   3Gi        ROX            Retain           Available                                   56m[root@k8s5 v2]# ls
index.html宿主机文件还是存在

2、回收策略Delete

[root@master01 k8s-yaml]# vim pv.yaml apiVersion: v1
kind: PersistentVolume
metadata:name: pv002labels:name: pv002
spec:nfs:server: 192.168.168.85path: /data/v2accessModes: ["ReadWriteMany"]persistentVolumeReclaimPolicy: Deletecapacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv003labels:name: pv003
spec:nfs:server: 192.168.168.85path: /data/v3accessModes: ["ReadOnlyMany"]capacity:storage: 3Gi[root@master01 k8s-yaml]# kubectl apply -f pv.yaml 
persistentvolume/pv001 unchanged
persistentvolume/pv002 configured
persistentvolume/pv003 unchanged[root@master01 k8s-yaml]# kubectl apply -f pvc.yaml 
persistentvolumeclaim/mypvc created
deployment.apps/nginx1 created[root@master01 k8s-yaml]# kubectl get pod -o wide[root@master01 k8s-yaml]# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM           STORAGECLASS   REASON   AGE
pv001   1Gi        RWO            Retain           Available                                           146m
pv002   2Gi        RWX            Delete           Bound       default/mypvc                           146m
pv003   3Gi        ROX            Retain           Available                                           146m[root@master01 k8s-yaml]# curl 192.168.168.81:30972
123
[root@k8s5 v2]# echo 456 > index.html
[root@master01 k8s-yaml]# curl 192.168.168.81:30972
456
[root@master01 k8s-yaml]# kubectl delete -f pvc.yaml 
persistentvolumeclaim "mypvc" deleted
deployment.apps "nginx1" deleted
[root@master01 k8s-yaml]# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM           STORAGECLASS   REASON   AGE
pv001   1Gi        RWO            Retain           Available                                           150m
pv002   2Gi        RWX            Delete           Failed      default/mypvc                           150m
pv003   3Gi        ROX            Retain           Available                                           150m
[root@master01 k8s-yaml]# kubectl edit pv pv002
claimRef:                 ##进去删除nfs:persistentvolume/pv002 edited[root@master01 k8s-yaml]# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv001   1Gi        RWO            Retain           Available                                   151m
pv002   2Gi        RWX            Delete           Available                                   151m
pv003   3Gi        ROX            Retain           Available                                   151m[root@k8s5 v2]# cat index.html 
456宿主机文件还在没有删除

3、回收策略Recycle

#我们定义3个pv,定义目录的路径,访问模式,pv的大小
apiVersion: v1
kind: PersistentVolume
metadata:name: pv001labels:name: pv001
spec:nfs:
#定义pv使用的文件系统server: 192.168.168.85path: /data/v1
#如果请求匹配到这个pv,使用的是目标主机的/data/v1accessModes: ["ReadWriteOnce"]
#定义访问模式capacity:storage: 1Gi
#Mi Gi Ti
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv002labels:name: pv002
spec:nfs:server: 192.168.168.85path: /data/v2accessModes: ["ReadWriteMany"]persistentVolumeReclaimPolicy: Recyclecapacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv003labels:name: pv003
spec:nfs:server: 192.168.168.85path: /data/v3accessModes: ["ReadOnlyMany"]capacity:storage: 3Gi[root@master01 k8s-yaml]# kubectl apply -f pv.yaml 
persistentvolume/pv001 unchanged
persistentvolume/pv002 configured
persistentvolume/pv003 unchanged[root@master01 k8s-yaml]# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv001   1Gi        RWO            Retain           Available                                   154m
pv002   2Gi        RWX            Recycle          Available                                   154m
pv003   3Gi        ROX            Retain           Available                                   154m[root@master01 k8s-yaml]# kubectl apply -f pvc.yaml 
persistentvolumeclaim/mypvc created
deployment.apps/nginx1 created
[root@master01 k8s-yaml]# kubectl get pod -o wide[root@master01 k8s-yaml]# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM           STORAGECLASS   REASON   AGE
pv001   1Gi        RWO            Retain           Available                                           155m
pv002   2Gi        RWX            Recycle          Bound       default/mypvc                           155m
pv003   3Gi        ROX            Retain           Available                                           155m[root@master01 k8s-yaml]# curl 192.168.168.81:30972
456
[root@k8s5 v2]# echo 789 > index.html
[root@master01 k8s-yaml]# curl 192.168.168.81:30972
789[root@master01 k8s-yaml]# kubectl delete -f pvc.yaml 
[root@master01 k8s-yaml]# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv001   1Gi        RWO            Retain           Available                                   91m
pv002   2Gi        RWX            Recycle          Available                                   91m
pv003   3Gi        ROX            Retain           Available                                   91m[root@k8s5 v2]# ls
[root@k8s5 v2]# 宿主机文件自动和容器一起被回收,且回收pv002的分配

二、动态pv:

不需要人工创建pv,根据pvc的请求自动创建pv然后实现挂载和使用。

k8s创建动态pv的机制是根据StorageClass,相当于提供pv的模板。

StorageClass+NFS 动态创建nfs的pv

k8s的本身不支持nfs创建动态pv,使用外部的插件

Provisioner 存储分配器,自动使用配置好的nfs自动创建pv。

k8s当中,使用Provisioner来创建动态pv。

配置storageclass一起使用。

Provisioner配置信息,以及pvc的相关配置

storageclass在根据配置信息调用模块创建pv。

pod---------->provisioner---------->storageclass------>pv

Provisioner:

nfs-client:实现nfs网络共享的协作

aws-ebs:亚马逊云服务器的动态卷,进行协作。

local-storage:k8s节点的本地创建pv,一般是内部测试用的。

external-Storage:云平台支持的对象存储协作。

[root@k8s5 v2]# vim /etc/exports/data/v1 192.168.168.0/24(rw,no_root_squash)
/data/v2 192.168.168.0/24(rw,no_root_squash)
/data/v3 192.168.168.0/24(rw,no_root_squash)
/opt/k8s 192.168.168.0/24(rw,no_root_squash)
[root@k8s5 v2]# systemctl restart rpcbind
[root@k8s5 v2]# systemctl restart nfs
[root@k8s5 v2]# showmount -e
Export list for k8s5:
/opt/k8s 192.168.168.0/24
/data/v3 192.168.168.0/24
/data/v2 192.168.168.0/24
/data/v1 192.168.168.0/24
[root@k8s5 opt]# mkdir k8s
[root@k8s5 opt]# chmod 777 k8s/
[root@master01 k8s-yaml]# showmount -e 192.168.168.85
Export list for 192.168.168.85:
/opt/k8s 192.168.168.0/24
/data/v3 192.168.168.0/24
/data/v2 192.168.168.0/24
/data/v1 192.168.168.0/24

2.1、动态pvc的流程

1、创建Server Account NFS-CLENT provisioner账户

2、设定集群的角色,赋权

3、设定权限和server account绑定。

4、NFS provisioner创建,deployment方式创建。

声明:存储点 提供nfs服务的服务器

存储路径 共享目录

挂载点

5、创建storageclass,作为pv的模板,和NFS provisioner关联。

6、创建pvc的请求和业务pod测试。

1-3、创建Server Account NFS-CLENT provisioner账户、设定集群的角色,赋权、设定权限和server account绑定。

[root@master01 ~]# kubectl explain clusterrole
KIND:     ClusterRole
VERSION:  rbac.authorization.k8s.io/v1[root@master01 k8s-yaml]# vim nfs-client-rbac.yaml#创建角色:
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisioner---
#赋权
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: nfs-client-provisioner-clusterrole
rules:- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["events"]verbs: ["list", "watch", "create", "update", "patch"]- apiGroups: [""]resources: ["endpoints"]verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
#rules规则,包含nfs provisioner权限可以新建和删除pv以及更新pv,监听pvc的变化,实时更新>挂载点的变化
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: nfs-provisioner-clusterrolebinging
subjects:
- kind: ServiceAccountname: nfs-client-provisionernamespace: default
roleRef:kind: ClusterRolename: nfs-client-provisioner-clusterroleapiGroup: rbac.authorization.k8s.io[root@master01 k8s-yaml]#  kubectl apply -f nfs-client-rbac.yaml 
serviceaccount/nfs-client-provisioner created
clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-clusterrole created
clusterrolebinding.rbac.authorization.k8s.io/nfs-provisioner-clusterrolebinging created以上1、2、3步骤已经完成
保留SelfLink字段
[root@master01 k8s-yaml]# vim /etc/kubernetes/manifests/kube-apiserver.yaml spec:containers:- command:- kube-apiserver- --feature-gates=RemoveSelfLink=false
[root@master01 k8s-yaml]# kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
pod/kube-apiserver created[root@master01 k8s-yaml]# kubectl get pod -n kube-system 
[root@master01 k8s-yaml]# kubectl delete pod -n kube-system kube-apiserver
pod "kube-apiserver" deleted[root@master01 k8s-yaml]# kubectl get pod -n kube-system 
NAME                               READY   STATUS    RESTARTS   AGE
coredns-7f89b7bc75-6z2pg           1/1     Running   4          9d
coredns-7f89b7bc75-lg4gw           1/1     Running   4          9d
etcd-master01                      1/1     Running   4          9d
kube-apiserver-master01            1/1     Running   0          2m36s
kube-controller-manager-master01   1/1     Running   6          9d
kube-flannel-ds-48rnt              1/1     Running   5          9d
kube-flannel-ds-wphvj              1/1     Running   7          9d
kube-proxy-d5fnf                   1/1     Running   4          9d
kube-proxy-kpvs2                   1/1     Running   5          9d
kube-proxy-nrszf                   1/1     Running   5          9d
kube-scheduler-master01            1/1     Running   5          9d
4、创建provisioner的pod,声明路径和挂在点(NFS provisioner创建,deployment方式创建。声明:存储点 提供nfs服务的服务器,存储路径 共享目录,挂载点)
[root@master01 k8s-yaml]# vim nfs-client-provisioner.yaml#创建provisioner的pod,声明路径和挂在点
#前面账户使用在这个pod里面
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs1
spec:replicas: 1selector:matchLabels:app: nfs1strategy:type: Recreate
#Recreate,每次升级容器或者更新都会将所有的旧的pod停止,然后再启动新的pod
#会导致服务暂时中断template:metadata:labels:app: nfs1spec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs1image: quay.io/external_storage/nfs-client-provisioner:latestvolumeMounts:- name: nfs1mountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: nfs-storage
#配置provisioner的名称- name: NFS_SERVERvalue: 192.168.168.85
#在容器内设nfs服务器的ip地址变量- name: NFS_PATHvalue: /opt/k8s
#绑定nfs服务器的目录volumes:
#申明nfs数据卷的类型:- name: nfs1nfs:server: 192.168.168.85path: /opt/k8s[root@master01 k8s-yaml]# kubectl apply -f nfs-client-provisioner.yaml 
deployment.apps/nfs1 created[root@master01 k8s-yaml]# kubectl get pod -o wide
NAME                   READY   STATUS    RESTARTS   AGE     IP             NODE     NOMINATED NODE   READINESS GATES
nfs1-76f66b958-8ffpz   1/1     Running   0          2m19s   10.244.1.217   node01   <none>           <none>
5、创建storageclass,作为pv的模板,和NFS provisioner关联。
[root@master01 k8s-yaml]# vim nfs-client-storageclass.yaml#定义模板
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-client-storageclass
provisioner: nfs-storage
parameters:archiveOnDelete: "false"
#true,表示删除pv时进行存档。会把pv的状态标记为Achived。数据依然可用,但是还不再对新的pvc进行绑定。
#false,删除pvc,pv的状态先进去released,然后变成可用
reclaimPolicy: Retain
#pv的回收策略
allowVolumeExpansion: true
#要想pv支持动态扩容,必须是true。[root@master01 k8s-yaml]# kubectl apply -f nfs-client-storageclass.yaml 
storageclass.storage.k8s.io/nfs-client-storageclass created[root@master01 k8s-yaml]# vim nfs-client-storageclass.yaml#定义模板
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-client-storageclass
provisioner: nfs-storage
parameters:archiveOnDelete: "false"
#true,表示删除pv时进行存档。会把pv的状态标记为Achived。数据依然可用,但是还不再对新的pvc进行绑定。
#false,删除pvc,pv的状态先进去released,然后变成可用
reclaimPolicy: Delete
#pv的回收策略
allowVolumeExpansion: true
#要想pv支持动态扩容,必须是true。

6、创建pvc的请求和业务pod测试。

[root@master01 k8s-yaml]# vim pvc.yaml #定义好pvc的请求:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-mypvc
spec:accessModes: ["ReadWriteMany"]storageClassName: nfs-client-storageclassresources:requests:storage: 2Gi
#我需要pv,权限是ReadWriteMany,空间是2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx1labels:app: nginx1
spec:replicas: 3selector:matchLabels:app: nginx1template:metadata:labels:app: nginx1spec:containers:- name: nginx1image: nginx:1.22volumeMounts:- name: xy102mountPath: /usr/share/nginx/html/volumes:- name: xy102
#直接使用pvc的请求把容器内目录挂载pv请求对应的目录。persistentVolumeClaim:claimName: nfs-mypvc[root@master01 k8s-yaml]# kubectl apply -f pvc-pod.yaml 
persistentvolumeclaim/nfs-mypvc created
deployment.apps/nginx1 created
[root@master01 k8s-yaml]# kubectl get pod -o wide
NAME                      READY   STATUS    RESTARTS   AGE     IP             NODE     NOMINATED NODE   READINESS GATES
nfs1-76f66b958-7g8jt      1/1     Running   0          7m31s   10.244.2.165   node02   <none>           <none>
nginx1-74ddb78f7d-l5xjf   1/1     Running   0          5s      10.244.1.219   node01   <none>           <none>
nginx1-74ddb78f7d-rhmz5   1/1     Running   0          5s      10.244.2.168   node02   <none>           <none>
nginx1-74ddb78f7d-zntjd   1/1     Running   0          5s      10.244.2.169   node02   <none>           <none>[root@master01 k8s-yaml]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM               STORAGECLASS              REASON   AGE
pvc-0c83315d-d923-4bf9-9144-91595e5ed0fe   2Gi        ROX            Retain           Released   default/nfs-mypvc   nfs-client-storageclass            5m38s
pvc-463c89ac-5120-4f4a-ba18-86454382ba20   2Gi        ROX            Retain           Released   default/nfs-mypvc   nfs-client-storageclass            5m48s
pvc-7894a5a0-73e0-493b-a502-f610f7d33968   2Gi        RWX            Retain           Bound      default/nfs-mypvc   nfs-client-storageclass            44s
[root@master01 k8s-yaml]# kubectl get pvc
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS              AGE
nfs-mypvc   Bound    pvc-7894a5a0-73e0-493b-a502-f610f7d33968   2Gi        RWX            nfs-client-storageclass   68s[root@master01 k8s-yaml]#kubectl logs -f nfs1-76f66b958-8ffpz   ##查看日志[root@k8s5 k8s]# cd default-nfs-mypvc-pvc-7894a5a0-73e0-493b-a502-f610f7d33968
[root@k8s5 default-nfs-mypvc-pvc-7894a5a0-73e0-493b-a502-f610f7d33968]# ls
[root@k8s5 default-nfs-mypvc-pvc-7894a5a0-73e0-493b-a502-f610f7d33968]# echo 789 > index.html
[root@k8s5 default-nfs-mypvc-pvc-7894a5a0-73e0-493b-a502-f610f7d33968]# ls
index.html[root@master01 k8s-yaml]# curl 192.168.168.81:30972
789[root@master01 k8s-yaml]# vim nfs-client-storageclass.yaml#定义模板
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-client-storageclass
provisioner: nfs-storage
parameters:archiveOnDelete: "false"
#true,表示删除pv时进行存档。会把pv的状态标记为Achived。数据依然可用,但是还不再对新的pvc进行绑定。
#false,删除pvc,pv的状态先进去released,然后变成可用
reclaimPolicy: Delete
#pv的回收策略
allowVolumeExpansion: true
#要想pv支持动态扩容,必须是true。[root@master01 k8s-yaml]# vim nfs-client-storageclass.yaml
[root@master01 k8s-yaml]# kubectl delete -f pvc-pod.yaml 
persistentvolumeclaim "nfs-mypvc" deleted
deployment.apps "nginx1" deleted
[root@master01 k8s-yaml]# kubectl get pod -o wide
NAME                   READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
nfs1-76f66b958-7g8jt   1/1     Running   0          21m   10.244.2.165   node02   <none>           <none>
[root@master01 k8s-yaml]# kubectl apply -f nfs-client-storageclass.yaml
The StorageClass "nfs-client-storageclass" is invalid: reclaimPolicy: Forbidden: updates to reclaimPolicy are forbidden.
[root@master01 k8s-yaml]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM               STORAGECLASS              REASON   AGE
pvc-0c83315d-d923-4bf9-9144-91595e5ed0fe   2Gi        ROX            Retain           Released   default/nfs-mypvc   nfs-client-storageclass            22m
pvc-463c89ac-5120-4f4a-ba18-86454382ba20   2Gi        ROX            Retain           Released   default/nfs-mypvc   nfs-client-storageclass            23m
pvc-7894a5a0-73e0-493b-a502-f610f7d33968   2Gi        RWX            Retain           Released   default/nfs-mypvc   nfs-client-storageclass            17m
[root@master01 k8s-yaml]# kubectl get pvc
No resources found in default namespace.
[root@master01 k8s-yaml]# kubectl delete pv pvc-7894a5a0-73e0-493b-a502-f610f7d33968 
persistentvolume "pvc-7894a5a0-73e0-493b-a502-f610f7d33968" deleted
[root@master01 k8s-yaml]# kubectl delete pv pvc-463c89ac-5120-4f4a-ba18-86454382ba20 
persistentvolume "pvc-463c89ac-5120-4f4a-ba18-86454382ba20" deleted
[root@master01 k8s-yaml]# kubectl delete pv pvc-0c83315d-d923-4bf9-9144-91595e5ed0fe 
persistentvolume "pvc-0c83315d-d923-4bf9-9144-91595e5ed0fe" deleted
[root@master01 k8s-yaml]# kubectl get pvc
No resources found in default namespace.
[root@master01 k8s-yaml]# kubectl get pv
No resources found[root@k8s5 k8s]# ll
总用量 0
drwxrwxrwx. 2 root root 24 9月   5 16:31 default-nfs-mypvc-pvc-0c83315d-d923-4bf9-9144-91595e5ed0fe
drwxrwxrwx. 2 root root 24 9月   5 16:32 default-nfs-mypvc-pvc-463c89ac-5120-4f4a-ba18-86454382ba20
drwxrwxrwx. 2 root root 24 9月   5 16:33 default-nfs-mypvc-pvc-7894a5a0-73e0-493b-a502-f610f7d33968[root@master01 k8s-yaml]# kubectl apply -f nfs-client-storageclass.yaml
The StorageClass "nfs-client-storageclass" is invalid: reclaimPolicy: Forbidden: updates to reclaimPolicy are forbidden.
[root@master01 k8s-yaml]# kubectl apply -f nfs-client-storageclass.yaml --force
storageclass.storage.k8s.io/nfs-client-storageclass configured[root@master01 k8s-yaml]# kubectl apply -f pvc-pod.yaml 
persistentvolumeclaim/nfs-mypvc created
deployment.apps/nginx1 created
[root@master01 k8s-yaml]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS              REASON   AGE
pvc-92a53a5e-ea41-4a46-af36-48ec9bc4900b   2Gi        RWX            Delete           Bound    default/nfs-mypvc   nfs-client-storageclass            5sdrwxrwxrwx. 2 root root  6 9月   5 16:47 default-nfs-mypvc-pvc-92a53a5e-ea41-4a46-af36-48ec9bc4900b
[root@k8s5 k8s]# cd default-nfs-mypvc-pvc-92a53a5e-ea41-4a46-af36-48ec9bc4900b
[root@k8s5 default-nfs-mypvc-pvc-92a53a5e-ea41-4a46-af36-48ec9bc4900b]# echo 777 > index.html
[root@k8s5 default-nfs-mypvc-pvc-92a53a5e-ea41-4a46-af36-48ec9bc4900b]# ls
index.html[root@master01 k8s-yaml]# kubectl get pvc
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS              AGE
nfs-mypvc   Bound    pvc-92a53a5e-ea41-4a46-af36-48ec9bc4900b   2Gi        RWX            nfs-client-storageclass   41s
[root@master01 k8s-yaml]# curl 192.168.168.81:30972
777[root@master01 k8s-yaml]# vim nfs-client-storageclass.yaml#定义模板
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-client-storageclass
provisioner: nfs-storage
parameters:archiveOnDelete: "false"
#true,表示删除pv时进行存档。会把pv的状态标记为Achived。数据依然可用,但是还不再对新的pvc进行绑定。
#false,删除pvc,pv的状态先进去released,然后变成可用
reclaimPolicy: Recycle
#pv的回收策略
allowVolumeExpansion: true
#要想pv支持动态扩容,必须是true。[root@master01 k8s-yaml]# kubectl apply -f nfs-client-storageclass.yaml
The StorageClass "nfs-client-storageclass" is invalid: 
* reclaimPolicy: Unsupported value: "Recycle": supported values: "Delete", "Retain"
* reclaimPolicy: Forbidden: updates to reclaimPolicy are forbidden.[root@master01 k8s-yaml]# kubectl apply -f nfs-client-storageclass.yaml --force
The StorageClass "nfs-client-storageclass" is invalid: reclaimPolicy: Unsupported value: "Recycle": supported values: "Delete", "Retain"
* reclaimPolicy: Forbidden: updates to reclaimPolicy are forbidden.
[root@master01 k8s-yaml]# kubectl apply -f nfs-client-storageclass.yaml --force
The StorageClass "nfs-client-storageclass" is invalid: reclaimPolicy: Unsupported value: "Recycle": supported values: "Delete", "Retain"
[root@master01 k8s-yaml]# kubectl delete -f pvc-pod.yaml 
persistentvolumeclaim "nfs-mypvc" deleted
deployment.apps "nginx1" deleted[root@k8s5 k8s]# ll
总用量 0
drwxrwxrwx. 2 root root 24 9月   5 16:31 default-nfs-mypvc-pvc-0c83315d-d923-4bf9-9144-91595e5ed0fe
drwxrwxrwx. 2 root root 24 9月   5 16:32 default-nfs-mypvc-pvc-463c89ac-5120-4f4a-ba18-86454382ba20
drwxrwxrwx. 2 root root 24 9月   5 16:33 default-nfs-mypvc-pvc-7894a5a0-73e0-493b-a502-f610f7d33968
drwxrwxrwx. 2 root root  6 9月   5 16:47 default-nfs-mypvc-pvc-92a53a5e-ea41-4a46-af36-48ec9bc4900b
[root@k8s5 k8s]# cd default-nfs-mypvc-pvc-92a53a5e-ea41-4a46-af36-48ec9bc4900b
[root@k8s5 default-nfs-mypvc-pvc-92a53a5e-ea41-4a46-af36-48ec9bc4900b]# echo 777 > index.html
[root@k8s5 default-nfs-mypvc-pvc-92a53a5e-ea41-4a46-af36-48ec9bc4900b]# ls
index.html
[root@k8s5 default-nfs-mypvc-pvc-92a53a5e-ea41-4a46-af36-48ec9bc4900b]# cd ..
[root@k8s5 k8s]# ll
总用量 0
drwxrwxrwx. 2 root root 24 9月   5 16:31 default-nfs-mypvc-pvc-0c83315d-d923-4bf9-9144-91595e5ed0fe
drwxrwxrwx. 2 root root 24 9月   5 16:32 default-nfs-mypvc-pvc-463c89ac-5120-4f4a-ba18-86454382ba20
drwxrwxrwx. 2 root root 24 9月   5 16:33 default-nfs-mypvc-pvc-7894a5a0-73e0-493b-a502-f610f7d33968由于pv的回收策略是delete,动态可以删除
drwxrwxrwx. 2 root root  6 9月   5 16:47 default-nfs-mypvc-pvc-92a53a5e-ea41-4a46-af36-48ec9bc4900b
所以宿主机文件被删除

2.2、总结:

就是说定义storageclass的时候,设置pv的回收策略,只能是retain,delete的话,一旦删除pvc挂点也一起删除了。数据没了。

出大事,Recycle不能作为动态的回收策略。

7、delete 会把pvc删除,挂载目录会被删除,数据会消失

8、动态不支持recycle
f36-48ec9bc4900b
[root@k8s5 k8s]# cd default-nfs-mypvc-pvc-92a53a5e-ea41-4a46-af36-48ec9bc4900b
[root@k8s5 default-nfs-mypvc-pvc-92a53a5e-ea41-4a46-af36-48ec9bc4900b]# echo 777 > index.html
[root@k8s5 default-nfs-mypvc-pvc-92a53a5e-ea41-4a46-af36-48ec9bc4900b]# ls
index.html
[root@k8s5 default-nfs-mypvc-pvc-92a53a5e-ea41-4a46-af36-48ec9bc4900b]# cd …
[root@k8s5 k8s]# ll
总用量 0
drwxrwxrwx. 2 root root 24 9月 5 16:31 default-nfs-mypvc-pvc-0c83315d-d923-4bf9-9144-91595e5ed0fe
drwxrwxrwx. 2 root root 24 9月 5 16:32 default-nfs-mypvc-pvc-463c89ac-5120-4f4a-ba18-86454382ba20
drwxrwxrwx. 2 root root 24 9月 5 16:33 default-nfs-mypvc-pvc-7894a5a0-73e0-493b-a502-f610f7d33968

由于pv的回收策略是delete,动态可以删除
drwxrwxrwx. 2 root root 6 9月 5 16:47 default-nfs-mypvc-pvc-92a53a5e-ea41-4a46-af36-48ec9bc4900b
所以宿主机文件被删除


## 2.2、总结:就是说定义storageclass的时候,设置pv的回收策略,只能是retain,delete的话,一旦删除pvc挂点也一起删除了。数据没了。出大事,Recycle不能作为动态的回收策略。7、delete 会把pvc删除,挂载目录会被删除,数据会消失8、动态不支持recycle

这篇关于88、k8s之pv+pvc的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139824

相关文章

90、k8s之secret+configMap

一、secret配置管理 配置管理: 加密配置:保存密码,token,其他敏感信息的k8s资源 应用配置:我们需要定制化的给应用进行配置,我们需要把定制好的配置文件同步到pod当中容器 1.1、加密配置: secret: [root@master01 ~]# kubectl get secrets ##查看加密配置[root@master01 ~]# kubectl get se

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错过这个机会。赶紧去看看吧! 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体

云原生之高性能web服务器学习(持续更新中)

高性能web服务器 1 Web服务器的基础介绍1.1 Web服务介绍1.1.1 Apache介绍1.1.2 Nginx-高性能的 Web 服务端 2 Nginx架构与安装2.1 Nginx概述2.1.1 Nginx 功能介绍2.1.2 基础特性2.1.3 Web 服务相关的功能 2.2 Nginx 架构和进程2.2.1 架构2.2.2 Ngnix进程结构 2.3 Nginx 模块介绍2.4

用Cri-O,Sealos CLI,Kubeadm方式部署K8s高可用集群

3.6 Cri-O方式部署K8s集群 注意:基于Kubernetes基础环境 3.6.1 所有节点安装配置cri-o [root@k8s-all ~]# VERSION=1.28[root@k8s-all ~]# curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensu

培训第九周(部署k8s基础环境)

一、前期系统环境准备 1、关闭防火墙与selinux  [root@k8s-master ~]# systemctl stop firewalld[root@k8s-master ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.servi

k8s 存储(PV、PVC、SC、本地存储、NFS)

存储持久化相关三个概念: PersistentVolume (PV) 是对具体存储资源的描述,比如NFS、Ceph、GlusterFS等,通过PV可以访问到具体的存储资源;PersistentVolumeClaim (PVC) Pod想要使用具体的存储资源需要对接到PVC,PVC里会定义好Pod希望使用存储的属性,通过PVC再去申请合适的存储资源(PV),匹配到合适的资源后PVC和PV会进行绑定

k8s调度(pod亲和、反亲和、污点、容忍度)

pod亲和性 针对对象为Pod,目的是实现,新建Pod和目标Pod调度到一起,在同一个Node上。 示例: apiVersion: v1kind: Podmetadata:name: testpod01labels:app: myapp01env: test1spec:containers:- name: testpod01image: nginx:1.23.2---apiVersio

k8s API资源对象

API资源对象Deployment 最小的资源是pod,deployment是多个pod的集合(多个副本实现高可用、负载均衡等)。 使用yaml文件来配置、部署资源对象。 Deployment YAML示例: vi  ng-deploy.yaml apiVersion: apps/v1kind: Deploymentmetadata:labels:app: myngname: ng-de