写在开始

Velero源码系列将从零开始,带领大家一步一步阅读velero项目的源代码,本篇文章将介绍velero是如何实现备份功能的?

如果您还不了解velero,请参阅上一篇与视频分享

也欢迎大家关注我们小分队的B站账号貔貅云原生,之后所有的博客、源码、视频分享都会免费发布到B站,后续也会更新更多有趣的内容

如何阅读

由于velero本身是一个kubernetes的operator,所以想要学习如何备份,首先应该了解backup的CRD有哪些字段,是如何定义的,之后每篇文章的顺序为 CRD字段介绍=>代码视频走读=> 函数调用图的形式,本节之后不再赘述

OK,进入正题,有没有思考过,当你在执行 velero create backup xxx后将会发生什么,velero是如何将我们的pod,deployment,pv数据备份下来的呢?

Backup CRD定义

我们通常在使用velero时,会用velero的二进制命令很方便的创建备份任务,当你执行velero create backup xxx时,实际上是创建一个KindBackup的CRD资源,velero controller通过informer会watch到Backup这个对象创建,从而执行真正的备份逻辑

首先我们来学习一下Backup的api定义,官网文档(https://velero.io/docs/v1.12/api-types/backup)

apiVersion: velero.io/v1
kind: Backup
metadata:
  annotations:
    velero.io/source-cluster-k8s-gitversion: v1.21.11
    velero.io/source-cluster-k8s-major-version: "1"
    velero.io/source-cluster-k8s-minor-version: "21"
  creationTimestamp: "2023-10-04T19:00:21Z"
  generation: 26
  labels:
    velero.io/schedule-name: oss-schedule ## 周期任务的名称
    velero.io/storage-location: oss ##  备份数据存储位置
  name: oss-schedule-20231005030021 ## 备份任务名称,由schedule生成的任务
  namespace: velero
  resourceVersion: "65406070"
  uid: ee034389-1005-4157-8ca9-288649993c7e
spec:
  csiSnapshotTimeout: 10m0s ## 快照超时事件
  defaultVolumesToFsBackup: true  ## 是否为所有卷默认使用 Pod Volume 文件系统备份
  hooks: {} ## 生命周期函数
  includedNamespaces: ## 包含的命名空间,支持 excludedNamespaces
  - namespace1
  - namespace2
  - namespace3
  - namespace4
  includedResources: #资源,全部为*,支持excludedResources
  - pod
  - replicationcontroller
  - deployment
  - statefulset
  - daemonset
  - job
  - cronjob
  - service
  - ingress
  - networkpolicy
  - configmap
  - secret
  - persistentvolume
  - persistentvolumeclaim
  - storageclass
  - node
  - namespace
  - event
  - limitrange
  - resourcequota
  - podsecuritypolicy
  - serviceaccount
  itemOperationTimeout: 1h0m0s ## 备份的超时事件
  labelSelector:  ## 通过标签过滤
    matchExpressions:
    - key: k8s.kuboard.cn/name
      operator: NotIn
      values:
      - clickhouse
    - key: k8s.kuboard.cn/name
      operator: NotIn
      values:
      - clickhouse-backup
  metadata: {}
  snapshotVolumes: true
  storageLocation: oss ## 备份数据存储位置
  ttl: 168h0m0s
status:
  completionTimestamp: "2023-10-04T19:03:48Z"
  expiration: "2023-10-11T19:00:21Z"
  formatVersion: 1.1.0
  phase: Completed ## 备份状态
  progress:
    itemsBackedUp: 509
    totalItems: 509
  startTimestamp: "2023-10-04T19:00:22Z"
  version: 1
  warnings: 10

函数调用图

image

代码讲解

代码讲解为视频走读的形式,用到的代码为最新版本fork后添加中文注释,请关注上面的B站账号

代码仓库: https://gitee.com/noovertime/velero-study
velero S3插件:https://github.com/noovertime7/velero-os-plugin