前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用 Minio 快速启动 Velero 实现 Kubernetes资源备份

用 Minio 快速启动 Velero 实现 Kubernetes资源备份

原创
作者头像
philentso
修改2022-12-16 10:17:06
6850
修改2022-12-16 10:17:06
举报
文章被收录于专栏:philentsophilentso

用 Minio 启动 Velero 实现 Kubernetes资源备份

Velero 简介

https://github.com/vmware-tanzu/velero

. Velero 属于 VMWare 开源的 Kubernetes 集群备份、恢复、迁移工具.

. 可以提供 Kubernetes 备份功能更,在 Kubernetes 集群出现问题之后,能够快速的恢复.

. 并且也提供了集群迁移功能,可以将 Kubernetes 资源迁移到其他集群.

. Velero 将备份的信息在对象存储中, 默认情况下可以使用 AWS、Azure、GCP 的对象存储.

. 对于 K8s 集群数据的备份和恢复,以及复制当前集群数据到其他集群等都非常方便。可以在两个集群间克隆应用和命名空间,来创建一个临时性的开发环境.

什么是 Velero

Velero 是一个云原生的灾难恢复和迁移工具,它本身也是开源的, 采用 Go 语言编写,可以安全的备份、恢复和迁移Kubernetes集群资源和持久卷.

Velero 是非常符合 Kubernetes 社区的命名风格。Velero 的开发公司 Heptio,之前已被 VMware 收购,其创始人 2014 就职于 Google,当时被认为是 Kubernetes.

Velero 是一种云原生的 Kubernetes 优化方法,支持标准的 K8S 集群,既可以是私有云平台也可以是公有云。除了灾备之外它还能做资源移转,支持把容器应用从一个集群迁移到另一个集群.

Heptio Velero ( 以前的名字为 ARK) 是一款用于 Kubernetes 集群资源和持久存储卷(PV)的备份、迁移以及灾难恢复等的开源工具.

使用 velero 可以对集群进行备份和恢复,降低集群 DR 造成的影响。velero 的基本原理就是将集群的数据备份到对象存储中,在恢复的时候将数据从对象存储中拉取下来.

备份过程

1 . 本地 Velero 客户端发送备份指令

2 . Kubernetes 集群内就会创建一个 Backup 对象

3 . BackupController 监测 Backup 对象并开始备份过程

4 . BackupController 会向 API Server 查询相关数据

5 . BackupController 将查询到的数据备份到远端的对象存储

支持备份存储

. AWS S3 以及兼容 S3 的存储,比如:Minio

. Azure BloB 存储

. Google Cloud 存储

. Aliyun OSS 存储

Velero 特性

Velero 目前包含以下特性:

  1. 支持 Kubernetes 集群数据备份和恢复
  2. 支持复制当前 Kubernetes 集群的资源到其它 Kubernetes 集群
  3. 支持复制生产环境到开发以及测试环境

Velero 组件

Velero 组件一共分两部分,分别是服务端和客户端:

  1. 服务端:运行在你 Kubernetes 的集群中
  2. 客户端:是一些运行在本地的命令行的工具,需要已配置好 kubectl 及集群 kubeconfig 的机器上

测试环境

注意,K8s 与velero 的兼容性

注意,本示例备份存储为 minio, 其没有对 pvc 及快照做备份

前提

. 访问 Kubernetes 集群,版本 1.7 或更高

. 集群上的一个 DNS 服务器

. 安装了 kubectl

. 足够的磁盘空间来存储 Minio 中的备份。你将需要足够的磁盘空间来处理任何备份,再加上至少1GB的额外空间。如果少于1GB的可用磁盘空间,Minio 将无法运行

注意: 文件系统备份支持需要 Kubernetes 1.10 或更高版本,或启用挂载传播功能的早期版本,参见 文件系统备份

k8s 版本

代码语言:javascript
复制
$ kubectl get no
NAME     STATUS   ROLES           AGE    VERSION
ubuntu   Ready    control-plane   119d   v1.24.3

velero 版本(本环境用当前最新版v1.10.0测试)

代码语言:javascript
复制
$ velero version
Client:
        Version: v1.10.0
        Git commit: 367f563072659f0bcd809bc33507fd75cd722344
Server:
        Version: v1.10.0

Install

Install Velero-cli

参阅安装 Velero CLI 的不同选项

CLI安装比较简单,不再做以说明.

Install Minio

根据以下配置创建 Minio.yaml 文件:

代码语言:javascript
复制
---
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
        env:
        - name: MINIO_ACCESS_KEY
          value: "minio"
        - name: MINIO_SECRET_KEY
          value: "minio123"
        ports:
        - containerPort: 9000
        volumeMounts:
        - name: storage
          mountPath: "/storage"
        - name: config
          mountPath: "/config"

