首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
kubernetes与velero的第一次尝试
2
在Kubernetes中如何针对Namespace进行资源限制?
3
kubernetes之metrics-server安装与配置
4
kubernetes部署metrics-server
5
Kubernetes1.20.9摘掉一个master节点再重新加入(ETCD需要注意的)
6
Kubernetes 1.17.17升级到1.18.20
7
Kubernetes 1.18.20升级到1.19.12
8
Kubernetes 1.19.12升级到1.20.9(强调一下selfLink)
9
Kubernetes 1.16.15升级到1.17.17
10
使用 kainstall 工具一键部署 kubernetes 高可用集群
11
附034.Kubernetes_v1.21.0高可用部署架构二
12
附016.Kubernetes_v1.17.4高可用部署
13
附022.Kubernetes_v1.18.3高可用部署架构一
14
附024.Kubernetes_v1.18.3高可用部署架构二
15
使用 StatefulSet 部署 etcd 集群
16
Kubernetes 稳定性保障手册 -- 极简版
17
Linux(centos7)离现安装kubernetes1.19.2和docker——组件部分
18
docker register 私有仓库部署 - http模式
19
KubeSphere 开源 KubeEye:Kubernetes 集群自动巡检工具
20
K8S 中的 CPUThrottlingHigh 到底是个什么鬼?
21
全链路分布式跟踪系统 Apache SkyWalking 入门教程
22
pod Evicted的状态究竟是何人所为
23
使用 ezctl 工具部署和管理 Kubernetes 集群
24
Kubernetes部署策略详解
25
kubernetes容器探针检测
26
使用Spring Boot实现动态健康检查HealthChecks
27
真一文搞定 ingress-nginx 的使用
28
K8S备份、恢复、迁移神器 Velero
29
一次关于k8s kubectl top 和 contained ps 不一致的问题探究
30
kubernetes备份恢复之velero
31
使用 Velero 进行集群备份与迁移
32
TKE集群中nginx-ingress使用实践
33
使用velero进行kubernetes灾备
34
Kubernetes 映射外部服务
35
运维体系建设套路
36
k8s解决pod调度不均衡的问题
37
ingress中虚拟路径解决方案
38
容器下的两地三中心建设
39
k8s集群外的主机访问pod的解决方案
40
k8s基础-健康检查机制
41
k8s基础-标签使用
42
ingress-nginx请求改写
43
nginx ingress server alias 多域名多证书问题
44
JAVA | Java 解决跨域问题 花式解决跨域问题
45
如何通过ingress-nginx实现应用灰度发布?
46
在Kubernetes(k8s)中使用GPU
47
使用 Prometheus-Operator 监控 Calico
48
使用Kubespray部署Kubernetes集群
49
云原生下的CI/CD:Argo CD 详解,手把手教你入门
50
Pod的健康检查机制
清单首页k8s文章详情

使用velero进行kubernetes灾备

使用velero可以对集群进行备份和恢复,降低集群DR造成的影响。velero的基本原理就是将集群的数据备份到对象存储中,在恢复的时候将数据从对象存储中拉取下来。可以从官方文档查看可接收的对象存储,本地存储可以使用Minio。下面演示使用velero将openstack上的openshift集群备份恢复到阿里云的openshift上。

环境要求:kubernetes >1.7;openshift >3.7

注意:本次使用的velero镜像来自官方dockerhub,版本为v1.2.0-beta.1,而非来自配置文件中的registry.cn-hangzhou.aliyuncs.com/acs/velero:latest。建议采用最新镜像,经验证v1.1.0版本的镜像会出现velero无法在1min内同步对象存储的问题(实际同步为1h)。

安装velero


该步骤需要在openstack和阿里云的openshift上执行,一个用于创建backup,一个执行restore。

使用阿里云oss需要特定的插件支持,velero的安装可以参见阿里云官方文档

首先需要创建bucket,创建RAM用户并授权该用户,用户所需要的权限如下,以ecs开头的用于操作云盘快照,以oss开头的用于操作oss bucket。

