k8s集群备份

restic

restic 是一个go语言实现的备份软件, 可以实现快速, 高效, 安全的备份

其原理类似存储文件的git, 可以实现增量备份.

可以直接和对象存储通信

安装

1
brew install restic

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 初始化仓库(类似git的仓库, 输入密码, 改密码丢失文件就无法还原了)
restic init -r ./repo

# 或者用环境变量指定
export RESTIC_REPOSITORY=./repo
export RESTIC_PASSWORD=123

# 备份当前的work文件夹
restic backup ./work

# 查看所有备份
restic snapshots

# 还原备份, 将备份还原到work2目录 (注意, 如果是还原到原来的目录, 多出来的文件不会自动删除)
restic restore latest -t ./work2

s3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# example 1
unset HISTFILE
export RESTIC_REPOSITORY="s3:http://192.168.2.17/velero/restic/tmp-test"
export AWS_ACCESS_KEY_ID="admin"
export AWS_SECRET_ACCESS_KEY="18381015"
export RESTIC_PASSWORD="static-passw0rd"
restic snapshots


# example 2
unset HISTFILE
export RESTIC_REPOSITORY="s3:http://192.168.2.4/stash/default/deployment/stash-test"
export AWS_ACCESS_KEY_ID="admin"
export AWS_SECRET_ACCESS_KEY="12345678"
export RESTIC_PASSWORD="changeit"
restic snapshots

Stash

Stash是一个k8s operator, 对 restic 进行封装, 以云原生的方式使用该备份程序

Stash Backup Flow

  1. stash会为每个deployment , statefulset创建一个restic repo

(图片来自官方)

安装

https://appscode.com/products/stash/0.8.3/setup/install/

1
2
3
# 注意配置http,https全局代理
curl -fsSL https://raw.githubusercontent.com/appscode/stash/0.8.3/hack/deploy/stash.sh \
| bash -s -- --namespace=stash

s3 bucket

1
2
3
4
kubectl create secret generic s3-secret \
--from-literal=RESTIC_PASSWORD=changeit \
--from-literal=AWS_ACCESS_KEY_ID=admin \
--from-literal=AWS_SECRET_ACCESS_KEY=12345678

velero

  1. k8s资源备份
    • 通过api获取资源
      • 可以方便namespace复制, namespace迁移, 只备份部分对象
    • etcd一般不能直接访问
  2. pv备份
    • 主要通过存储提供商的snapshot api
    • 如果没有snapshot api支持, 则通过restic来备份

考察点

  1. offline备份: stash 支持, 通过initContaner实现

velero 操作

  1. 备份
1
2
3
4
5
6

velero backup create backup1 --selector app=nginx



velero backup logs backup1 | grep -v 'level=info'

--selector 或者 -l 是匹配标签, 被匹配的object都会备份

velero使用restic备份, 每个namespace对应一个restic repository, 需要保证restic的bucket安全, 因为密码为固定密码, 丢失该bucket就意味着数据被泄露出去

通过resitc命令查看:

192.168.2.17/<bucket>/<sub-path>

1
2
3
4
5
6
7
unset HISTFILE
export RESTIC_REPOSITORY="s3:http://192.168.2.17/velero/restic/tmp-test"
export AWS_ACCESS_KEY_ID="admin"
export AWS_SECRET_ACCESS_KEY="18381015"
export RESTIC_PASSWORD="static-passw0rd"

restic snapshots
1
2
3
4
5
6
7

ID Time Host Tags Paths
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
473039e8 2019-08-08 15:07:26 velero pod-uid=276face7-b9a8-11e9-a762-000c29d236de,volume=data,backup=backup2,backup-uid=2c4aee9b-b9ab-11e9-a762-000c29d236de,ns=tmp-test,pod=nfs-test-6878fd6449-lgdcg /host_pods/276face7-b9a8-11e9-a762-000c29d236de/volumes/kubernetes.io~nfs/pvc-2772cbb6-b9a8-11e9-a762-000c29d236de
7396d9c9 2019-08-08 15:27:37 velero volume=data,backup=all-obj,backup-uid=fcb7f4e1-b9ad-11e9-a762-000c29d236de,ns=tmp-test,pod=nfs-test-6878fd6449-lgdcg,pod-uid=5528a933-b9ac-11e9-a762-000c29d236de /host_pods/5528a933-b9ac-11e9-a762-000c29d236de/volumes/kubernetes.io~nfs/pvc-55152248-b9ac-11e9-a762-000c29d236de
e95493c7 2019-08-08 16:32:41 velero pod=nfs-test-6878fd6449-lgdcg,pod-uid=5528a933-b9ac-11e9-a762-000c29d236de,volume=data,backup=bak3,backup-uid=14c3f08f-b9b7-11e9-a762-000c29d236de,ns=tmp-test /host_pods/5528a933-b9ac-11e9-a762-000c29d236de/volumes/kubernetes.io~nfs/pvc-55152248-b9ac-11e9-a762-000c29d236de
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

可以看到velero是和pod相关联的

0%