【Kubernetes】持久化存储emptyDir/hostPath/nfs/PVC

news2024/11/26 8:51:44

k8s持久化存储

  • 一、为什么做持久化存储?
  • 二、k8s持久化存储:emptyDir
  • 三、k8s持久化存储:hostPath
  • 四、k8s持久化存储:nfs
    • 4.1、搭建nfs服务
    • 4.2、挂载nfs共享目录
  • 五、k8s持久化存储: PVC
    • 5.1、什么是PV
    • 5.2、什么是PVC
    • 5.3、PV和PVC工作原理
      • 【1】pv供应方式
      • 【2】绑定
      • 【3】使用
      • 【4】回收策略
    • 5.4、使用pvc作为持久化存储卷
      • 【1】创建nfs共享目录
      • 【2】创建PV
      • 【3】创建PVC
      • 【4】创建pod,挂载PVC

一、为什么做持久化存储?

在k8s中部署的应用都是以pod容器的形式运行的,假如我们部署MySQL、Redis等数据库,需要对这些数据库产生的数据做备份。
因为Pod是有生命周期的,如果pod不挂载数据卷,那pod被删除或重启后这些数据会随之消失,如果想要长久的保留这些数据就要用到pod数据持久化存储。

查看k8s支持哪些存储 kubectl explain pods.spec.volumes
常用的有emptyDir、hostPath 、nfs 、persistentVolumeClaim、glusterfs、cephfs、configMap、secret
我们想要使用存储卷,需要经历如下步骤:
1、定义pod的volume,这个volume指明它要关联到哪个存储上的
2、在容器中要使用volumemounts挂载对应的存储

二、k8s持久化存储:emptyDir

emptyDir类型的Volume是在Pod分配到Node上时被创建,Kubernetes会在Node上自动分配一个目录,因此无需指定宿主机Node上对应的目录文件。
这个目录的初始内容为空,当Pod从Node上移除时,emptyDir中的数据会被永久删除。emptyDir Volume主要用于某些应用程序无需永久保存的临时目录,多个容器的共享目录等。

Emptydir的官方网址:https://kubernetes.io/docs/concepts/storage/volumes#emptydir

# 创建一个pod,挂载临时目录emptyDir
[root@master 10]# cat emptydir.yaml
apiVersion: v1
kind:  Pod
metadata:
  name: pod-empty
spec:
  containers:
  - name: container-empty
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: cache-volume   # 将cache-volume的挂载到容器里面的/cache下
      mountPath: /cache
  volumes:
  - emptyDir: {}  # 把临时目录做成一个卷
    name: cache-volume  # 临时卷卷名
[root@master 10]# kubectl apply -f emptydir.yaml

# 查看本机临时目录存在的位置,可用如下方法:
# 查看pod调度到哪个节点
[root@master 10]# kubectl get pods -o wide | grep empty
pod-empty   1/1     Running   0          85s   10.244.140.83   node02   <none>           <none>
[root@master 10]# kubectl get pods pod-empty -o yaml | grep uid
  uid: 3570ddfd-b4ab-4500-928e-caa3f369c276
# 登录到对应节点上
[root@node02 ~]# yum install tree -y
[root@node02 ~]# tree /var/lib/kubelet/pods/3570ddfd-b4ab-4500-928e-caa3f369c276
/var/lib/kubelet/pods/3570ddfd-b4ab-4500-928e-caa3f369c276
├── containers
│   └── container-empty
│       └── e90c5eec
├── etc-hosts
├── plugins
│   └── kubernetes.io~empty-dir
│       ├── cache-volume
│       │   └── ready
│       └── wrapped_kube-api-access-896m7
│           └── ready
└── volumes
    ├── kubernetes.io~empty-dir
    │   └── cache-volume  # 临时目录
    └── kubernetes.io~projected
        └── kube-api-access-896m7
            ├── ca.crt -> ..data/ca.crt
            ├── namespace -> ..data/namespace
            └── token -> ..data/token

