很多细节还是要注意的,多熟悉才好,猛然发现自己的第九章记录被转载到了https://www.pianshen.com/article/78591186436/,有点小开森~
文字版课程:https://edu.aliyun.com/lesson_1651_18358?spm=5176.10731542.0.0.54e320be5jeffr#_18358
之前记录的笔记,有前辈说我复制了文字版的课程,我尝试改进下,将自己关注的点总结出来
存储快照
- k8s通过csi snapshotter controller实现存储快照
- 流程:用户通过volumesnapshot对象来声明,指定volumesnapshotclass对象,然后集群中的controller生产volumesnapshotcontent
利用存储快照恢复数据
- 通过yaml文件,将.spec.dataSource指定为VolumeSnapshot对象,然后根据pvc生成pv,数据通过volumesnapshotcontent恢复。
拓扑
- 基本概念:管理的nodes划分的一种位置关系
- region:标记nodes属于哪个地区
- zone:available zone,标识跨zone的nodes属于哪个可用区
- hostname:单机维度
存储拓扑调度
- k8s创建pod的流程和创建pv的流程,并行独立
- 需要保障pod最后运行的node,可以访问到存储
- 解决方案
- pod调度结果出来后,根据pod的拓扑动态创建pv
- kube-scheduler为pod选择node节点时,需要考虑pv的nodeAffinity
- 具体例子1
- 当用户开始提交 PVC 的时候,pv controller 在看到这个 pvc 的时候,它会找到相应的 storageClass,发现这个 BindingMode 是延迟绑定,它就不会做任何事情。
- 之后当真正使用这个 pvc 的 pod,在调度的时候,当它恰好调度在符合 pv nodeaffinity 的 node 的上面后,这个 pod 里面所使用的 PVC 才会真正地与 PV 做绑定,这样就保证我 pod 调度到这台 node 上之后,这个 PVC 才与这个 PV 绑定,最终保证的是创建出来的 pod 能访问这块 Local PV
- 具体例子2
- 在动态创建 PV 的时候,创建出来的 PV 必须是在这个可用区可以访问的;
- 因为声明的是延迟绑定,那调度器在发现使用它的 PVC 正好对应的是该 storageclass 的时候,调度 pod 就要选择位于该可用区的 nodes。
相关命令
- kubectl get volumesnapcontent
- storageclass 指定BindingMode 为 WaitForFirstConsumer
csi如何实现存储扩展
- K8s 社区推动实现的 csi controller 部分,也就是这里的 csi-snapshottor controller 以及 csi-provisioner controller,这些主要是通用的 controller 部分;
- 由特定的云存储厂商用自身 OpenAPI 实现的不同的 csi-plugin 部分,也叫存储的 driver 部分。
测试题目
https://gitchat.csdn.net/columnTopic/5d8b062b49b2b1063b5594b4
1.使用存储快照功能需要用到哪些 Kubernetes API 资源对象?(多选题)ABCD
- A. VolumeSnapshot
- B. VolumeSnapshotClass
- C. VolumeSnapshotContent
- D. PersistentVolumeClaim
2.Kubernetes 中基于 CSI 实现存储快照(snapshot&restore)功能需要的组件有?(多选题)ABCD
- A. Kubernetes csi-snapshotter Controller
- B. 云存储厂商基于存储快照的 OpenAPI 实现的 Driver: Kubernetes csi-snapshotter GRPC server
- C. Kubernetes csi-provisioner Controller
- D. 云存储厂商基于存储快照 create 存储的 OpenAPI 实现的 Driver: Kubernetes csi-provisioner GRPC server
3.下列有关使用存储拓扑调度时对 StorageClass 的配置正确的有?(多选题)ABC
- A. 需要通过设置 .volumeBindingMode: WaitForFirstConsumer 来声明 PVC 延时处理
- B. 可以通过 .allowedTopologies 限制动态生成的 PV 的拓扑限制,拓扑限制会写到动态生成的 PV .spec.nodeAffinity中
- C. 可以干预哪些需要使用该 StorageClass 动态生成 PV 对象的 PVC 的使用方 Pod 的可调度的 Node
4.Kubernetes csi-snapshotter Controller 中实现的功能包括?(多选题)ABC
- A. watch VolumeSnapshot&&VolumeSnapshotContent 等 API 资源对象变化
- B. 根据 VolumeSnapshot API 资源对象声明调用相应云存储 Driver(即 csi-snapshotter GRPC server)创建快照,并生成 VolumeSnapshotContent
- C. bind VolumeSnapshot and VolumeSnapshotContent
- D. 根据存储快照 restore 数据到新的 PV 对象中
5.Kubernetes 中 Node 的拓扑信息记录在哪里?(单选题)B
- A. .metadata.annotations
- B. .metadata.labels
6.在 Kubernetes 中使用自定义的拓扑(如 rack, foo, bar)是否需要相关组件做修改?(单选题)B
- A. 是
- B. 否
7.可以限制 PV 对象可被访问拓扑位置限制的地方?(多选题) AB
- A. StorageClass: .allowedTopologies
- B. PV: .spec.nodeAffinity
- C. Node: .metadata.labels
8.下列有关如何使用存储拓扑调度的说法正确的有?(多选题) ABCD
- A. 声明 delay binding 的 StorageClass 对象(.volumeBindingMode=WaitForFirstConsumer)
- B. PVC 对象 .spec.storageClassName 指定为声明了 delay binding 的 StorageClass 对象
- C. 在静态(预)创建的 PV 上的 .spec.nodeAffinity 添加对使用该 PV 的 Pod 所在 Node 拓扑限制
- D. 在需要动态创建的 PV 所使用的 StorageClass 的 .allowedTopologies 中限制动态创建的存储能被使用的拓扑限制
9.Kubernetes 中为了支持存储拓扑调度相关组件做的改变有?(多选题)ABC
- A. PersistentVolumeController 支持 PVC 与 PV 的 delay binding
- B. 动态创建 PV 的 csi-provisioner 支持将第一个使用 PV 的 Pod 待运行 Node 的拓扑信息以及 StorageClass .allowedTopologies 传递给创建存储的 Driver
- C. Kube-Scheduler 结合 Pod 使用的 PVCs,预分配的 PV Node Affinity 以及 StorageClass .allowedTopologies 选择合适的Node
10.下面在 Kube-Scheduler 中结合 Pod 中声明的 PVCs 选择 Node 过程描述正确的有?(单选题) C
- A. Pod 中已经 Bound 的 PVCs 在 Kube-Scheduler 不做处理
- B. Pod 中所有 UnBound 的 PVCs 会先找到能匹配的 PV 列表,并 check PV 的 NodeAffinity 与 Node Labals 中的拓扑信息是否匹配
- C. Pod 中需要 Dynamic Provisioning PV 的 PVCs,check StorageClass .allowedTopologies 与 Node Labals 中的拓扑信息是否匹配