前语
Carina 是由博云主导并发起的云原生本地存储项目(GitHub 地址为:github.com/carina-io/c… CNCF 全景图。Carina 能够为云原生环境中的有状况运用供给高性能、免运维的本地存储解决计划,具有存储卷生命周期管理、LVM/RAW 盘供给、智能调度、RAID 管理、主动分层等才能,旨在为云原生有状况服务供给极低延迟、免运维、懂数据库的数据存储系统。Carina 作为博云容器云平台的组件之一,现已在多个金融机构的出产环境中稳定运转多年。
传统的数据备份计划首要有两种, 一种是运用存储数据的服务端完结基于快照的备份,另一种是在每台方针服务器上布置专有备份 agent 并指定备份数据目录,定期把数据仿制到外部存储上。这两种办法的备份机制相对固化,在云原生年代无法适应容器化后的弹性、池化等布置场景。
以云原生存储插件 Carina 为例,数据库等数据灵敏场景中每个数据库集群包含多个计算实例,实例可能在集群内恣意漂移并完结主动故障康复。传统数据备份办法在数据库集群快速扩缩容、跨节点漂移等场景下无法主动跟从计算实例搬迁然后导致数据备份失效,因此一款贴合 k8s 容器场景的备份东西就十分重要。
Kubernetes 备份康复利器:velero
Velero 是一款云原生年代的灾难康复和搬迁东西,选用 Go 言语编写,并在 github 进步行了开源,开源地址为:github.com/vmware-tanz…。Velero 源于西班牙语,意思为帆船,十分契合 Kubernetes 社区的命名风格。
运用 velero 用户能够安全的备份、康复和搬迁 Kubernetes 集群资源和耐久卷。它的基本原理便是将集群的数据,例如集群资源和耐久化数据卷备份到目标存储中,在康复的时候将数据从目标存储中拉取下来。除了灾备之外它还能做资源移转,支撑把容器运用从一个集群搬迁到另一个集群,这也是 velero 一个十分成功的运用场景。
Velero 首要包含连个中心组件,分别为服务端和客户端。服务端运转在具体的 Kubernetes 集群中,客户端是运转在本地的指令行东西,只需装备好 kubectl 及 kubeconfig 即可运用,十分简单。
Velero 基于其完结的 kubernetes 资源备份才能,能够轻松完结 Kubernetes 集群的数据备份和康复、仿制 kubernetes 集群资源到其他 kubernetes 集群或许快速仿制出产环境到测试环境等功能。
在资源备份方面,velero 支撑将数据备份到很多的云存储中,例如 AWS S3 或 S3 兼容的存储系统、Azure Blob、Google Cloud 存储、Aliyun OSS 等。与备份整个 kubernetes 的数据存储引擎 etcd 相比,velero 的控制愈加细化,能够对 Kubernetes 集群内目标等级进行备份,还能够经过对 Type、Namespace、Label 等目标进行分类备份或许康复。
Velero 作业流程
以中心的数据备份为例,当履行 velero backup create my-backup 时:
-
Velero 客户端首要调用 Kubernetes API 服务器以创立 Backup 目标;
-
BackupController 将收到告诉有新的 Backup 目标被创立并履行验证;
-
BackupController 开始备份进程,它经过查询 API 服务器以获取资源来收集数据以进行备份;
-
BackupController 将调用目标存储服务,例如,AWS S3 -上传备份文件。默认状况下,velero backup create 支撑任何耐久卷的磁盘快照,能够经过指定其他标志来调整快照,运转 velero backup create –help 能够检查可用的标志,也能够运用–snapshot-volumes=false 选项禁用快照。
关于备份存储方位和卷快照,Velero 有两个自界说资源 BackupStorageLocation 和 VolumeSnapshotLocation,用于装备 Velero 备份及其相关的耐久卷快照的存储方位。
-
BackupStorageLocation 首要支撑的后端存储是 S3 兼容的存储,存储一切 Velero 数据的存储区中的前缀以及一组其他特定于供给程序的字段。比如:Minio 和阿里云 OSS 等 ;
-
VolumeSnapshotLocation(pv 数据),首要用来给 PV 做快照,需要云供给商供给插件,完全由供给程序供给的特定的字段(例如 AWS 区域,Azure 资源组,Portworx 快照类型等)界说。以对数据一致性最为灵敏的数据库和中间件为例,开源存储插件 Carina 也行将供给数据库感知的 velero 卷快照功能,能够完结中间件数据的快速备份及康复。
Velero 装置和运用
装置 velero 客户端
$ wget https://mirror.ghproxy.com/https://github.com/vmware-tanzu/velero/releases/download/v1.6.3/velero-v1.6.3-darwin-amd64.tar.gz $ tar -zxvf velero-v1.6.3-darwin-amd64.tar.gz && cd velero-v1.6.3-darwin-amd64 $ mv velero /usr/local/bin && chmod +x /usr/local/bin/velero $ velero version
仿制代码
装置 minio 作为数据备份后端
Minio 装置 Yaml 文件如下:
apiVersion: v1 kind: Namespace metadata: name: velero --- apiVersion: apps/v1 kind: Deployment metadata: namespace: velero name: minio labels: component: minio spec: strategy: type: Recreate selector: matchLabels: component: minio template: metadata: labels: component: minio spec: volumes: - name: storage emptyDir: {} - name: config emptyDir: {} containers: - name: minio image: minio/minio:latest imagePullPolicy: IfNotPresent args: - server - /storage - --config-dir=/config - --console-address=:9001 env: - name: MINIO_ACCESS_KEY value: "minio" - name: MINIO_SECRET_KEY value: "minio123" ports: - containerPort: 9000 - containerPort: 9001 volumeMounts: - name: storage mountPath: "/storage" - name: config mountPath: "/config" --- apiVersion: v1 kind: Service metadata: namespace: velero name: minio labels: component: minio spec: type: NodePort ports: - name: api port: 9000 targetPort: 9000 - name: console port: 9001 targetPort: 9001 selector: component: minio --- apiVersion: batch/v1 kind: Job metadata: namespace: velero name: minio-setup labels: component: minio spec: template: metadata: name: minio-setup spec: restartPolicy: OnFailure volumes: - name: config emptyDir: {} containers: - name: mc image: minio/mc:latest imagePullPolicy: IfNotPresent command: - /bin/sh - -c - "mc --config-dir=/config config host add velero http://minio:9000 minio minio123 && mc --config-dir=/config mb -p velero/velero" volumeMounts: - name: config mountPath: "/config"
仿制代码
装置 Mini,并检查资源创立状况。
$ kubectl apply -f ./00-minio-deployment.yaml $ kubectl get pods -n velero NAME READY STATUS RESTARTS AGEminio-58dc5cf789-z2777 0/1 ContainerCreating 0 14sminio-setup-dz4jb 0/1 ContainerCreating 0 6s$ kubectl get svc -n velero NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEminio NodePort 10.96.13.35 <none> 9000:30693/TCP,9001:32351/TCP 17s
仿制代码
待服务都现已发动结束,能够登录 minio 检查 velero/velero 的 bucket 是否创立成功。
装置 velero 服务端 ,运用 s3 作为存储
-
创立 minio 凭证
cat > credentials-velero <<EOF[default]aws_access_key_id = minioaws_secret_access_key = minio123EOF# 装置velero cp velero /usr/bin/# 启用快速补全$ velero completion bash
仿制代码
-
运用官方供给的 restic 组件备份 pv
$ velero install \ –image velero/velero:v1.6.3 \ –plugins velero/velero-plugin-for-aws:v1.0.0 \ –provider aws \ –bucket velero \ –namespace velero \ –secret-file ./credentials-velero \ –velero-pod-cpu-request 200m \ –velero-pod-mem-request 200Mi \ –velero-pod-cpu-limit 1000m \ –velero-pod-mem-limit 1000Mi \ –use-volume-snapshots=false \ –use-restic \ –restic-pod-cpu-request 200m \ –restic-pod-mem-request 200Mi \ –restic-pod-cpu-limit 1000m \ –restic-pod-mem-limit 1000Mi \ –backup-location-config region=minio,s3ForcePathStyle=”true”,s3Url=minio.velero.svc:9000
仿制代码
其间,几个重要的参数及其阐明如下:
--provider:声明运用的 Velero 插件类型。--plugins:运用 S3 API 兼容插件 “velero-plugin-for-aws ”。--bucket:在腾讯云 COS 创立的存储桶名。--secret-file:拜访 COS 的拜访凭证文件,见上面创立的 “credentials-velero”凭证文件。--use-restic:运用开源免费备份东西 restic 备份和复原耐久卷数据。--default-volumes-to-restic:运用 restic 来备份一切Pod卷,前提是需要敞开 --use-restic 参数。--backup-location-config:备份存储桶拜访相关装备。--region:兼容 S3 API 的 COS 存储桶区域,例如创立区域是广州的话,region 参数值为“ap-guangzhou”。--s3ForcePathStyle:运用 S3 文件途径格局。--s3Url:COS 兼容的 S3 API 拜访地址--use-volume-snapshots=false 来关闭存储卷数据快照备份。
仿制代码
装置指令履行完结后,等候 Velero 和 restic 作业负载安排妥当后,检查装备的存储方位是否可用。
$ velero backup-location get
apiVersion: velero.io/v1 kind: BackupStorageLocation metadata: name: default namespace: velero spec: # 只要 aws gcp azure provider: aws objectStorage: bucket: myBucket prefix: backup config: region: us-west-2 profile: "default" s3ForcePathStyle: "false" s3Url: http://minio:9000
仿制代码
至此 velero 就现已全部布置完结。
velero 功能介绍
创立备份
velero 支撑备份一切目标,也能够按类型,称号空间和/或标签过滤目标
$ velero create backup $NAME [flags]$ velero backup create pvc-backup-1 --snapshot-volumes --include-namespaces nginx-example --default-volumes-to-restic --volume-snapshot-locations default
仿制代码
其间:
–include-namespaces:备份该命名空间下的一切资源,不包含集群资源
–include-resources:要备份的资源类型
–include-cluster-resources:是否备份集群资源 此选项能够具有三个可能的值: true:包含一切集群范围的资源; false:不包含集群范围内的资源; nil (“主动”或不供给)
–selector:经过标签挑选匹配的资源备份
–exclude-namespaces:备份时该命名空间下的资源不进行备份
–exclude-resources:备份时该类型的资源不进行备份
–velero.io/exclude-fro…当标签挑选器匹配到该资源时,若该资源带有此标签,也不进行备份
同时,也能够经过运用 –ordered-resources 参数,按特定顺序备份特定品种的资源,需要指定资源称号和该资源的目标称号列表,资源目标称号以逗号分隔,其称号格局为“命名空间/资源称号”,关于集群范围资源,只需运用资源称号。映射中的键值对以分号分隔,资源类型是复数方法。
$ velero backup create backupName --include-cluster-resources=true --ordered-resources 'pods=ns1/pod1,ns1/pod2;persistentvolumes=pv4,pv8' --include-namespaces=ns1
$ velero backup create backupName --ordered-resources 'statefulsets=ns1/sts1,ns1/sts0' --include-namespaces=n
仿制代码
守时备份:
$ velero schedule create <SCHEDULE NAME> --schedule "0 7 * * *"
$ velero create schedule NAME --schedule="@every 6h"
$ velero create schedule NAME --schedule="@every 24h" --include-namespaces web
$ velero create schedule NAME --schedule="@every 168h" --ttl 2160h0m0s
仿制代码
备份高档用法举例
-
在单个 Velero 备份中创立不止一种耐久卷的快照
velerosnapshot−locationcreateebs−us−east−1−−provideraws−−configregion=us−east−1velero snapshot-location create ebs-us-east-1 \ –provider aws \ –config region=us-east-1 velero snapshot-location create portworx-cloud \ –provider portworx \ –config type=cloud $ velero backup create full-cluster-backup \ –volume-snapshot-locations ebs-us-east-1,portworx-cloud
仿制代码
-
在不同的区域将备份存储到不同的目标存储桶中
velerobackup−locationcreatedefault−−provideraws−−bucketvelero−backups−−configregion=us−east−1velero backup-location create default \ –provider aws \ –bucket velero-backups \ –config region=us-east-1 velero backup-location create s3-alt-region \ –provider aws \ –bucket velero-backups-alt \ –config region=us-west-1 $ velero backup create full-cluster-alternate-location-backup \ –storage-location s3-alt-region
仿制代码
-
关于公有云供给的存储卷,将一部分快照存储在本地,一部分存储在公有云
velerosnapshot−locationcreateportworx−local−−providerportworx−−configtype=localvelero snapshot-location create portworx-local \ –provider portworx \ –config type=local velero snapshot-location create portworx-cloud \ –provider portworx \ –config type=cloud $ velero backup create cloud-snapshot-backup \ –volume-snapshot-locations portworx-cloud
仿制代码
-
运用存储方位
velerobackup−locationcreatedefault−−provideraws−−bucketvelero−backups−−configregion=us−west−1velero backup-location create default \ –provider aws \ –bucket velero-backups \ –config region=us-west-1 velero snapshot-location create ebs-us-west-1 \ –provider aws \ –config region=us-west-1 $ velero backup create full-cluster-backup
仿制代码
检查备份使命。
当备份使命状况是 “Completed” ,且过错数为 0 ,阐明备份使命完结且没发生任何过错,能够经过以下指令查询:
$ velero backup get
仿制代码
经过先临时将备份存储方位更新为只读模式,能够防止在复原进程中在备份存储方位中创立或删去备份目标。
$ kubectl patch backupstoragelocation default --namespace velero \ --type merge \ --patch '{"spec":{"accessMode":"ReadOnly"}}' velero backup-location getNAME PROVIDER BUCKET/PREFIX PHASE LAST VALIDATED ACCESS MODE DEFAULTdefault aws velero Unknown Unknown ReadWrite true
仿制代码
康复备份数据
$ velero restore create --from-backup <backup-name>$ velero restore create --from-backup pvc-backup-1 --restore-volumes
仿制代码
检查康复使命。
$ velero restore get
仿制代码
复原完结后,不要忘掉把备份存储方位康复为读写模式,以便下次备份使命运用:
$ kubectl patch backupstoragelocation default --namespace velero \ --type merge \ --patch '{"spec":{"accessMode":"ReadWrite"}}'
仿制代码
备份 hooks 介绍
Velero 支撑在备份使命履行之前和履行后在容器中履行一些预先设定好的指令,这种办法对数据一致性等十分有用。velero 支撑两种办法指定钩子,一种是 pod 自身的注释声明,另一种是在界说 Backup 使命时的 Spec 中声明。
-
Pre hooks
pre.hook.backup.velero.io/container:将要履行指令的容器,默以为pod中的第一个容器,可选的。 pre.hook.backup.velero.io/command:要履行的指令,假如需要多个参数,请将该指令指定为JSON数组。例如:[“/usr/bin/uname”, “-a”] pre.hook.backup.velero.io/on-error:假如指令回来非零退出代码怎么处理。默以为“Fail”,有用值为“Fail”和“Continue”,可选的。 pre.hook.backup.velero.io/timeout:等候指令履行的时刻,假如指令超越超时,则以为该挂钩失利的。默以为30秒,可选的。
仿制代码
-
Post hooks
post.hook.backup.velero.io/container:将要履行指令的容器,默以为pod中的第一个容器,可选的。 post.hook.backup.velero.io/command:要履行的指令,假如需要多个参数,请将该指令指定为JSON数组。例如:[“/usr/bin/uname”, “-a”] post.hook.backup.velero.io/on-error:假如指令回来非零退出代码怎么处理。默以为“Fail”,有用值为“Fail”和“Continue”,可选的。 post.hook.backup.velero.io/timeout:等候指令履行的时刻,假如指令超越超时,则以为该挂钩失利的。默以为30秒,可选的
仿制代码
复原 hooks 介绍
Velero 支撑复原 hooks,能够在复原使命履行前或复原进程之后履行的自界说操作。有以下两种界说方法:
-
InitContainer Restore Hooks:这些将在待复原的 Pod 的运用程序容器发动之前将 init 容器增加到复原的 pod 中,以履行任何必要的设置。
init.hook.restore.velero.io/container-image:要增加的init容器的容器镜像 init.hook.restore.velero.io/container-name:要增加的init容器的称号 init.hook.restore.velero.io/command:将要在初始化容器中履行的使命或指令
仿制代码
如进行备份之前,请运用以下指令将注释增加到 Pod:
kubectl annotate pod -n <POD_NAMESPACE> <POD_NAME> \ init.hook.restore.velero.io/container-name=restore-hook \ init.hook.restore.velero.io/container-image=alpine:latest \ init.hook.restore.velero.io/command='["/bin/ash", "-c", "date"]'
仿制代码
-
Exec Restore Hooks:可用于在已复原的 Kubernetes pod 的容器中履行自界说指令或脚本。
post.hook.restore.velero.io/container:;履行hook的容器称号,默以为第一个容器,可选 post.hook.restore.velero.io/command:将在容器中履行的指令,必填 post.hook.restore.velero.io/on-error:怎么处理履行失利,有用值为Fail和Continue,默以为Continue,运用Continue模式,仅记录履行失利;运用Fail模式时,将不会在自行其他的hook,复原的状况将为PartiallyFailed,可选 post.hook.restore.velero.io/exec-timeout:开始履行后要等候多长时刻,默以为30秒,可选 post.hook.restore.velero.io/wait-timeout:等候容器准备安排妥当的时刻,该时刻应满足长,以使容器能够发动,并
仿制代码
如进行备份之前,请运用以下指令将注释增加到 Pod
kubectl annotate pod -n <POD_NAMESPACE> <POD_NAME> \ post.hook.restore.velero.io/container=postgres \ post.hook.restore.velero.io/command='["/bin/bash", "-c", "psql < /backup/backup.sql"]' \ post.hook.restore.velero.io/wait-timeout=5m \ post.hook.restore.velero.io/exec-timeout=45s \ post.hook.restore.velero.io/on-error=Continue
仿制代码
Velero 部分关键问题解析
Velero 能够将资源复原到与其备份来源不同的命名空间中吗?
是的,能够运用–namespace-mappings 参数来指定:
velero restore create RESTORE_NAME \ --from-backup BACKUP_NAME \ --namespace-mappings old-ns-1:new-ns-1,old-ns-2:new-ns-2
仿制代码
履行复原操作后,已有的 NodePort 类型的 service 怎么处理?
Velero 有一个参数,可让用户决议保存原来的 nodePorts。
velero restore create 子指令具有 –preserve-nodeports 标志保护服务 nodePorts。此标志用于从备份中保存原始的 nodePorts,可用作–preserve-nodeports 或–preserve-nodeports=true 假如给定此标志,则 Velero 在复原 Service 时不会删去 nodePorts,而是尝试运用备份时写入的 nodePorts。
velero 怎么完结不影响业务前提下得一致性备份战略,并将备份数据上传到目标存储中?
假如是基于 velero 完结数据库的一致性,需要用 velero 的 hook,在备份前对数据库进行 quiesce 操作,备份完 unquiesce。关于备份自身,能够运用 restic 来 copy 数据(但不用快照),或许运用快照的办法。