kubernetes-PV与PVC 的关系与绑定的条件

PV :声明这个资源是一个持久卷 (PV)。

PVC:声明这个资源是一个持久卷声明 (PVC)。

创建yaml配置

apiVersion: v1
kind: PersistentVolume  #PV是集群中的一块存储,可以由PVC请求并使用。-虚拟存储 - 实体机的存储、不是容器中的存储
metadata:
  name: postgresql-pv  
  namespace: ops-system
spec:
  storageClassName: nfs   #指定了与此PV关联的存储类(StorageClass)是nfs
  accessModes:            #这定义了PV可以被如何访问
    - ReadWriteMany       #表示该PV可以被多个节点以读写模式同时访问。
  capacity:               #这定义了PV的存储容量。
    storage: 200Mi        #指定了该PV的存储容量为200兆字节。- 可通过此属性来被PVC绑定
  nfs:                                #定义了NFS(网络文件系统)的具体配置
    path: /vol/nfsshare/kong/data     #这是NFS服务器上的共享目录的路径,Kubernetes节点将挂载这个目录来访问存储。
    server: 192.168.19.3              #这是NFS服务器的IP地址
---
#PVC是用户对存储资源的请求,当PVC被创建后,Kubernetes会尝试找到一个与之匹配的PersistentVolume(PV)来绑定
#如果没有创建PV PVC也会通过StorageClass 动态的创建PV
#当 PVC 和 PV 成功绑定后,PVC 可以被应用(Pod)使用。应用程序通过 PVC 挂载存储卷,获取持久存储空间
apiVersion: v1    #指定了Kubernetes API的版本,用于该资源定义
kind: PersistentVolumeClaim   #PVC是用户对存储资源的请求,当创建PVC后,Kubernetes将尝试找到一个匹配的PV来满足这个请求 - -虚拟存储 - 实体机的存储、不是容器中的存储
metadata:
  name: postgresql-pvc    
  namespace: ops-system
spec:
  storageClassName: nfs   #这指定了PVC应该使用哪个StorageClass。在这里,它指定了nfs,意味着这个PVC希望与一个基于NFS的PV进行绑定。
  accessModes:            #这定义了PVC可以如何访问存储资源。
    - ReadWriteMany       #表示这个PVC希望PV支持多个节点以读写模式同时访问。
  resources:              #这定义了PVC对存储资源的需求。
    requests:             #指定了PVC请求的存储资源的大小
      storage: 200Mi      #此属性会去找相同大小的 200Mi PV绑定
  
#一旦这个PVC被创建,Kubernetes将尝试找到一个与之匹配的PV(在这个例子中,可能是一个名为postgresql-pv的PV,其规格storage:200Mi 与这个PVC相匹配)并进行绑定。
#如果找到了匹配的PV,那么这个PV的存储资源就可以被使用这个PVC的Pod所使用。如果没有找到匹配的PV,PVC将保持未绑定状态,直到有匹配的PV可用为止
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: iam-pv
  namespace: ops-system
spec:
  storageClassName: nfs
  accessModes:
    - ReadWriteMany
  capacity:
    storage: 100Mi
  nfs:
    path: /vol/nfsshare/iam/assets
    server: 192.168.19.3
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: iam-pvc
  namespace: ops-system
spec:
  storageClassName: nfs
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Mi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: lap-pv
  namespace: ops-system
spec:
  storageClassName: nfs
  accessModes:
    - ReadWriteMany
  capacity:
    storage: 1Gi
  nfs:
    path: /vol/nfsshare/lap/uploads
    server: 192.168.19.3
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: lap-pvc
  namespace: ops-system
spec:
  storageClassName: nfs
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: ops-manage-pv
  namespace: ops-system
spec:
  storageClassName: nfs
  accessModes:
    - ReadWriteMany
  capacity:
    storage: 50Gi
  nfs:
    path: /vol/nfsshare/ops-manage/key_cfg_compare
    server: 192.168.19.3
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ops-manage-pvc
  namespace: ops-system
spec:
  storageClassName: nfs
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 50Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: ops-ledger-pv
  namespace: ops-system
spec:
  storageClassName: nfs
  accessModes:
    - ReadWriteMany
  capacity:
    storage: 2Gi
  nfs:
    path: /vol/nfsshare/ops-ledger/images
    server: 192.168.19.3
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ops-ledger-pvc
  namespace: ops-system
spec:
  storageClassName: nfs
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 2Gi

聊聊 PVC 是如何绑定 PV的

# PVC 是通过以下几个属性与 PV 绑定的:
# 1、storageClassName
- PVC 和 PV 的 storageClassName 必须匹配。这决定了 PVC 会优先匹配到哪些 PV。这里,PVC 和 PV 都使用了 nfs 作为 storageClassName。
- spec:
  storageClassName: nfs
  
# 2、accessModes
- PVC 的 accessModes 必须是 PV accessModes 的一个子集。换句话说,PVC 请求的访问模式必须被 PV 支持
- spec:
  accessModes:
    - ReadWriteMany
    
# 3、requests 和 capacity
- PVC 请求的 storage 容量必须小于或等于 PV 提供的 capacity。这里,PVC 请求了 100 MiB,恰好等于 PV 提供的 100 MiB
- spec:
  resources:
    requests:
      storage: 100Mi
      
# 总结机制:
#PVC 和 PV 的绑定是基于对存储资源需求和供应的属性匹配。以下是主要的匹配属性:
容量匹配: PV 的 capacity 必须至少等于 PVC 请求的存储量。
访问模式: PV 和 PVC 必须有兼容的 accessModes。
StorageClass: PVC 和 PV 必须有匹配的 storageClassName。
标签选择器: PVC 可以使用标签选择器来精确匹配特定的 PV。
绑定状态: 只有状态为 Available 的 PV 才会被考虑用于绑定。
动态供应: 当 PVC 没有找到匹配的 PV 时,如果指定了 storageClassName,Kubernetes 可以动态创建一个符合需求的 PV。

PV 和 PVC 的绑定机制

##当 PVC 被创建时,Kubernetes 控制器会自动查找匹配的 PV。它会按照以下规则进行匹配:
- 查找具有相同 storageClassName 的 PV。
- 检查 accessModes 是否兼容。
- 确保 capacity 能够满足 PVC 的 requests。
- 如果找到合适的 PV,Kubernetes 会自动将这个 PV 和 PVC 绑定起来。

#绑定信息的体现:
- 当 PV 和 PVC 成功绑定后,PV 的 status.phase 会更新为 Bound,PVC 的 status.phase 也会更新为 Bound。

 

总结

PersistentVolume (PV) 定义了一个持久化存储资源,可以是 NFS、云存储或本地存储等。
PersistentVolumeClaim (PVC) 是对存储资源的请求,PVC 通过 storageClassName、accessModes 和 resources.requests 等属性与 PV 匹配和绑定。
PVC 创建后,Kubernetes 控制器会自动查找和绑定合适的 PV,使得应用程序可以通过 PVC 访问底层的持久存储资源。
这种机制使得存储的配置和使用变得灵活,并且能够在不同的环境中保持一致,极大地提高了 Kubernetes 集群中持久化存储的管理效率。

 

posted @ 2024-06-13 22:45  little小新  阅读(59)  评论(0编辑  收藏  举报