热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

Kubernetes之存储PVPVC详解

1.概述与管理计算实例相比,管理存储是一个明显的问题。PersistentVolume子系统为用户和管理员提供了一个API,该API从如何使用存储中抽象出如何提供存储的详细信息。为

1.概述

与管理计算实例相比,管理存储是一个明显的问题。PersistentVolume子系统为用户和管理员提供了一个API,该API从如何使用存储中抽象出如何提供存储的详细信息。为此,我们引入了两个新的API资源:PersistentVolume和PersistentVolumeClaim。

 


1.1PV概述

PersistentVolume (PV)是集群中由管理员提供或使用存储类动态提供的一块存储。它是集群中的资源,就像节点是集群资源一样。

PV是与Volumes类似的卷插件,但其生命周期与使用PV的任何单个Pod无关。由此API对象捕获存储的实现细节,不管是NFS、iSCSI还是特定于云提供商的存储系统。

 


1.2PVC概述

PersistentVolumeClaim (PVC) 是用户对存储的请求。它类似于Pod;Pods消耗节点资源,而PVC消耗PV资源。Pods可以请求特定级别的资源(CPU和内存)。Claim可以请求特定的存储大小和访问模式(例如,它们可以挂载一次读写或多次只读)。

虽然PersistentVolumeClaims (PVC) 允许用户使用抽象的存储资源,但是用户通常需要具有不同属性(比如性能)的PersistentVolumes (PV) 来解决不同的问题。集群管理员需要能够提供各种不同的PersistentVolumes,这些卷在大小和访问模式之外还有很多不同之处,也不向用户公开这些卷是如何实现的细节。对于这些需求,有一个StorageClass资源。

 


1.3绑定

用户创建(或者在动态配置的情况下,已经创建)具有特定存储请求量(大小)和特定访问模式的PersistentVolumeClaim。主控制器中的控制循环监视新的PV,找到匹配的PV(如果可能的话),并将它们绑定在一起。如果PV为新的PVC动态配置,那么循环始终将该PV绑定到PVC。否则,用户始终至少得到他们所要求的,但是存储量可能会超过所要求的范围。

一旦绑定,无论是如何绑定的,PersistentVolumeClaim绑定都是互斥的。PVC到PV的绑定是一对一的映射,使用ClaimRef,它是PersistentVolume和PersistentVolumeClaim之间的双向绑定。

如果不存在匹配的卷,声明(Claims)将无限期保持未绑定。随着匹配量的增加,声明将受到约束。例如,配备有许多50Gi PV的群集将与请求100Gi的PVC不匹配。当将100Gi PV添加到群集时,可以绑定PVC。

注意:静态时PVC与PV绑定时会根据storageClassName(存储类名称)和accessModes(访问模式)判断哪些PV符合绑定需求。然后再根据存储量大小判断,首先存PV储量必须大于或等于PVC声明量;其次就是PV存储量越接近PVC声明量,那么优先级就越高(PV量越小优先级越高)。

 


1.4使用

Pods使用声明(claims)作为卷。集群检查声明以找到绑定卷并为Pod挂载该卷。对于支持多种访问模式的卷,用户在其声明中作为Pod中卷使用时指定所需的模式。

一旦用户拥有一个声明并且该声明被绑定,则绑定的PV就属于该用户。用户通过在Pod的卷块中包含的persistentVolumeClaim部分来调度Pods并访问其声明的PV。

 


1.5持久化声明保护

“使用中的存储对象保护” :该功能的目的是确保在Pod活动时使用的PersistentVolumeClaims (PVC)和绑定到PVC的PersistentVolume (PV)不会从系统中删除,因为这可能会导致数据丢失。

如果用户删除了Pod正在使用的PVC,则不会立即删除该PVC;PVC的清除被推迟,直到任何Pod不再主动使用PVC。另外,如果管理员删除绑定到PVC的PV,则不会立即删除该PV;PV的去除被推迟,直到PV不再与PVC结合。

 


1.6回收策略