缺点:pod删除后,对应的UID的目录就没有了,里面的临时目录也就没有了。所以,emptyDir只适合做测试用。

三、k8s持久化存储:hostPath

hostPath Volume是指Pod挂载宿主机上的目录或文件。 hostPath Volume使得容器可以使用宿主机的文件系统进行存储,hostpath(宿主机路径):节点级别的存储卷,在pod被删除,这个存储卷还是存在的,不会被删除
所以只要同一个pod被调度到同一个节点上来,在pod被删除重新被调度到这个节点之后,对应的数据依然是存在的。

查看hostPath存储卷的用法: kubectl explain pods.spec.volumes.hostPath

# 创建一个pod,挂载hostPath存储卷
[root@master 10]# cat hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-hostpath
spec:
  nodeName: node01
  containers:
  - name: test-nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: test-volume
      mountPath: /test-nginx
  - name: test-tomcat
    image: tomcat:8.5-jre8-alpine
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: test-volume
      mountPath: /test-tomcat
  volumes:
  - hostPath:
     path: /data1   
     type: DirectoryOrCreate # 如果宿主机该目录不存在,则创建,权限设置为0755
    name: test-volume
[root@master 10]# kubectl apply -f hostpath.yaml
[root@master 10]# kubectl get pod
NAME            READY   STATUS    RESTARTS   AGE
test-hostpath   2/2     Running   0          70s

数据卷类型:https://kubernetes.io/zh-cn/docs/concepts/storage/volumes/
在这里插入图片描述
由上面可以知道pod调度到了node01上,登录到node01机器,查看是否在这台机器创建了存储目录

[root@node01 /]# ll -d data1 
drwxr-xr-x 2 root root 6 Dec 10 20:38 data1
# 进入容器,创建文件
[root@master 10]# kubectl exec -it test-hostpath -c test-nginx /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@test-hostpath:/# cd /test-nginx
root@test-hostpath:/test-nginx# touch nginx
root@test-hostpath:/test-nginx# ls
nginx
# 宿主机对应路径下存在该文件,说明已经把宿主机目录挂载到了容器里
[root@node01 /]# cd data1
[root@node01 data1]# ls
nginx

缺点:单节点。pod删除之后重新创建必须调度到同一个node节点,数据才不会丢失
可以用分布式存储:nfs,cephfs,glusterfs

四、k8s持久化存储:nfs

NFS:网络文件系统,英文Network File System(NFS),是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。

4.1、搭建nfs服务

# 1、以k8s的控制节点作为NFS服务
[root@master 10]# yum install nfs-utils -y 
# 2、在宿主机创建NFS需要的共享目录
[root@master 10]#  mkdir /data/volumes -pv
mkdir: created directory ‘/data/volumes’
# 3、配置nfs共享服务器上的/data/volumes目录
[root@master 10]# systemctl start nfs
[root@master 10]# cat /etc/exports
/data/volumes *(rw,no_root_squash)
# rw 该主机对该共享目录有读写权限
# no_root_squash 登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限

# 4、重启nfs、设置开机自启、检查
[root@master 10]# exportfs -arv
[root@master 10]#  service nfs restart # 不重启也可以,不影响
[root@master 10]# systemctl enable nfs
[root@master 10]# systemctl status nfs
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
  Drop-In: /run/systemd/generator/nfs-server.service.d
           └─order-with-mounts.conf
   Active: active (exited) since Sun 2023-12-10 20:56:24 CST; 13s ago
 Main PID: 29331 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nfs-server.service
# 工作节点安装nfs驱动
[root@node01 ~]# yum install nfs-utils -y
[root@node02 ~]# yum install nfs-utils -y
[root@node01 ~]# systemctl enable  nfs --now
[root@node02 ~]# systemctl enable  nfs --now
# 测试nfs是否可以被正常挂载
[root@node01 ~]#  mkdir /test 
[root@node01 ~]#  mount 10.32.1.147:/data/volumes /test/
[root@node01 ~]# df -h|grep 147
10.32.1.147:/data/volumes  200G   50G  150G  26% /test
# 手动卸载
[root@node01 ~]#  umount /test

