ToB企服应用市场:ToB评测及商务社交产业平台

标题: 当创建pvc后,kubernetes组件如何协作 [打印本页]

作者: 万有斥力    时间: 2024-3-27 20:18
标题: 当创建pvc后,kubernetes组件如何协作
本文分享自华为云社区《当创建一个pvc后,kubernetes会发生什么?》,作者:可以交个朋友。
一、背景

外部存储接入 Kubernetes 的方式主要有两种:In-Tree 和 Out-of-Tree:
外部存储最终的效果是将存储(磁盘、obs、nas盘等)挂载到容器中被业务使用,所以一般包括存在两个过程:
二、CSI 架构解读

kubernetes CSI存储插件的关键组件与推荐的容器化部署架构

三、动态创建 Volume 执行过程

以块类型存储为例,从声明pvc到pod挂载卷成功时序图:

1、涉及组件解读


2、涉及资源解读

PV:PersistentVolume,集群级别的资源,由集群管理员 or External Provisioner创建。PV 的生命周期独立于使用 PV 的 Pod,PV 的 .Spec 中保存了存储设备的详细信息。
  1. kind: PersistentVolume
  2. apiVersion: v1
  3. metadata:
  4.   name: pv-test
  5.   labels:
  6.     failure-domain.beta.kubernetes.io/region: cn-north-4
  7.     failure-domain.beta.kubernetes.io/zone: cn-north-4a
  8.   annotations:
  9.     pv.kubernetes.io/provisioned-by: xxxx-provisioner #存储提供者
  10. spec:
  11.   capacity:
  12.     storage: 10Gi
  13.   csi:
  14.     driver: disk.csi.everest.io
  15.     volumeHandle: 698a99d8-xxx-xxxx-xxxx-ab80b1ecbf #使用的存储设备信息
  16. volumeAttributes:
  17.       everest.io/disk-mode: SCSI
  18.       everest.io/disk-volume-type: ESSD
  19.       storage.kubernetes.io/csiProvisionerIdentity: xxxx-provisioner
  20.   accessModes:
  21.     - ReadWriteOnce
  22.   # 引用对象, 该pv由哪个pvc创建
  23.   claimRef:
  24.     kind: PersistentVolumeClaim
  25.     namespace: test
  26.     name: pvc-test
  27.     uid: xxxx-xxxx-xxxx-22bf9101f0ce
  28.     apiVersion: v1
  29.   persistentVolumeReclaimPolicy: Delete
  30.   storageClassName: csi-disk
  31.   volumeMode: Filesystem
  32.   nodeAffinity:
  33.     required:
  34.       nodeSelectorTerms:
  35.         - matchExpressions:
  36.             - key: failure-domain.beta.kubernetes.io/zone
  37.               operator: In
  38.               values:
  39.                 - cn-north-4a
  40. status:
  41.   phase: Bound
  42.   # available : 表示当前的pv没有被绑定
  43.   # bound:      已经被pvc挂载
  44.   # released:   pvc没有在使用pv, 需要管理员手工释放pv
  45.   # failed:    资源回收失败
复制代码
  1. kind: PersistentVolumeClaim
  2. apiVersion: v1
  3. metadata:
  4.   name: pvc-evs-test
  5.   namespace: test
  6.   uid: xxxx-xxxx-xxxx-22bf9101f0ce
  7.   labels:
  8.     failure-domain.beta.kubernetes.io/region: cn-north-4
  9.     failure-domain.beta.kubernetes.io/zone: cn-north-4a
  10.   annotations:
  11.     volume.kubernetes.io/selected-node: xxx.xxx.xxx.186
  12.     everest.io/disk-volume-type: ESSD
  13.     volume.kubernetes.io/storage-provisioner: xxxx-provisioner
  14. spec:
  15.   # ReadWriteOnce:被单个节点mount为读写rw模式
  16.   # ReadOnlyMany  被多个节点mount为只读ro模式
  17.   # ReadWriteMany 被多个节点mount为读写rw模式
  18.   accessModes:
  19.     - ReadWriteOnce
  20.   resources:
  21.     requests:
  22.       storage: 10Gi
  23.   volumeName: pv-test #绑定的pv name
  24.   # 使用的sc类型
  25.   storageClassName: csi-disk
  26.   # 存储模式,包含Filesystem(文件系统)和Block(块设备)
  27.   volumeMode: Filesystem
  28. status:
  29.   # Pending:pvc刚创建还未与pv绑定
  30.   # Bound: pvc与pv完成绑定
  31.   # Lost:对应的pv被删除
  32.   phase: Bound
  33.   accessModes:
  34.     - ReadWriteOnce
复制代码
  1. apiVersion: storage.k8s.io/v1
  2. kind: StorageClass
  3. metadata:
  4.   name: csi-disk
  5. parameters:
  6.   csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io
  7.   csi.storage.k8s.io/fstype: ext4
  8.   everest.io/disk-volume-type: SATA
  9.   everest.io/passthrough: "true"
  10. provisioner: xxxx-provisioner
  11. # 回收策略, pvc和pv解绑,删除了pvc, pv里面的数据是否还保留
  12. # Retain: 保留数据, 需要手工删除
  13. # delete: pv删除
  14. reclaimPolicy: Delete
  15. # Immediate: pv创建好之后立马将pvc和pv进行绑定
  16. # WaitForFirstConsumer: 延迟绑定,直到使用pvc的pod被调度到节点上
  17. volumeBindingMode: Immediate
  18. allowVolumeExpansion: true #是否允许扩容
