「 Velero 」源码走读 — Plugin
based on v1.6.3
ObjectStore
pkg/plugin/velero/object_store.go
Velero 无该内置类型的 plugin,具体参考 velero-plugin-for-aws、velero-plugin-for-microsoft-azure、 velero-plugin-for-gcp。
ObjectStore 包含以下接口
Init
初始化 Object
如果接口返回 error,BackupStorageLocation Controller 则无法调用 IsValid 判断 Provider 的可用性PutObject
上传 key(io.Reader)到 Provider 中
ObjectExists
判断 key 在 Provider 中是否存在
GetObject
获取 key 的内容(io.ReadCloser)
Velero 会在调用后负责 Close 该 io 操作,无需 plugin 操作ListCommonPrefixes
获取满足给定公共前缀的所有 key
ListObjects
获取满足给定前缀的所有 key
DeleteObject
删除 Provider 中的指定 key
仅会删除 key 本身,如果对于文件存储类型的 Provider,需要在 plugin 中实现删除最后一个 key 时,同时删除目录的功能CreateSignedURL
生成具有过期时间的 pre-signed url,用于获取 Provider 中的文件
对于文件存储类型等不具备提供对外服务的 Provider,该接口需要有其他服务支撑
VolumeSnapshotter
pkg/plugin/velero/volume_snapshotter.go
Velero 无该内置类型的 plugin,具体参考 velero-plugin-for-aws、velero-plugin-for-microsoft-azure、 velero-plugin-for-gcp。
VolumeSnapshotter 包含以下接口
Init
初始化 VolumeSnapshotshotter
CreateVolumeFromSnapshot
根据指定的 zone、IOPS 信息从快照恢复卷
Velero 创建卷的动作为同步处理,会一直等待,直至完成或者失败
GetVolumeID
根据指定的 PV 获取 VolumeID
SetVolumeID
对指定的 PV 设置 VolumeID
GetVolumeInfo
获取 Volume 信息
CreateSnapshot
对指定的卷创建快照
Velero 创建 PV 快照的动作为同步处理,会一直等待,直至完成或者失败DeleteSnapshot
删除快照
DeleteItemAction
pkg/plugin/velero/delete_item_action.go
Velero 无该内置类型的 plugin。
DeleteItemAction 包含以下接口
AppliesTo
返回应该对哪些资源执行额外操作(通过 Included/Excluded Namespaces/Resources 实现),结果会由 Execute 处理执行额外操作
Execute
根据自定义的逻辑判断是否要对函数入参 Item(即符合 AppliesTo 过滤后的资源对象)在删除 Backup 时,执行一些额外的操作
BackupItemAction
pkg/plugin/velero/backup_item_action.go
BackupItemAction 包含以下接口
AppliesTo
返回应该对哪些资源执行额外操作(通过 Included/Excluded Namespaces/Resources 实现),该过滤结果会和 Backup 本身的过滤取交集,结果会由 Execute 处理执行额外操作
Execute
根据自定义的逻辑判断是否要对函数入参 Item(即符合 AppliesTo 过滤后的资源对象)做额外操作,函数会返回两个核心内容
- 更新后的 item,此后的流程会以此 item 为基准
- 需要额外操作的对象,会加入此后备份流程中执行备份
velero.io/pv
pkg/backup/backup_pv_action.go
AppliesTo
IncludedResources: persistentvolumeclaims
Execute
- PVC item 未更新
- 获取 PVC 绑定的 PV 作为额外操作的对象返回
velero.io/pod
pkg/backup/pod_action.go
AppliesTo
IncludedResources: pods
Execute
- Pod item 未更新
- 获取 Pod 中使用的 PVC 作为额外操作的对象返回
velero.io/service-account
pkg/backup/service_account_action.go
AppliesTo
IncludedResources: serviceaccounts
Execute
- Service Account item 未更新
- 获取 Service Account 关联的 ClusterRole 和 ClusterRoleBinding 作为额外操作的对象返回
velero.io/crd-remap-version
pkg/backup/remap_crd_version_action
AppliesTo
IncludedResources: customresourcedefinition.apiextensions.k8s.io
Execute
- 如果 CRD 的 apiVersion 为 apiextensions.k8s.io/v1,并且如果是单一版本的 CRD,或者存在位解构的字段或者预留字段时,则将 v1 版本的 CRD item 转换为 v1beta1 版本,并返回
参考:https://kubernetes.io/zh/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions - 无额外操作的对象
RestoreItemAction
pkg/plugin/velero/restore_item_action.go
RestoreItemAction 包含以下接口
AppliesTo
返回应该对哪些资源执行额外操作(通过 Included/Excluded Namespaces/Resources 实现),该过滤结果会和 Restore 本身的过滤取交集,结果会由 Execute 处理执行额外操作
Execute
根据自定义的逻辑判断是否要对 Item(即符合 AppliesTo 过滤后的资源对象)做额外操作,函数会返回三个核心内容
- 更新后的 item,此后的流程会以此 item 为基准
- 需要额外操作的对象,会加入此后恢复流程中执行恢复
- 是否跳过恢复的标识 skipRestore
velero.io/job
pkg/restore/job_action.go
AppliesTo
IncludedResources: jobs
Execute
- 删除 Job item 中的 controller-uid 字段(job.Spec.Selector.MatchLabels 以及 job.Spec.Template.ObjectMeta.Labels),并返回
- 无额外操作的对象
- skipRestore 为 false
velero.io/pod
pkg/restore/pod_action.go
AppliesTo
IncludedResources: pods
Execute
- 清空 Pod item 的 nodeName、priority 和无需保留卷、卷挂载信息,并返回
如果 Pod 卷或卷挂载以 pod.Spec.ServiceAccountName + “-token-“ 开头,则无需保留。 - 无额外操作的对象
- skipRestore 为 false
velero.io/restic
pkg/restore/restic_restore_action.go
AppliesTo
IncludedResources: pods
Execute
- 获取到 Pod item 中的被 Restic 备份的卷信息,如果有的话,则会根据一系列的配置信息对 Pod item 注入一个 Init Container(restic-wait),并返回
- 无额外操作的对象
- skipRestore 为 false
velero.io/init-restore-hook
pkg/restore/init_restorehook_pod_action.go
AppliesTo
IncludedResources: pods
Execute
- 获取 Pod 中有关 init.hook.restore.velero.io/xxx 的 annotation 信息,构建一个 Init Container,如果 Pod 没有相关的 annotation,则获取 Restore 中的 hook 信息,根据 selector 的匹配结果,构建一个 Init Container。以上构建的 Init Container 会追加在 Pod 中,顺序为:restic-wait(如果 Pod 已经存在),hook1,hook2…,追加作为更新后的 Pod item 返回
- 无额外操作的对象
- skipRestore 为 false
velero.io/service
pkg/restore/service_action.go
AppliesTo
IncludedResources: services
Execute
- 如果 ClusterIP 不为 None(也就是说分配了一个 Service IP),则删除 ClusterIP,如果 Restore 没有指定 –preserve-nodeports 参数,则删除 Service 的 NodePort 信息,并返回
- 无额外操作的对象
- skipRestore 为 false
velero.io/service-account
pkg/restore/service_account_action.go
AppliesTo
IncludedResources: serviceaccounts
Execute
- 删除 Service Account 中的运行状态时生成的 <serviceAccountName>-token,并返回
- 无额外操作的对象
- skipRestore 为 false
velero.io/add-pvc-from-pod
pkg/restore/add_pvc_from_pod_action.go
AppliesTo
IncludedResources: pods
Execute
- Pod item 未更新
- 获取 Pod 中使用的 PVC 作为额外的操作对象返回
- skipRestore 为 false
velero.io/add-pv-from-pvc
pkg/restore/add_pv_from_pod_action.go
AppliesTo
IncludedResources: persistentvolumeclaims
Execute
- PVC item 未更新
- 获取 PVC 绑定的 PV 作为额外的操作对象返回
- skipRestore 为 false
velero.io/change-storage-class
pkg/restore/change_storageclass_action.go
AppliesTo
IncludedResources: persistentvolumeclaims, persistentvolumes
Execute
获取集群中有关 StorageClass 映射关系的唯一的 ConfigMap 信息(即 ConfigMap label 中有 velero.io/plugin-config=”” 和 velero.io/change-storage-class=RestoreItemAction,如果不存在则不做映射关系),根据 PV 或 PVC 中的 StorageClassName 获得映射后的新 StorageClassName,更新 PV 或 PVC,并返回
1
2
3
4
5
6
7
8
9
10apiVersion: v1
kind: ConfigMap
metadata:
name: change-storage-class
namespace: velero
labels:
velero.io/plugin-config: ""
velero.io/change-storage-class: RestoreItemAction
data:
ussvd-sc: local-sc无额外操作的对象
skipRestore 为 false
velero.io/role-bindings
pkg/restore/rolebinding_action.go
AppliesTo
IncludedResources: rolebindings
Execute
- 根据 Restore 中的 namespace 映射关系,修改 RoleBinding 的 namespace,并返回
- 无额外操作的对象
- skipRestore 为 false
velero.io/cluster-role-bindings
pkg/restore/clusterrolebinding_action.go
AppliesTo
IncludedResources: clusterrolebindings
Execute
- 根据 Restore 中的 namespace 映射关系,修改 ClusterRoleBinding 的 namespace,并返回
- 无额外操作的对象
- skipRestore 为 false
velero.io/crd-preserve-fields
pkg/restore/crd_v1_preserve_unknown_fields_action.go
AppliesTo
IncludedResources: customresourcedefinition.apiextensions.k8s.io
Execute
- 设置版本为 apiextensions.k8s.io/v1 的 CRD 的 PreserveUnknownFields 信息,并返回
- 无额外操作的对象
- skipRestore 为 false
velero.io/change-pvc-node-selector
pkg/restore/change_pvc_node_selector.go
AppliesTo
IncludedResources: persistentvolumeclaims
Execute
- 获取集群中有关 PVC NodeSelector 映射关系的唯一 ConfigMap 信息,根据 PVC annotation 中的 volume.kubernetes.io/selected-node 获得映射后的新 Node,如果存在映射关系,则认为新的 Node 存在;如果不存在映射关系,则判断旧 Node 是否存在,不存在则删除 volume.kubernetes.io/selected-node 信息,存在则设置 PVC annotation nodeSelector 为旧 Node。无论怎样,均更新 PVC,并返回
- 无额外操作的对象
- skipRestore 为 false
velero.io/apiservice
pkg/restore/apiservice_action.go
AppliesTo
IncludedResrouces: apiservices
LabelSelector: kube-aggregator.kubernetes.io/automanaged
Execute
- apiservices item 未更新
- 无额外操作的对象
- skipRestore 为 true,因为这些 apiservices 由 kube-aggergator 负责维护,无需恢复
「 Velero 」源码走读 — Plugin
http://shenxianghong.github.io/2022/03/20/2022-03-20 Velero 源码走读 - Plugin/