4.2、挂载nfs共享目录

Pod挂载nfs的官方地址:https://kubernetes.io/zh/docs/concepts/storage/volumes/

# 1、创建pod,挂载nfs共享出来的目录
[root@master 10]# cat nfs.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-test
spec:
  replicas: 3
  selector:
    matchLabels:
      cunchu: nfs
  template:
    metadata:
      labels:
         cunchu: nfs
    spec:
      containers:
      - name: test-nfs
        image: xianchao/nginx:v1 # 这里的镜像根据实际情况替换
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          protocol: TCP
        volumeMounts:
        - name: nfs-volumes
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-volumes
        nfs:
          server: 10.32.1.147   # 提供nfs服务的主机ip,我这里就是控制节点master的ip
          path: /data/volumes   # nfs的共享目录
[root@master 10]# kubectl apply -f nfs.yaml
[root@master 10]#  kubectl get pods -o wide
NAME                       READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
nfs-test-64466f5c4-gm52s   1/1     Running   0          61s   10.244.196.141   node01   <none>           <none>
nfs-test-64466f5c4-pcqsh   1/1     Running   0          63s   10.244.140.86    node02   <none>           <none>
nfs-test-64466f5c4-vp85f   1/1     Running   0          59s   10.244.140.87    node02   <none>           <none>
# 2、登录到nfs服务器,在共享目录创建一个index.html
[root@master ~]# cd /data/volumes
[root@master volumes]# vim index.html
[root@master volumes]# cat index.html
Hello, Everyone
My name is hejin
My Chat is hj68223
# 3、进入其中一个容器,查看是否存在这个文件
[root@master volumes]# kubectl exec -it nfs-test-64466f5c4-gm52s  /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nfs-test-64466f5c4-gm52s:/# cd /usr/share/nginx/html
root@nfs-test-64466f5c4-gm52s:/usr/share/nginx/html# ls
index.html

# 4、请求pod的ip,看结果
[root@master 10]# curl 10.244.196.141
Hello, Everyone
My name is hejin
My Chat is hj68223
# 通过上面可以看到,在共享目录创建的index.html已经被pod挂载了

上面说明挂载nfs存储卷成功了,nfs支持多个客户端挂载,可以创建多个pod,挂载同一个nfs服务器共享出来的目录;
但是nfs如果宕机了,数据也就丢失了,所以需要使用分布式存储,常见的分布式存储有glusterfs和cephfs。

五、k8s持久化存储: PVC

参考官网:https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes

5.1、什么是PV

PersistentVolume(PV)是群集中的一块存储,由管理员配置或使用存储类动态配置。
它是集群中的资源,就像pod是k8s集群资源一样。
PV是容量插件,如Volumes,其生命周期独立于使用PV的任何单个pod。

5.2、什么是PVC

PersistentVolumeClaim(PVC)是一个持久化存储卷,我们在创建pod时可以定义这个类型的存储卷。
它类似于一个pod。 Pod消耗节点资源,PVC消耗PV资源。
Pod可以请求特定级别的资源(CPU和内存)。
pvc在申请pv的时候也可以请求特定的大小和访问模式(例如,可以一次读写或多次只读)。

5.3、PV和PVC工作原理

PV是群集中的资源。 PVC是对这些资源的请求。
PV和PVC之间的相互作用遵循以下生命周期:

【1】pv供应方式

可以通过两种方式配置PV:静态或动态。

静态的:

集群管理员创建了许多PV。它们包含可供群集用户使用的实际存储的详细信息。它们存在于Kubernetes API中,可供使用。

动态的:

当管理员创建的静态PV都不匹配用户的PersistentVolumeClaim时,群集可能会尝试为PVC专门动态配置卷。
此配置基于StorageClasses,PVC必须请求存储类,管理员必须创建并配置该类,以便进行动态配置。

【2】绑定

用户创建pvc并指定需要的资源和访问模式。在找到可用pv之前,pvc会保持未绑定状态

【3】使用

a)需要找一个存储服务器,把它划分成多个存储空间;
b)k8s管理员可以把这些存储空间定义成多个pv;
c)在pod中使用pvc类型的存储卷之前需要先创建pvc,通过定义需要使用的pv的大小和对应的访问模式,找到合适的pv;
d)pvc被创建之后,就可以当成存储卷来使用了,我们在定义pod时就可以使用这个pvc的存储卷
e)pvc和pv它们是一一对应的关系,pv如果被pvc绑定了,就不能被其他pvc使用了;
f)我们在创建pvc的时候,应该确保和底下的pv能绑定,如果没有合适的pv,那么pvc就会处于pending状态。

【4】回收策略

回收策略persistentVolumeReclaimPolicy字段

当我们创建pod时如果使用pvc做为存储卷,那么它会和pv绑定,当删除pod,pvc和pv绑定就会解除

解除之后和pvc绑定的pv卷里的数据需要怎么处理,目前,卷可以保留,回收或删除:
Retain
Recycle (不推荐使用,1.15可能被废弃了)
Delete

1、Retain
当删除pvc的时候,pv仍然存在,处于released状态,但是它不能被其他pvc绑定使用,里面的数据还是存在的,当我们下次再使用的时候,数据还是存在的,这个是默认的回收策略

2、Delete
删除pvc时即会从Kubernetes中移除PV,也会从相关的外部设施中删除存储资产

5.4、使用pvc作为持久化存储卷

创建pod,使用pvc作为持久化存储卷

【1】创建nfs共享目录

# 1、在宿主机创建NFS需要的共享目录
[root@master 10]# mkdir cd v{1,2,3,4,5,6,7,8,9,10} -p
[root@master volumes]# cd /data/volume_test/
[root@master volume_test]# ls
v1  v10  v2  v3  v4  v5  v6  v7  v8  v9

# 2、配置nfs共享宿主机上的/data/volume_test/v1..v10目录
[root@master 10]# cat /etc/exports
/data/volumes *(rw,no_root_squash)
/data/volume_test/v1 *(rw,no_root_squash)
/data/volume_test/v2 *(rw,no_root_squash)
/data/volume_test/v3 *(rw,no_root_squash)
/data/volume_test/v4 *(rw,no_root_squash)
/data/volume_test/v5 *(rw,no_root_squash)
/data/volume_test/v6 *(rw,no_root_squash)
/data/volume_test/v7 *(rw,no_root_squash)
/data/volume_test/v8 *(rw,no_root_squash)
/data/volume_test/v9 *(rw,no_root_squash)
/data/volume_test/v10 *(rw,no_root_squash)
# 重新加载配置,使配置成效
[root@master 10]# exportfs -arv

【2】创建PV

参考:https://kubernetes.io/zh/docs/concepts/storage/persistent-volumes/#reclaiming

[root@master 10]# cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: v1
  labels:
    app: v1
spec:
  nfs:
   server: 10.32.1.147
   path: /data/volume_test/v1
  accessModes: ["ReadWriteOnce"] # 访问模式 RWO
  capacity:
   storage: 1Gi  # 设置存储容量
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: v2
  labels:
    app: v2
spec:
  nfs:
   server: 10.32.1.147
   path: /data/volume_test/v2
  accessModes: ["ReadOnlyMany"] # 访问模式 ROX
  capacity:
   storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: v3
  labels:
    app: v3
spec:
  nfs:
   server: 10.32.1.147
   path: /data/volume_test/v3
  accessModes: ["ReadWriteMany"] # 访问模式 RWX
  capacity:
   storage: 3Gi