代码语言:javascript
复制
{
    "Version": "1",
    "Statement": [
        {
            "Action": [
                "ecs:DescribeSnapshots",
                "ecs:CreateSnapshot",
                "ecs:DeleteSnapshot",
                "ecs:DescribeDisks",
                "ecs:CreateDisk",
                "ecs:Addtags",
                "oss:PutObject",
                "oss:GetObject",
                "oss:DeleteObject",
                "oss:GetBucket",
                "oss:ListObjects"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow"
        }
    ]
}

修改官方项目中的install/credentials-velero文件,内容如下,用于连接oss bucket:

代码语言:javascript
复制
ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID>
ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
ALIBABA_CLOUD_OSS_ENDPOINT=<ALIBABA_CLOUD_OSS_ENDPOINT>

在shell中设置如下变量,分别用于设置BackupStorageLocation和VolumeSnapshotLocation。REGION可以从阿里云backet的页面看到,如oss-cn-beijing.aliyuncs.comREGION就是beijing

代码语言:javascript
复制
BUCKET=<YOUR_BUCKET>
REGION=<YOUR_REGION>

按照官方文档执行如下步骤即可创建velero

代码语言:javascript
复制
kubectl create namespace velero
代码语言:javascript
复制
kubectl create secret generic cloud-credentials --namespace velero --from-file cloud=install/credentials-velero
代码语言:javascript
复制
kubectl apply -f install/00-crds.yaml
代码语言:javascript
复制
sed -i "s#<BUCKET>#$BUCKET#" install/01-velero.yaml
sed -i "s#<REGION>#$REGION#" install/01-velero.yaml
kubectl apply -f install/01-velero.yaml

配置文件install/01-velero.yaml中使用的镜像是从gcr.io/heptio-images/velero:latest同步的,可以在官方release中查看当前的最新版本

代码语言:javascript
复制
# sync from gcr.io/heptio-images/velero:latest
image: registry.cn-hangzhou.aliyuncs.com/acs/velero:latest

为了方便执行,可以下载velero命令行工具,拷贝到系统$PATH路径即可使用

velero的使用


velero的使用推荐观看该视频,讲解的比较详细。所有支持的命令可以通过--help选项查看

velero会定期同步对象存储中的backup操作(新增/删除)

手动备份

备份集群的所有资源

代码语言:javascript
复制
velero backup create ${BACKUP_NAME}

--include-namespaces选项可以指定备份某些命名空间下面的资源

代码语言:javascript
复制
velero backup create ${BACKUP_NAME} --include-namespaces ${NAMESPACE1},${NAMESPACE2}

--exclude-namespaces选项可以指定备份排除某些命名空间下面的资源

代码语言:javascript
复制
velero backup create ${BACKUP_NAME} --exclude-namespaces ${NAMESPACE1},${NAMESPACE2}

--include-resources选项可以指定备份哪些资源类型;--exclude-resources`可以指定排除某些资源类型

代码语言:javascript
复制
velero backup create ${BACKUP_NAME} --include-resources pod,secret

--ttl可以指定backup的生存周期,在ttl超时后,backup会被定期清理,ttl默认30天

删除backup

使用--confirm可以直接删除备份,无需确认

代码语言:javascript
复制
velero backup delete ${BACKUP_NAME} --confirm

定期backup

定期备份类似kubernetes的cronjob,会定期上传backup到对象存储。在首次执行velero schedule会执行一次数据备份。

代码语言:javascript
复制
# Create a backup every 6 hours
velero create schedule ${SCHEDULE_NAME} --schedule="0 */6 * * *"

# Create a backup every 6 hours with the @every notation
velero create schedule ${SCHEDULE_NAME} --schedule="@every 6h"

# Create a daily backup of the web namespace
velero create schedule ${SCHEDULE_NAME} --schedule="@every 24h" --include-namespaces web

# Create a weekly backup, each living for 90 days (2160 hours)
velero create schedule ${SCHEDULE_NAME} --schedule="@every 168h" --ttl 2160h0m0s

restore

从backup创建restore

代码语言:javascript
复制
velero restore create ${RESTORE_NAME} --from-backup ${BACKUP_NAME}

从backup创建restore,restore默认名为 ${BACKUP_NAME}-<timestamp>

代码语言:javascript
复制
velero restore create --from-backup ${BACKUP_NAME}

从schedule最新一次的backup创建restore

代码语言:javascript
复制
velero restore create --from-schedule ${SCHEDULE_NAME}

指定backup中的某些资源创建restore

代码语言:javascript
复制
velero restore create --from-backup backup-2 --include-resources pod,secret

velero Hook

velero支持两种Hook:Pre HookPost Hook,分别表示在backup前执行和在backup后执行

代码语言:javascript
复制
pre.hook.backup.velero.io/container
pre.hook.backup.velero.io/command
pre.hook.backup.velero.io/on-error
pre.hook.backup.velero.io/timeout
代码语言:javascript
复制
post.hook.backup.velero.io/container
post.hook.backup.velero.io/command
post.hook.backup.velero.io/on-error
post.hook.backup.velero.io/timeout

可以通过两种方式注入Hook:Pod annotationBackup spec

需要注意的是Hook执行失败会导致backup操作失败,因此除非必要,请不要设置Hook

velero debug

查看backup的详细信息,带上detail可以查看备份的资源内容

代码语言:javascript
复制
velero backup describe <backupName> --detail

查看backup的服务日志

代码语言:javascript
复制
velero backup logs <backupName>

查看restore 的详细信息

代码语言:javascript
复制
velero restore describe <restoreName> --detail

查看restore 的服务日志

代码语言:javascript
复制
velero restore logs <restoreName>

查看velero服务日志

代码语言:javascript
复制
kubectl logs deployment/velero -n velero

download backup

使用velero backup download ${BACKUP_NAME}可在本地生成一个backup的压缩包,包含backup的各个资源

velero的删除

执行以下命令可以删除velero

代码语言:javascript
复制
kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero

velero暴露Prometheus metrics

安装后的velero默认不会暴露Prometheus metrics。部署如下service,通过访问http://velero-exporter.velero.svc.cluster.local:8085/metrics查看metrics信息

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  labels:
    velero: exporter
  name: velero-exporter
  namespace: velero
spec:
  ports:
    - name: https
    port: 8085
    protocol: TCP
    targetPort: 8085
  selector:
    component: velero

Disaster recovery


  • cluster1上创建velero schedule实现定期备份
  • cluster1发生DR时,在cluster2上执行如下命令即可 kubectl patch backupstoragelocation <STORAGE LOCATION NAME> \ --namespace velero \ --type merge \ --patch '{"spec":{"accessMode":"ReadOnly"}}' velero restore create --from-backup <SCHEDULE NAME>-<TIMESTAMP> kubectl patch backupstoragelocation <STORAGE LOCATION NAME> \ --namespace velero \ --type merge \ --patch '{"spec":{"accessMode":"ReadWrite"}}' 上述为官方解决方案,也可以将cluster2的backupstoragelocation直接设置为ReadOnly,此时cluster将无法创建/删除backup,仅能同步对象存储中的内容 这里是一个例子,实现了将一个集群备份到阿里云上

TIPS:


  • openstack无法直接访问阿里云oss 可以在阿里ECS上创建反向代理,openstack通过反向代理连接阿里云oss。此时需要在velero的配置文件install/01-velero.yaml中增加如下地址解析 hostAliases: - hostnames: - "${BUCKET_NAME}.oss-cn-${REGION}-internal.aliyuncs.com" ip: "${PROXY_IP}" 在代理情况下,如果在node节点上使用velero命令行命令,需要在node节点上添加bucket ${BUCKET_NAME}.oss-cn-${REGION}-internal.aliyuncs.com的地址解析,如在/ets/hosts中添加如下内容 ${OSS_PROXY_IP} ${BUCKET_NAME}.oss-cn-${REGION}-internal.aliyuncs.com
  • 进行集群备份的时候需要两个集群的kubernetes版本保持一致
  • 备份集群资源时最好指定需要备份的内容,防止受环境无法备份的资源的影响,如pv/pvc
  • 在cluster1创建backup到cluster2同步到该backup之间的时间差在90s以内,实现代码在pkg/controller/backup_sync_controller.go,velero每30s会调调度backupSyncController.runbackupSyncController.run函数中会对比backupstoragelocations.velero.io资源中的lastSyncedTime字段,当前时间与该字段(上一次同步时间)的时间差大于1min时才会进行同步。 status: lastSyncedTime: 2019-10-25T06:05:49.496158379Z
  • velero有字段GC功能,一些无法删除或ttl超时的backup会在60min后被GC掉
  • velero集成了restic,用以备份容器的persistent volumes。使用velero备份persistent volumes时需要persistent volumes支持snapshots功能(快照功能通常由Amazon EBS Volumes, Azure Managed Disks, Google Persistent Disks等提供),否则需要单独使用restic,详见官方文档。 PS:restic不会支持阿里OSS (╬▔皿▔)凸
  • 如果没有Ali OSS,也可以通过自行搭建Minio作为对象存储服务
下一篇
举报
领券