当用户处理完他们的卷时,他们可以从允许回收资源的API中删除PVC对象。PersistentVolume的回收策略告诉集群在释放卷的声明后该如何处理它。目前,卷可以被保留、回收或删除。



  • Retain (保留):保留回收策略允许手动回收资源。当PersistentVolumeClaim被删除时,PersistentVolume仍然存在,并且该卷被认为是“释放”的。但是,由于之前声明的数据仍然存在,因此另一个声明尚无法得到。管理员可以手动回收卷。

  • Delete (删除):对于支持Delete回收策略的卷插件,删除操作会同时从Kubernetes中删除PersistentVolume对象以及外部基础架构中的关联存储资产,例如AWS EBS,GCE PD,Azure Disk或Cinder卷。动态配置的卷将继承其StorageClass的回收策略,默认为Delete。管理员应根据用户的期望配置StorageClass。

  • Recycle (回收):如果基础卷插件支持,Recycle回收策略将rm -rf /thevolume/*对该卷执行基本的擦除并使其可用于新的声明。

 


2.PV类型

PersistentVolume类型作为插件实现。Kubernetes当前支持以下插件:

GCEPersistentDisk
AWSElasticBlockStore
AzureFile
AzureDisk
CSI
FC (Fibre Channel)
FlexVolume
Flocker
NFS
iSCSI
RBD (Ceph Block Device)
CephFS
Cinder (OpenStack block storage)
Glusterfs
VsphereVolume
Quobyte Volumes
HostPath (仅用于单节点测试——本地存储不受任何方式的支持,也不能在多节点集群中工作)
Portworx Volumes
ScaleIO Volumes
StorageOS

3.PV示例与参数说明

3.1PV示例

apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0003
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: slow
mountOptions:
- hard
- nfsvers=4.1
nfs:
path:
/tmp
server:
172.17.0.2

Capacity:通常,PV将具有特定的存储容量设置。当前,存储大小是可以设置或请求的唯一资源。将来的属性可能包括IOPS,吞吐量等。

volumeMode:可选参数,为Filesystem或Block。Filesystem是volumeMode省略参数时使用的默认模式。

accessModes:PersistentVolume可以通过资源提供者支持的任何方式安装在主机上。如下文表中所示,提供商将具有不同的功能,并且每个PV的访问模式都将设置为该特定卷支持的特定模式。例如,NFS可以支持多个读/写客户端,但是特定的NFS PV可能以只读方式在服务器上导出。每个PV都有自己的一组访问模式,用于描述该特定PV的功能。

访问方式为:



  • ReadWriteOnce-该卷可以被单个节点以读写方式挂载

  • ReadOnlyMany-该卷可以被许多节点以只读方式挂载

  • ReadWriteMany-该卷可以被多个节点以读写方式挂载

在CLI命令行中,访问模式缩写为:



  • RWO-ReadWriteOnce

  • ROX-ReadOnlyMany

  • RWX-ReadWriteMany

说明:一个卷一次只能使用一种访问模式挂载,即使它支持多种访问模式。

storageClassName:PV可以有一个类,通过将storageClassName属性设置为一个StorageClass的名称来指定这个类。特定类的PV只能绑定到请求该类的PVC。没有storageClassName的PV没有类,只能绑定到不请求特定类的PVC。

persistentVolumeReclaimPolicy:当前的回收政策是:Retain (保留)-手动回收、Recycle (回收)-基本擦除(rm -rf /thevolume/*)、Delete (删除)-删除相关的存储资产 (例如AWS EBS,GCE PD,Azure Disk或OpenStack Cinder卷)。

备注:当前,仅NFS和HostPath支持回收。AWS EBS,GCE PD,Azure Disk和Cinder卷支持删除。

 


3.2PV卷状态

卷将处于以下某种状态:



  • Available:尚未绑定到声明(claim)的空闲资源

  • Bound:卷已被声明绑定

  • Released:声明已被删除,但群集尚未回收该资源

  • Failed:该卷自动回收失败

CLI将显示绑定到PV的PVC的名称。

 


4.PV-PVC示例

4.1NFS服务部署

由于服务器有限,计划NFS服务端安装在k8s-master节点,NFS客户端安装在k8s-node节点

 1)所有机器操作

# 所需安装包
yum install nfs-utils rpcbind -y

2)NFS服务端k8s-master机器操作

[root@k8s-master ~]# mkdir -p /nfsdata/nfs1 /nfsdata/nfs2 /nfsdata/nfs3 /nfsdata/nfs4 /nfsdata/nfs5 /nfsdata/nfs6
[root@k8s-master ~]# chown -R nfsnobody.nfsnobody /nfsdata/
[root@k8s-master ~]# ll /nfsdata/
total 0
drwxr-xr-x 2 nfsnobody nfsnobody 6 Jun 14 16:30 nfs1
drwxr-xr-x 2 nfsnobody nfsnobody 6 Jun 14 16:30 nfs2
drwxr-xr-x 2 nfsnobody nfsnobody 6 Jun 14 16:30 nfs3
drwxr-xr-x 2 nfsnobody nfsnobody 6 Jun 14 16:30 nfs4
drwxr-xr-x 2 nfsnobody nfsnobody 6 Jun 14 16:30 nfs5
drwxr-xr-x 2 nfsnobody nfsnobody 6 Aug 22 16:25 nfs6
[root@k8s-master ~]# vim /etc/exports
/nfsdata/nfs1 10.3.104.0/21(rw,sync,root_squash,all_squash)
/nfsdata/nfs2 10.3.104.0/21(rw,sync,root_squash,all_squash)
/nfsdata/nfs3 10.3.104.0/21(rw,sync,root_squash,all_squash)
/nfsdata/nfs4 10.3.104.0/21(rw,sync,root_squash,all_squash)
/nfsdata/nfs5 10.3.104.0/21(rw,sync,root_squash,all_squash)
/nfsdata/nfs6 10.3.104.0/21(rw,sync,root_squash,all_squash)
### 启动NFS服务
[root@k8s-master ~]# systemctl start rpcbind.service
[root@k8s-master ~]# systemctl start nfs.service
### 检查NFS服务 , 其中 10.3.104.51 为服务端IP
[root@k8s-master ~]# showmount -e 10.3.104.51
Export list for 10.3.104.51:
/nfsdata/nfs6 10.3.104.0/21
/nfsdata/nfs5 10.3.104.0/21
/nfsdata/nfs4 10.3.104.0/21
/nfsdata/nfs3 10.3.104.0/21
/nfsdata/nfs2 10.3.104.0/21
/nfsdata/nfs1 10.3.104.0/21

3)NFS客户端验证

在k8s-node1机器验证

# rpcbind服务启动并加入开机自启动
[root@k8s
-node1 ~]# systemctl start rpcbind.service && systemctl enable rpcbind.service
# 查看NFS服务信息
[root@k8s
-node1 ~]# showmount -e 10.3.104.51
Export list
for 10.3.104.51:
/nfsdata/nfs6 10.3.104.0/21
/nfsdata/nfs5 10.3.104.0/21
/nfsdata/nfs4 10.3.104.0/21
/nfsdata/nfs3 10.3.104.0/21
/nfsdata/nfs2 10.3.104.0/21
/nfsdata/nfs1 10.3.104.0/21
# 挂载,并进行读写验证
[root@k8s
-node1 ~]# mount -t nfs 10.3.104.51:/nfsdata/nfs1 /mnt
[root@k8s
-node1 ~]# df -h | grep mnt
10.3.104.51:/nfsdata/nfs1 40G 13G 25G 34% /mnt
# 验证完毕,去掉NFS挂载
[root@k8s
-node1 ~]# umount -lf 10.3.104.51:/nfsdata/nfs1

 


4.2PV部署

1)yaml文件

[root@k8s-master pv-pvc]# pwd
/root/k8s_practice/pv-pvc
[root@k8s
-master pv-pvc]# cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv
-nfs1
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path:
/nfsdata/nfs1
server:
10.3.104.51
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv
-nfs2
spec:
capacity:
storage: 3Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path:
/nfsdata/nfs2
server:
10.3.104.51
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv
-nfs3
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: slow
nfs:
path:
/nfsdata/nfs3
server:
10.3.104.51
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv
-nfs4
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path:
/nfsdata/nfs4
server:
10.3.104.51
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv
-nfs5
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path:
/nfsdata/nfs5
server:
10.3.104.51
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv
-nfs6
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path:
/nfsdata/nfs6
server:
10.3.104.51

2)启动PV,并查看状态

[root@k8s-master pv-pvc]# kubectl apply -f pv.yaml
persistentvolume
/pv-nfs1 created
persistentvolume
/pv-nfs2 created
persistentvolume
/pv-nfs3 created
persistentvolume
/pv-nfs4 created
persistentvolume
/pv-nfs5 created
persistentvolume
/pv-nfs6 created
[root@k8s
-master pv-pvc]# kubectl get pv -o wide
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE
pv
-nfs1 1Gi RWO Recycle Available nfs 15s Filesystem
pv
-nfs2 3Gi RWO Recycle Available nfs 15s Filesystem
pv
-nfs3 5Gi RWO Recycle Available slow 15s Filesystem
pv
-nfs4 10Gi RWO Recycle Available nfs 15s Filesystem
pv
-nfs5 5Gi RWX Recycle Available nfs 15s Filesystem
pv
-nfs6 5Gi RWO Recycle Available nfs 15s Filesystem

 


4.3StatefulSet创建并使用PVC

StatefulSet 需要 headless 服务 来负责 Pod 的网络标识,因此需要负责创建此服务。

1)yaml文件

[root@k8s-master pv-pvc]# pwd
/root/k8s_practice/pv-pvc
[root@k8s
-master pv-pvc]# cat sts-pod-pvc.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps
/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # has to match .spec.template.metadata.labels
serviceName:
"nginx"
replicas:
3 # by default is 1
template:
metadata:
labels:
app: nginx # has to match .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds:
100
containers:
- name: nginx
image: registry.cn
-beijing.aliyuncs.com/google_registry/nginx:1.17
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath:
/usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [
"ReadWriteOnce" ]
storageClassName:
"nfs"
resources:
requests:
storage: 3Gi

2)启动pod并查看状态

[root@k8s-master pv-pvc]# kubectl apply -f sts-pod-pvc.yaml
service
/nginx created
statefulset.apps
/web created
[root@k8s
-master pv-pvc]# kubectl get svc -o wide
NAME TYPE CLUSTER
-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP
10.96.0.1 443/TCP 2d3h
nginx ClusterIP None
80/TCP 13s app=nginx
[root@k8s
-master pv-pvc]# kubectl get sts -o wide
NAME READY AGE CONTAINERS IMAGES
web
1/3 25s nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17
[root@k8s
-master pv-pvc]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web
-0 1/1 Running 0 37s 10.244.1.14 k8s-node1
web
-1 1/1 Running 0 23s 10.244.2.10 k8s-node2
web
-2 1/1 Running 0 5s 10.244.1.15 k8s-node1

 


4.4PV和PVC状态信息查看

[root@k8s-master pv-pvc]# kubectl get pv,pvc -o wide
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE
persistentvolume
/pv-nfs1 1Gi RWO Recycle Available nfs 5m32s Filesystem
persistentvolume
/pv-nfs2 3Gi RWO Recycle Bound default/www-web-0 nfs 5m32s Filesystem
persistentvolume
/pv-nfs3 5Gi RWO Recycle Available slow 5m32s Filesystem
persistentvolume
/pv-nfs4 10Gi RWO Recycle Bound default/www-web-2 nfs 5m32s Filesystem
persistentvolume
/pv-nfs5 5Gi RWX Recycle Available nfs 5m32s Filesystem
persistentvolume
/pv-nfs6 5Gi RWO Recycle Bound default/www-web-1 nfs 5m32s Filesystem
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE
persistentvolumeclaim
/www-web-0 Bound pv-nfs2 3Gi RWO nfs 106s Filesystem
persistentvolumeclaim
/www-web-1 Bound pv-nfs6 5Gi RWO nfs 92s Filesystem
persistentvolumeclaim
/www-web-2 Bound pv-nfs4 10Gi RWO nfs 74s Filesystem

 注:PVC与PV绑定时会根据storageClassName(存储类名称)和accessModes(访问模式)判断哪些PV符合绑定需求。然后再根据存储量大小判断,首先存PV储量必须大于或等于PVC声明量;其次就是PV存储量越接近PVC声明量,那么优先级就越高(PV量越小优先级越高)。


4.5curl访问验证

1)在NFS服务端k8s-master(10.3.104.51)对应NFS共享目录创建文件

[root@k8s-master pv-pvc]# echo "pv-nfs2===" > /nfsdata/nfs2/index.html
[root@k8s
-master pv-pvc]# echo "pv-nfs4+++" > /nfsdata/nfs4/index.html
[root@k8s
-master pv-pvc]# echo "pv-nfs6---" > /nfsdata/nfs6/index.html
[root@k8s
-master pv-pvc]# chown -R nfsnobody.nfsnobody /nfsdata/

2)curl访问pod

[root@k8s-master nfs2]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web
-0 1/1 Running 0 17m 10.244.1.14 k8s-node1
web
-1 1/1 Running 0 17m 10.244.2.10 k8s-node2
web
-2 1/1 Running 0 17m 10.244.1.15 k8s-node1
[root@k8s
-master nfs2]# curl 10.244.1.14
pv
-nfs2===
[root@k8s
-master nfs2]# curl 10.244.2.10
pv
-nfs6---
[root@k8s
-master nfs2]# curl 10.244.1.15
pv
-nfs4+++

即使删除其中一个pod,pod被拉起来后也能正常访问。

 


4.6删除sts并回收PV

1)删除statefulset

[root@k8s-master pv-pvc]# kubectl delete -f sts-pod-pvc.yaml
service
"nginx" deleted
statefulset.apps
"web" deleted
[root@k8s
-master pv-pvc]# kubectl get pod -o wide
No resources found
in default namespace.

 2)查看PVC和PV,并删除PVC

[root@k8s-master pv-pvc]# kubectl get pvc -o wide
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE
www
-web-0 Bound pv-nfs2 3Gi RWO nfs 43m Filesystem
www
-web-1 Bound pv-nfs6 5Gi RWO nfs 43m Filesystem
www
-web-2 Bound pv-nfs4 10Gi RWO nfs 43m Filesystem
[root@k8s
-master pv-pvc]# kubectl get pv -o wide
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE
pv
-nfs1 1Gi RWO Recycle Available nfs 47m Filesystem
pv
-nfs2 3Gi RWO Recycle Bound default/www-web-0 nfs 47m Filesystem
pv
-nfs3 5Gi RWO Recycle Available slow 47m Filesystem
pv
-nfs4 10Gi RWO Recycle Bound default/www-web-2 nfs 47m Filesystem
pv
-nfs5 5Gi RWX Recycle Available nfs 47m Filesystem
pv
-nfs6 5Gi RWO Recycle Bound default/www-web-1 nfs 47m Filesystem
[root@k8s
-master pv-pvc]# kubectl delete pvc www-web-0 www-web-1 www-web-2
persistentvolumeclaim
"www-web-0" deleted
persistentvolumeclaim
"www-web-1" deleted
persistentvolumeclaim
"www-web-2" deleted

 3)回收PV

### 由下可见,还有一个pv虽然声明被删除,但资源尚未回收;我们只需等一会儿即可
[root@k8s
-master pv-pvc]# kubectl get pv -o wide
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE
pv
-nfs1 1Gi RWO Recycle Available nfs 90m Filesystem
pv
-nfs2 3Gi RWO Recycle Available nfs 90m Filesystem
pv
-nfs3 5Gi RWO Recycle Available slow 90m Filesystem
pv
-nfs4 10Gi RWO Recycle Available nfs 90m Filesystem
pv
-nfs5 5Gi RWX Recycle Available nfs 90m Filesystem
pv
-nfs6 5Gi RWO Recycle Released default/www-web-1 nfs 90m Filesystem
[root@k8s
-master pv-pvc]#
### 可见该pv还有引用
[root@k8s
-master pv-pvc]# kubectl get pv pv-nfs6 -o yaml
apiVersion: v1
kind: PersistentVolume
metadata:
………………
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 5Gi
################### 可见仍然在被使用
claimRef:
apiVersion: v1
kind: PersistentVolumeClaim
name: www
-web-1
namespace: default
resourceVersion:
"1179810"
uid: d4d8943c
-6b16-45a5-8ffc-691fcefc4f88
###################
nfs:
path:
/data/nfs6
server:
172.16.1.113
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
volumeMode: Filesystem
status:
phase: Released

4)在NFS服务端查看结果如下,可见/data/nfs6资源尚未回收,而/data/nfs2/、/data/nfs4/资源已经被回收。

[root@k8s-node03 ~]# tree /data/
/data/
├── nfs1
├── nfs2
├── nfs3
├── nfs4
├── nfs5
└── nfs6
└── index.html
5 directories, 2 files

针对这种情况有两种处理方式:

1、我们什么也不用做,等一会儿集群就能回收该资源

2、我们进行手动回收,操作如下

手动回收资源

[root@k8s-master pv-pvc]# kubectl edit pv pv-nfs6
### 去掉claimRef: 部分
### 再次查看pv信息
[root@k8s
-master pv-pvc]# kubectl get pv -o wide
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE
pv
-nfs1 1Gi RWO Recycle Available nfs 108m Filesystem
pv
-nfs2 3Gi RWO Recycle Available nfs 108m Filesystem
pv
-nfs3 5Gi RWO Recycle Available slow 108m Filesystem
pv
-nfs4 10Gi RWO Recycle Available nfs 108m Filesystem
pv
-nfs5 5Gi RWX Recycle Available nfs 108m Filesystem
pv
-nfs6 5Gi RWO Recycle Available nfs 108m Filesystem

 之后到NFS服务端操作,清除该pv下的数据

[root@k8s-node03 ~]# rm -fr /data/nfs6/*

到此,手动回收资源操作成功!

 


5.StatefulSet网络标识与PVC

1、匹配StatefulSet的Pod name(网络标识)的模式为:$(statefulset名称)-$(序号),比如StatefulSet名称为web,副本数为3。则为:web-0、web-1、web-2

2、StatefulSet为每个Pod副本创建了一个DNS域名,这个域名的格式为:$(podname).(headless service name),也就意味着服务之间是通过Pod域名来通信而非Pod IP。当Pod所在Node发生故障时,Pod会被漂移到其他Node上,Pod IP会发生改变,但Pod域名不会变化

3、StatefulSet使用Headless服务来控制Pod的域名,这个Headless服务域名的为:$(service name).$(namespace).svc.cluster.local,其中 cluster.local 指定的集群的域名

4、根据volumeClaimTemplates,为每个Pod创建一个PVC,PVC的命令规则为:$(volumeClaimTemplates name)-$(pod name),比如volumeClaimTemplates为www,pod name为web-0、web-1、web-2;那么创建出来的PVC为:www-web-0、www-web-1、www-web-2

5、删除Pod不会删除对应的PVC,手动删除PVC将自动释放PV。

 

作者:杰宏唯一

出处:http://www.cnblogs.com/wuxinchun/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.



推荐阅读
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 在API测试中,我们常常需要通过大量不同的数据集(包括正常和异常情况)来验证同一个接口。如果为每种场景单独编写测试用例,不仅繁琐而且效率低下。采用数据驱动的方式可以有效简化这一过程。本文将详细介绍如何利用CSV文件进行数据驱动的API测试。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 如何在窗口右下角添加调整大小的手柄
    本文探讨了如何在传统MFC/Win32 API编程中实现类似C# WinForms中的SizeGrip功能,即在窗口的右下角显示一个用于调整窗口大小的手柄。我们将介绍具体的实现方法和相关API。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • ServiceStack与Swagger的无缝集成指南
    本文详细介绍了如何在ServiceStack项目中集成Swagger,以实现API文档的自动生成和在线测试。通过本指南,您将了解从配置到部署的完整流程,并掌握如何优化API接口的开发和维护。 ... [详细]
  • 本文探讨了如何优化和正确配置Kafka Streams应用程序以确保准确的状态存储查询。通过调整配置参数和代码逻辑,可以有效解决数据不一致的问题。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • Google最新推出的嵌入AI技术的便携式相机Clips现已上架,旨在通过人工智能技术自动捕捉用户生活中值得纪念的时刻,帮助人们减少照片数量过多的问题。 ... [详细]
  • 本文详细介绍了Java中的访问器(getter)和修改器(setter),探讨了它们在保护数据完整性、增强代码可维护性方面的重要作用。通过具体示例,展示了如何正确使用这些方法来控制类属性的访问和更新。 ... [详细]
  • 本文介绍了如何使用PHP代码实现微信平台的媒体素材上传功能,详细解释了API接口的使用方法和注意事项,确保文件路径正确以避免常见的错误。 ... [详细]
  • 本文详细介绍了 MySQL 的查询处理流程,包括从客户端连接到服务器、查询缓存检查、语句解析、查询优化及执行等步骤。同时,深入探讨了 MySQL 中的乐观锁机制及其在并发控制中的应用。 ... [详细]
  • 在使用 MUI 框架进行应用开发时,开发者常常会遇到 mui.init() 和 mui.plusReady() 这两个方法。本文将详细解释它们的区别及其在不同开发环境下的应用。 ... [详细]
author-avatar
手机用户2702932807
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有