[root@master 10]# kubectl apply -f pv.yaml
persistentvolume/v1 created
persistentvolume/v2 created
persistentvolume/v3 created
[root@master 10]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
v1     1Gi        RWO            Retain           Available                                   26s
v2     2Gi        ROX            Retain           Available                                   26s
v3     3Gi        RWX            Retain           Available                                   26s

注解:

  • RWO:readwariteonce: 单路读写,允许同一个node节点上的pod访问
  • ROX: readonlymany: 多路只读,允许不同node节点的pod以只读方式访问
  • RWX: readwritemany: 多路读写,允许不同的node节点的pod以读写方式访问

【3】创建PVC

创建pvc,和符合条件的pv绑定

[root@master 10]# cat pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-v1
spec:
  accessModes: ["ReadWriteOnce"]
  selector:
    matchLabels:
      app: v1
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-v2
spec:
  accessModes: ["ReadOnlyMany"]
  selector:
    matchLabels:
      app: v2
  resources:
    requests:
      storage: 2Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-v3
spec:
  accessModes: ["ReadWriteMany"]
  selector:
    matchLabels:
      app: v3
  resources:
    requests:
     storage: 3Gi
[root@master 10]# kubectl apply -f pvc.yaml
persistentvolumeclaim/pvc-v1 created
persistentvolumeclaim/pvc-v2 created
persistentvolumeclaim/pvc-v3 created
[root@master 10]# kubectl get pvc
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-v1   Bound    v1       1Gi        RWO                           57s
pvc-v2   Bound    v2       2Gi        ROX                           57s
pvc-v3   Bound    v3       3Gi        RWX                           57s
# 看到pvc的status都是bound状态,就说明pvc跟pv已经绑定了

【4】创建pod,挂载PVC

[root@master 10]# cat pod_pvc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pvc-test
spec:
  replicas: 3
  selector:
    matchLabels:
      cunchu: pvc
  template:
    metadata:
      labels:
         cunchu: pvc
    spec:
      containers:
      - name: test-pvc
        image: docker.io/library/nginx:latest # 根据自己请情况替换镜像
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          protocol: TCP
        volumeMounts:
        - name: nginx-html
          mountPath: /usr/share/nginx/html
      volumes:
      - persistentVolumeClaim:
          claimName: pvc-v1
        name: nginx-html
[root@master 10]# kubectl apply -f pod_pvc.yaml
[root@master 10]# kubectl get pod|grep pvc
pvc-test-64bfccc668-bq529   1/1     Running   0          39s
pvc-test-64bfccc668-bxjqx   1/1     Running   0          39s
pvc-test-64bfccc668-t8xjt   1/1     Running   0          39s
# 验证是否挂载成功
[root@master 10]# cd /data/volume_test/v1
[root@master v1]# ls
[root@master v1]# mkdir lucky
[root@master v1]# kubectl exec -it pvc-test-64bfccc668-bq529 /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@pvc-test-64bfccc668-bq529:/# cd /usr/share/nginx/html/
root@pvc-test-64bfccc668-bq529:/usr/share/nginx/html# ls
lucky

注:使用pvc和pv的注意事项

1、我们每次创建pvc的时候,需要事先有划分好的pv,这样可能不方便,那么可以在创建pvc的时候直接动态创建一个pv这个存储类,pv事先是不存在的

2、pvc和pv绑定,如果使用默认的回收策略retain,那么删除pvc之后,pv会处于released状态,我们想要继续使用这个pv,需要手动删除pv,kubectl delete pv pv_name,删除pv,不会删除pv里的数据,当我们重新创建pvc时还会和这个最匹配的pv绑定,数据还是原来数据,不会丢失。

经过测试,如果回收策略是Delete,删除pv,pv后端存储的数据也不会被删除

删除pvc的步骤:
1、需要先删除使用pvc的pod

[root@master 10]# kubectl delete -f pod_pvc.yaml
deployment.apps "pvc-test" deleted

2、再删除pvc