---
apiVersion: v1
kind: Service
metadata:
  namespace: velero
  name: minio
  labels:
    component: minio
spec:
  # ClusterIP is recommended for production environments.
  # Change to NodePort if needed per documentation,
  # but only if you run Minio in a test/trial environment, for example with Minikube.
  type: ClusterIP
  ports:
    - port: 9000
      targetPort: 9000
      protocol: TCP
  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"
代码语言:javascript
复制
$ kubectl create ns velero
$ kubectl apply -f minio.yaml

Install Velero 服务器

代码语言:javascript
复制
$ velero install \
    --provider aws \
    --plugins velero/velero-plugin-for-aws:v1.2.1 \
    --bucket velero-backups \
    --secret-file /root/velero/credentials-velero \
    --use-volume-snapshots=false \
    --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.168.86.129:32001 

注意参数:

  1. 首先安装好 minio
  2. 设置好 minio 存值桶 velero-backups
  3. 设置 secret-file 密钥(以下说明)
  4. minio 访问地址,根据自己环境设置为 LB 或 NodePort 等(本示例已设置为 NodePort 访问)
代码语言:javascript
复制
$ vim  /root/velero/credentials-velero 
[default]
aws_access_key_id = minio
aws_secret_access_key = minio123

部署测试资源 nginx.yaml

代码语言:javascript
复制
---
apiVersion: v1
kind: Namespace
metadata:
  name: nginx-example
  labels:
    app: nginx

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: nginx-example
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.17.6
        name: nginx
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: my-nginx
  namespace: nginx-example
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
代码语言:javascript
复制
$ kubectl apply -f nginx.yaml 

检查 velero 部署

代码语言:javascript
复制
$ kubectl get deployments -l component=velero --namespace=velero
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
velero   1/1     1            1           30m
$ kubectl get po -n velero
NAME                      READY   STATUS    RESTARTS   AGE
velero-6976844696-jwvbb   1/1     Running   0          47s

备份 Nginx 并查看备份情况

代码语言:javascript
复制
$ velero backup create nginx-backup --selector app=nginx
Backup request "nginx-backup" submitted successfully.
Run `velero backup describe nginx-backup` or `velero backup logs nginx-backup` for more details.
代码语言:javascript
复制
$ velero backup describe nginx-backup
...
Name:         nginx-backup
Namespace:    velero
Labels:       velero.io/storage-location=default
Annotations:  velero.io/source-cluster-k8s-gitversion=v1.24.3
              velero.io/source-cluster-k8s-major-version=1
              velero.io/source-cluster-k8s-minor-version=24
Phase:  Completed
Errors:    0
Warnings:  2
Namespaces:
  Included:  *
  Excluded:  <none>
Resources:
  Included:        *
  Excluded:        <none>
  Cluster-scoped:  auto
Label selector:  app=nginx
Storage Location:  default
...

显示 Completed , 说明备份成功!

查看备份的资源列表

image.png
image.png

删除 nginx 资源

代码语言:javascript
复制
$ kubectl delete namespace nginx-example

$ kubectl get all --namespace=nginx-example
No resources found in nginx-example namespace.

恢复资源

代码语言:javascript
复制
$ velero restore create --from-backup nginx-backup

// 已经看到 velero 将删除的资源 nginx 恢复到原来的 ns 下面
$ kubectl get all --namespace=nginx-example
NAME                                    READY   STATUS    RESTARTS       AGE
pod/nginx-deployment-59699f4f78-94db7   2/2     Running   2 (7d7h ago)   11d

NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/my-nginx   ClusterIP   10.109.85.213   <none>        80/TCP    11d

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   1/1     1            1           11d

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-59699f4f78   1         1         1       11d

注意

还原可能需要一些时间才能完成。在此期间,STATUS 列将显示 InProgress.

成功还原后,STATUS 列为 Completed,WARNINGS 和 ERRORS 为 0, nginx-example命名空间中的所有对象都应该与删除它们之前一样

For more information, see the debugging information.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 用 Minio 启动 Velero 实现 Kubernetes资源备份
    • Velero 简介
      • 什么是 Velero
        • 备份过程
          • 支持备份存储
            • Velero 特性
              • Velero 组件
                • 测试环境
                  • 前提
                  • k8s 版本
                  • velero 版本(本环境用当前最新版v1.10.0测试)
                • Install
                  • Install Velero-cli
                  • Install Minio
                  • Install Velero 服务器
                  • 部署测试资源 nginx.yaml
                • 检查 velero 部署
                  • 备份 Nginx 并查看备份情况
                    • 删除 nginx 资源
                      • 恢复资源
                        • 注意
                    相关产品与服务
                    对象存储
                    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档