复制代码
3、涉及 CSI API 对象

CSINode
  1. apiVersion: storage.k8s.io/v1
  2. kind: CSINode
  3. metadata:
  4.   annotations:
  5.     everest.io/node.localvolume.capacity: "null"
  6.   name: xxx.xxx.xxx.186
  7.   ownerReferences:
  8.   - apiVersion: v1
  9.     kind: Node
  10.     name: xxx.xxx.xxx.186
  11.     uid: 091cc415-b8bb-4173-8312-5f6318d4383f
  12.   uid: fea2c180-99b8-4195-a966-3953b8bab16a
  13. spec:
  14.   # 节点上有哪些driver
  15.   drivers:
  16.   - allocatable:
  17.       count: 58
  18.     name: disk.csi.everest.io
  19.     nodeID: 7d279bf8-c70f-4179-842e-5e501d591d17
  20.     topologyKeys:
  21.     - failure-domain.beta.kubernetes.io/zone
  22.   - name: proxy.csi.everest.io
  23.     nodeID: 7d279bf8-c70f-4179-842e-5e501d591d17
  24.     topologyKeys: null
  25.   - name: sfsturbo.csi.everest.io
  26.     nodeID: 7d279bf8-c70f-4179-842e-5e501d591d17
  27.     topologyKeys: null
  28.   - name: nas.csi.everest.io
  29.     nodeID: 7d279bf8-c70f-4179-842e-5e501d591d17
  30.     topologyKeys: null
  31.     ...
  32. apiVersion: storage.k8s.io/v1
  33. kind: CSINode
  34. metadata:
  35.   annotations:
  36.     everest.io/node.localvolume.capacity: "null"
  37.   name: xxx.xxx.xxx.186
  38.   ownerReferences:
  39.   - apiVersion: v1
  40.     kind: Node
  41.     name: xxx.xxx.xxx.186
  42.     uid: 091cc415-b8bb-4173-8312-5f6318d4383f
  43.   uid: fea2c180-99b8-4195-a966-3953b8bab16a
  44. spec:
  45.   # 节点上有哪些driver
  46.   drivers:
  47.   - allocatable:
  48.       count: 58
  49.     name: disk.csi.everest.io
  50.     nodeID: 7d279bf8-c70f-4179-842e-5e501d591d17
  51.     topologyKeys:
  52.     - failure-domain.beta.kubernetes.io/zone
  53.   - name: proxy.csi.everest.io
  54.     nodeID: 7d279bf8-c70f-4179-842e-5e501d591d17
  55.     topologyKeys: null
  56.   - name: sfsturbo.csi.everest.io
  57.     nodeID: 7d279bf8-c70f-4179-842e-5e501d591d17
  58.     topologyKeys: null
  59.   - name: nas.csi.everest.io
  60.     nodeID: 7d279bf8-c70f-4179-842e-5e501d591d17
  61.     topologyKeys: null
  62.     ...
复制代码
CSIDriver
  1. apiVersion: storage.k8s.io/v1
  2. kind: CSIDriver
  3. metadata:
  4.   name: disk.csi.everest.io
  5.   uid: 5d33a29b-4bf1-4ab8-815f-e97b207b991e
  6. spec:
  7.   # 是否需要attache和mount,只有evs需要attach
  8.   attachRequired: true
  9.   podInfoOnMount: true
  10.   requiresRepublish: false
  11.   storageCapacity: false
  12.   volumeLifecycleModes:
  13.   - Persistent   #volume生命周期,持久模式
复制代码
VolumeAttachment
AD Controller 创建一个 VolumeAttachment,而 External-attacher 则通过观察该 VolumeAttachment,根据其状态属性来进行存储的挂载和卸载操作。
  1. apiVersion: storage.k8s.io/v1
  2. kind: VolumeAttachment
  3. metadata:
  4.   annotations:
  5.     csi.alpha.kubernetes.io/node-id: xxxx-xxxx-xxxx-5e501d591d17
  6.   finalizers:
  7.   - everest-csi-attacher/disk-csi-everest-io
  8.   name: csi-d10b9f7e4dde469fa2b7f3461fcfef7862260883196647d6b7ae7bb17bc0e226
  9.   uid: 665b740f-a544-4f3e-9953-00b8d186c548
  10. spec:
  11.   attacher: disk.csi.everest.io
  12.   nodeName:xxx.xxx.xxx.186
  13.   source:
  14.     persistentVolumeName: pv-test
  15. status:
  16.   # 标记是否attached到节点上,attache后才能mount
  17.   attached: true
  18.   attachmentMetadata: #attach的设备信息
  19.     bus: scsi
  20.     device: /dev/sdg
复制代码
四、存储拓展-延迟绑定

kubernetes里面有两个绑定:
stroageclass延迟绑定作用字段:VolumeBindingMode
 
点击关注,第一时间了解华为云新鲜技术~
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4