[root@master 10]# kubectl delete pvc pvc-v1 pvc-v2 pvc-v3
[root@master 10]#  kubectl get pvc
No resources found in default namespace.
[root@master 10]#  kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM            STORAGECLASS   REASON   AGE
v1     1Gi        RWO            Retain           Released   default/pvc-v1                           41m
v2     2Gi        ROX            Retain           Released   default/pvc-v2                           41m
v3     3Gi        RWX            Retain           Released   default/pvc-v3                           41m

pv状态变成Released ,就已经不能使用,需要删除,再重新创建后才能继续使用。
但是共享目录下面的数据是不会被删除的,可以放心使用。

演示pv用Delete回收策略
1、创建pv

[root@master 10]# cat pv-1.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: v4
  labels:
    app: v4
spec:
  nfs:
   server: 10.32.1.147
   path: /data/volume_test/v4
  accessModes: ["ReadWriteOnce"]
  capacity:
   storage: 1Gi
  persistentVolumeReclaimPolicy: Delete
  [root@master 10]# kubectl apply -f  pv-1.yaml

2、创建pvc

[root@master 10]# cat pvc-1.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-v4
spec:
  accessModes: ["ReadWriteOnce"]
  selector:
    matchLabels:
      app: v4
  resources:
    requests:
      storage: 1Gi
[root@master 10]# kubectl apply -f pvc-1.yaml
[root@master 10]# kubectl get pvc
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-v4   Bound    v4       1Gi        RWO                           17s

3、创建pod

[root@master 10]# cat pod_pvc-2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pvc-test-1
spec:
  replicas: 3
  selector:
    matchLabels:
      cunchu: pvc-1
  template:
    metadata:
      labels:
         cunchu: pvc-1
    spec:
      containers:
      - name: test-pvc
        image: docker.io/library/nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          protocol: TCP
        volumeMounts:
        - name: nginx-html
          mountPath: /usr/share/nginx/html
      volumes:
      - persistentVolumeClaim:
          claimName: pvc-v4
        name: nginx-html
                name: nginx-html
[root@master 10]# kubectl apply -f pod_pvc-2.yaml
[root@master 10]# kubectl get pod|grep pvc
pvc-test-1-6f5d6d8699-5mbn6   1/1     Running   0          27s
pvc-test-1-6f5d6d8699-gjv4s   1/1     Running   0          27s
pvc-test-1-6f5d6d8699-xh4c9   1/1     Running   0          27s

4、验证是否共享存储卷

 [root@master v4]# cd /data/volume_test/v4
[root@master v4]# ll
total 0
[root@master v4]# mkdir lucky
[root@master v4]# ll
total 0
drwxr-xr-x. 2 root root 6 Dec 10 22:46 lucky
[root@master 10]# kubectl exec -it pvc-test-1-6f5d6d8699-5mbn6 -- /bin/bash
root@pvc-test-1-6f5d6d8699-5mbn6:/# cd /usr/share/nginx/html/
root@pvc-test-1-6f5d6d8699-5mbn6:/usr/share/nginx/html# ls
lucky
[root@master 10]# kubectl delete -f pod_pvc-2.yaml
[root@master 10]# kubectl get pvc
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-v4   Bound    v4       1Gi        RWO                           17m
[root@master 10]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM            STORAGECLASS   REASON   AGE
v4     1Gi        RWO            Delete           Bound      default/pvc-v4                           11m

[root@master 10]# kubectl delete pvc pvc-v4
[root@master 10]# kubectl get pv|grep v4  
# 此处有问题,pv的状态为Failed ,所以共享目录中数据没有被删除,后续有空再排查原因......
v4     1Gi        RWO            Delete           Failed     default/pvc-v4                           19m

