88、k8s之pv+pvc

news2024/11/15 6:49:22

一、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: pv001
  labels:
    name: pv001
spec:
  nfs:
#定义pv使用的文件系统
    server: 192.168.168.85
    path: /data/v1
#如果请求匹配到这个pv,使用的是目标主机的/data/v1
  accessModes: ["ReadWriteOnce"]
#定义访问模式
  capacity:
    storage: 1Gi
#Mi Gi Ti
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002
  labels:
    name: pv002
spec:
  nfs:
    server: 192.168.168.85
    path: /data/v2
  accessModes: ["ReadWriteMany"]
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003
  labels:
    name: pv003
spec:
  nfs:
    server: 192.168.168.85
    path: /data/v3
  accessModes: ["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.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes: ["ReadWriteMany"]
  resources:
    requests:
      storage: 2Gi
#我需要pv,权限ReadWriteMany,空间是2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx1
  labels:
    app: nginx1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - name: nginx1
        image: nginx:1.22
        volumeMounts:
        - name: xy102
          mountPath: /usr/share/nginx/html/
      volumes:
      - name: xy102
        persistentVolumeClaim:
#直接使用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: pv002
  labels:
    name: pv002
spec:
  nfs:
    server: 192.168.168.85
    path: /data/v2
  accessModes: ["ReadWriteMany"]
  persistentVolumeReclaimPolicy: Delete
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003
  labels:
    name: pv003
spec:
  nfs:
    server: 192.168.168.85
    path: /data/v3
  accessModes: ["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: pv001
  labels:
    name: pv001
spec:
  nfs:
#定义pv使用的文件系统
    server: 192.168.168.85
    path: /data/v1
#如果请求匹配到这个pv,使用的是目标主机的/data/v1
  accessModes: ["ReadWriteOnce"]
#定义访问模式
  capacity:
    storage: 1Gi
#Mi Gi Ti
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002
  labels:
    name: pv002
spec:
  nfs:
    server: 192.168.168.85
    path: /data/v2
  accessModes: ["ReadWriteMany"]
  persistentVolumeReclaimPolicy: Recycle
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003
  labels:
    name: pv003
spec:
  nfs:
    server: 192.168.168.85
    path: /data/v3
  accessModes: ["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: ServiceAccount
  name: nfs-client-provisioner
  namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-clusterrole
  apiGroup: 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: 1
  selector:
    matchLabels:
      app: nfs1
  strategy:
    type: Recreate
#Recreate,每次升级容器或者更新都会将所有的旧的pod停止,然后再启动新的pod
#会导致服务暂时中断
  template:
    metadata:
      labels:
        app: nfs1
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
      - name: nfs1
        image: quay.io/external_storage/nfs-client-provisioner:latest
        volumeMounts:
        - name: nfs1
          mountPath: /persistentvolumes
        env:
        - name: PROVISIONER_NAME
          value: nfs-storage
#配置provisioner的名称
        - name: NFS_SERVER
          value: 192.168.168.85
#在容器内设nfs服务器的ip地址变量
        - name: NFS_PATH
          value: /opt/k8s
#绑定nfs服务器的目录
      volumes:
#申明nfs数据卷的类型:
      - name: nfs1
        nfs:
          server: 192.168.168.85
          path: /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-storageclass
  resources:
    requests:
      storage: 2Gi
#我需要pv,权限是ReadWriteMany,空间是2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx1
  labels:
    app: nginx1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - name: nginx1
        image: nginx:1.22
        volumeMounts:
        - name: xy102
          mountPath: /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            5s



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@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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2107360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于SPI通信失败的一种情况(CRC校验不匹配的问题)

问题 该项目中&#xff0c;使用外置的ADC芯片采集电压电流&#xff0c;主控MCU通过SPI与ADC芯片通信。调试时&#xff0c;SPI通信一直失败&#xff0c;与之前成功的项目对比&#xff0c;发现是SPI配置的问题。 void MX_SPI2_Init(void) {/* USER CODE BEGIN SPI2_Init 0 *//*…

2024.9计算机视觉设计开发工程师专项培训通知

为进一步贯彻落实中共中央印发《关于深化人才发展体制机制改革的意见》和国务院印发《关于“十四五”数字经济发展规划》等有关工作的部署要求&#xff0c;深入实施人才强国战略和创新驱动发展战略&#xff0c;加强全国数字化人才队伍建设&#xff0c;持续推进人工智能从业人员…

fastadmin 文件上传腾讯云

1-安装腾讯云SDK composer require qcloud/cos-sdk-v5 2-腾讯云配置 <?phpnamespace app\common\controller;use Qcloud\Cos\Client; use think\Controller; use think\Db;class Tencent extends Controller {/*** 上传文件* param $config* param $key* return array*/p…

微信公众号《GIS 数据工程:开始您的 ETL 之旅 》 文章删除及原因

微信公众号多次限制付费文章发布&#xff0c;不太明确其原因。我猜可能是得罪了某位大神&#xff0c;这倒是也不是不可能。我这说话口无遮拦&#xff0c;得罪几个人偶尔搞我一下也是应该的 。当然也可能是部分喜欢白嫖的网友一看我收费就不太高兴&#xff0c;偶尔做点小动作也是…

Windows系统下苹果虚拟机系统的安装

前言 搞苹果软件开发&#xff0c;未必要购买贵的苹果电脑。可以安装黑苹果系统&#xff0c;也可以安装VMware的苹果虚拟机。而且通过我的实践发现&#xff0c;目前苹果虚拟机的效果很不错。 1、参考文档链接 VM虚拟机怎么安装mac os&#xff1f;&#xff08;全教程&#xff0…

【LeetCode】03.无重复字符的最长子串

题目要求 做题链接3.无重复字符的最长子串 解题思路 我们通过参考给出的输入很容易就会从每一个字符开始&#xff0c;看看最长能延续多长。我们通过画图发现一旦一个字符可以延续到另一个字符&#xff0c;那么我们就不需要考虑他中间仍然存在字符重复的问题。因此而后我们发…

部署mongosh教程

1、上传软件包 将软件包上传到/usr/local目录下 部署 2.1 解压 tar zxvf mongosh-2.3.0-linux-x64.tgz 2.2 修改名称 mv mongosh-2.3.0-linux-x64/ mongosh 2.3 将 bin 目录中 mongosh 二进制文件复制到 PATH 变量中列出的目录中 sudo cp mongosh /usr/local/bin/ sudo cp …

第九届“创客中国”生成式人工智能中小企业创新创业大赛招商推介圆满落幕

金秋九月,丹桂飘香。9月2日晚,第九届“创客中国”生成式人工智能(AIGC)中小企业创新创业大赛招商推介会在南昌高新区艾溪湖畔成功举办。南昌市政府副秘书长、办公室党组成员陈吉炜出席并致辞。市中小企业局党组书记、市工信局党组书记、局长骆军出席。南昌高新区党工委委员、管…

16 C语言连接

使用c语言连接mysql&#xff0c;需要使用mysql官网提供的库&#xff0c;可以在官网下载 准备工作&#xff1a; 保证mysql服务有效 官网下载合适的mysql connect库 也可以直接安装mysql服务 yum install -y mysql-devel Connector/C使用 库格式如下&#xff1a; [hbMiWiFi-R1…

无线麦克风推荐,无线麦克风十大名牌,领夹麦克风十大品牌推荐

在音频创作的专业舞台上&#xff0c;无线领夹麦克风不仅是声音捕捉的利器&#xff0c;更是创作者表达情感的桥梁。然而&#xff0c;市场上琳琅满目的产品让人眼花缭乱&#xff0c;不少劣质麦克风不仅收音效果大打折扣&#xff0c;还常因信号不稳、噪音干扰而破坏了作品的纯净度…

使用NI CANopen与多个节点进行通信

要使用N CANopen同时与多个节点进行通信&#xff0c;可以利用CANopen Library Toolkit提供的不同VI。以下是详细的步骤说明&#xff1a; 了解VI的功能&#xff1a; NMT Write.vi&#xff1a; 该VI用于向特定节点或所有节点发送网络管理&#xff08;NMT&#xff09;命令。使用No…

Linux之多线程概念

目录 线程概念 线程共享的资源 线程独有的资源 线程优点 线程缺点 在之前&#xff0c;我们已经学习了进程相关的知识点&#xff0c;如进程的基本概念和基本操作&#xff0c;本期我们将开始进行线程的学习&#xff0c;探索线程和进程的关系。 线程概念 在学习线程之前…

镭速助力构筑ICT安全高效的大文件传输

在数字化浪潮的推动下&#xff0c;信息通信技术&#xff08;ICT&#xff09;行业正以惊人的速度发展&#xff0c;随之而来的是跨国、跨区域文件传输需求的激增。然而&#xff0c;传统的大文件传输方法已难以满足当前ICT行业的需求&#xff0c;面临着诸多挑战&#xff0c;如跨国…

多用户B2B2C商城源码+短视频直播+APP+小程序+H5

店铺管理 店铺列表&#xff0c;新店铺审核&#xff0c;地址管理&#xff0c;服务管理&#xff0c;运费模版&#xff0c;品牌管理 订单监管 视频订单&#xff0c;拼团订单&#xff0c;评论管理&#xff0c;退款管理 装修商城 模版管理&#xff0c;页面管理&#xff0c;全局…

太速科技-1路万兆光纤SFP+和1路千兆网络 FMC子卡模块

1路万兆光纤SFP和1路千兆网络 FMC子卡模块 一、概述 该板卡是基于kc705和ml605的fmc 10g万兆光纤扩展板设计&#xff0c;提供了1路万兆光纤SFP和1路千兆网络接口。可搭配我公司开发的FPGA载卡使用。载卡可参考&#xff1a;ID204 SFP&#xff08;10 Gigabit Small…

涨幅超过了90%,心动网络股价成V字后,TapTap找到流量源了吗?

心动公司发布了截至2024年6月30日止六个月的中期业绩。 在2024年上半年&#xff08;24H1&#xff09;&#xff0c;公司实现总营收22.21亿元&#xff0c;较去年同期增长了26.7%。归属于母公司的净利润达到2.05亿元&#xff0c;同比激增127.4%。经调整后&#xff0c;归属于母公司…

Linux下使用crontab配置定时任务

文章目录 Linux使用crontab安装crontab启动crontab查看定时任务创建定时任务配置案例配置语法位置含义符号含义 注意 取消定时任务 Linux使用crontab crontab为Linux下的计划任务程序&#xff0c;对应的服务为crond。crond是一个守护进程&#xff0c;每分钟会定期检查是否有要…

OZON秋季爆款新品推荐,OZON秋季爆款

Top1 吸顶灯 Светильник влагозащищенный 15W IP65 6500К (155х37) круг светодиодный настенно-потолочный герметичный для использования в сухих а так-же вла…

自闭症儿童的语言障碍:理解、接纳与干预

自闭症&#xff0c;这个在现代社会中逐渐受到关注的神经发育障碍&#xff0c;给许多家庭带来了挑战与希望并存的旅程。其中&#xff0c;自闭症儿童的语言障碍是尤为显著且复杂的问题之一。 自闭症儿童的语言障碍表现为多种形式&#xff0c;包括语言发育迟缓、语言形式或内容异常…

如何修复软件中的BUG

笔者上一篇博文《如何开发出一款优秀的软件》主要讲了如何开发一款优秀的软件及相应的必要条件。但对一个已上线&#xff0c;已经成型的产品&#xff0c;该如何解决存在的bug呢&#xff1f;这是本文要阐述的内容。 在这里&#xff0c;首先说一下bug的种类及bug严重程度分类&…