当与该PV相关联的PVC(Persistent Volume Claim)被删除时,PV上的数据将被自动删除。
换句话说,一旦没有任何PVC使用这个PV,Kubernetes将自动删除PV中的数据以及PV本身。这种行为确保了资源的及时释放,以及在没有使用的PV上不会保留不必要的数据。
因此,在设置PV时,需要根据实际需求谨慎选择适当的删除策略,以确保数据和资源的合理管理。

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

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

相关文章

[虚拟机]使用VM打开虚拟机电脑重启解决方案。

问题&#xff1a;打开虚拟机点击启动后&#xff0c;电脑会自动重启。&#xff08;WINDOWS10 20版本&#xff09; 解决步骤&#xff1a; 1、对Windows功能进行操作。 上图三个启用。 上图一个取消。 再次打开后&#xff0c;不报警&#xff0c;显示下图问题&#xff1a; 继续解…

VS Code使用教程

链接远程服务器 https://blog.csdn.net/zhaxun/article/details/120568402 免密登陆服务器 1生成客户机&#xff08;个人PC&#xff09;密令 ssh-keygen -t rsa生成的文件在主目录的.ssh文件当中。 查看密令并复制到linux系统当中 cat id_rsa.pub 2复制到服务器中 echo …

C++枚举类

枚举 C11有作用域枚举和无作用域枚举 无作用域枚举 特点 全局作用域&#xff1a;无作用域枚举的成员&#xff08;枚举值&#xff09;在包含它们的作用域内是直接可见的&#xff0c;不需要使用枚举类型名称作为前缀。 隐式类型转换&#xff1a;无作用域枚举的成员可以隐式地转换…

“新华三杯”第十届成都信息工程大学ACM程序设计竞赛(同步赛)L. 怎么走啊(最短路+二分 分段函数)

题目 登录—专业IT笔试面试备考平台_牛客网 思路来源 衡阳师范学院ac代码、pj学弟 题解 大致可以证明&#xff0c;在w从1e5减小到1的过程中&#xff0c; 之前某条反向边没有用到&#xff0c;现在需要用到反向边&#xff0c;也就是正向边用到的变少了 这样的变化有sqrt个&a…

【计算机网络基础1】网络层次划分和OSI七层网络模型

1、网络层次划分 为了使不同计算机厂家生产的计算机能够相互通信&#xff0c;以便在更大的范围内建立计算机网络&#xff0c;国际标准化组织&#xff08;ISO&#xff09;在1978年提出了"开放系统互联参考模型"&#xff0c;即著名的OSI/RM模型&#xff08;Open Syste…

WPS宏批量修改图片尺寸

致谢 感谢网络各位大佬的分享&#xff0c;可以让我快速的学习这块内容。 JS宏代码

佳明(Garmin) fēnix 7X 增加小睡检测功能

文章目录 &#xff08;一&#xff09;零星小睡&#xff08;二&#xff09;小睡检测&#xff08;三&#xff09;吐槽佳明&#xff08;3.1&#xff09;心率检测&#xff08;3.2&#xff09;光线感应器&#xff08;3.3&#xff09;手表重量&#xff08;3.4&#xff09;手表续航 &a…

Nodejs后端+express框架

前言 基于vue3Node后台管理项目&#xff0c;补充nodejs和express相关知识。 文章目录 一&#xff0c;express 1.官网 Express - 基于 Node.js 平台的 web 应用开发框架 - Express中文文档 | Express中文网 2.安装 npm install express --save 二、MongoDB 特点 非关…

关于图像清晰度、通透度的描述

1、问题背景 在图像评测过程中&#xff0c;从主观上一般怎么去评判一副图像的优劣呢&#xff1f; 比较显而易见的就是图像的清晰度和通透度&#xff0c;他们决定了评判者对画质的第一印象。 那怎么去理解图像的清晰度和通透度呢&#xff1f;这是本文要描述的内容。 2、问题分…

reinforce 跑 CartPole-v1

gym版本是0.26.1 CartPole-v1的详细信息&#xff0c;点链接里看就行了。 修改了下动手深度强化学习对应的代码。 然后这里 J ( θ ) J(\theta) J(θ)梯度上升更新的公式是用的不严谨的&#xff0c;这个和王树森书里讲的严谨公式有点区别。 代码 import gym import torch from …

二十一章网络通信

计算机网络实现了堕胎计算机间的互联&#xff0c;使得它们彼此之间能够进行数据交流。网络应用程序就是再已连接的不同计算机上运行的程序&#xff0c;这些程序借助于网络协议&#xff0c;相互之间可以交换数据&#xff0c;编写网络应用程序前&#xff0c;首先必须明确网络协议…

用23种设计模式打造一个cocos creator的游戏框架----(八)适配器模式

1、模式标准 模式名称&#xff1a;适配器模式 模式分类&#xff1a;结构型 模式意图&#xff1a;适配器模式的意图是将一个类的接口转换成客户端期望的另一个接口。适配器模式使原本接口不兼容的类可以一起工作。 结构图&#xff1a; 适用于&#xff1a; 系统需要使用现有的…

力扣题:数字与字符串间转换-12.11

力扣题-12.11 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;506. 相对名次 解题思想&#xff1a;进行排序即可 class Solution(object):def findRelativeRanks(self, score):""":type score: List[int]:rtype: List[str]"&…

Java学习笔记——instanceof关键字

instanceof关键字&#xff1a; 作用&#xff1a;保证对象向下转型的安全性在对象向下转型前判断某一对象实例是否属于某个类 判断时&#xff0c;如果对象是null&#xff0c;则 instanceof 判断结果为 false

搜狗输入法v模式 | 爱莉希雅皮肤

搜狗输入法v模式 | 爱莉希雅皮肤 前言爱莉希雅皮肤v模式 前言 搜狗输入法有v模式&#xff0c;v模式是一个转换和计算的功能组合。拥有数字转换、日期转换、算式计算、函数计算等功能。本文介绍如何使用v模式&#xff0c;并附赠一个爱莉希雅的皮肤&#xff0c;可通过百度网盘下…

订单系统的设计与海量数据处理实战

概述 订单系统可以说是整个电商系统中最重要的一个子系统&#xff0c;因此订单数据可以算作电商企业最重要的数据资产。订单系统从代码上来说可分为两部分&#xff1a;订单程序和历史订单处理程序。数据存储进行分库分表。 订单系统业务分析 对于一个合格的订单系统&#xf…

人力资源服务大赛活动方案

为加快人力资源服务业发展&#xff0c;进一步提升人力资源服务从业人员的专业化、职业化水平&#xff0c;推动云南省人力资源服务产业创新发展&#xff0c;促进行业服务规范&#xff0c;为云南省经济社会发展提供人力服务保障。云南省人力资源和社会保障厅计划组织开展“云南省…

vite脚手架,配置动态生成路由,添加不同的layout以及meta配置

实现效果&#xff0c;配置了layout和对应的路由的meta 我想每个模块添加对应的layout&#xff0c;下边演示一层layout及对应的路由 约束规则&#xff1a; 每个模块下&#xff0c;添加对应的 layout.vue 文件 每个文件夹下的 index.vue 是要渲染的页面路由 每个渲染的页面路由对…

关于python一些惯用写法、语法

关于python一些惯用代码处理 程序入口&#xff08;python从脚本第一行开始运行&#xff0c;没有统一的入口)if __name__ __main__: filename.split("/")[-1][:-4][split("/")\[-1\] 和 split("/",-1)的区别](https://blog.csdn.net/jialibang/a…

分层网络模型(OSI、TCP/IP)及对应的网络协议

OSI七层网络模型 OSI&#xff08;Open System Interconnect&#xff09;&#xff0c;即开放式系统互连参考模型&#xff0c; 一般都叫OSI参考模型&#xff0c;是ISO组织于1985年研究的网络互连模型。OSI是分层的体系结构&#xff0c;每一层是一个模块&#xff0c;用于完成某种功…