Velero＋Restic Pluginで増分バックアップを検証する

KubernetesのデファクトバックアップツールであるVeleroではRestic Pluginを[サポートしている](https://velero.io/docs/v1.9/restic/)。公式ドキュメントのRestic Pluginのページでは`emptyDir`とかでなければ増分バックアップに対応していると記載がある。
増分バックアップが利用できれば、以下のような恩恵が受けられそうである。
- ストレージ利用量が削減できる
- S3(＋互換ストレージ)への転送量が削減でき、お得になる

この記事は実際に増分バックアップが聞くかどうか検証した時のメモ。

なお、今回は以下の環境で検証したが、恐らくこれ以外の環境でも同様の検証結果を得られるとは思う。
- K8s：vSphere with Tanzu (vSphere7u3)
- S3互換ストレージ：MinIO
- Velero：Tanzu Mission Controlで構築（構築済み）



## 準備
こんな感じのbusyboxのコンテナを利用するPodとPVCのManifestを作成してデプロイする。
```yaml
cat << EOF > ./sample.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: testvelero0
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: pvpod
spec:
      volumes:
      - name: testvol0
        persistentVolumeClaim:
          claimName: testvelero0
      containers:
      - name: busybox
        image: busybox
        command: [ "sleep", "365d" ]
        volumeMounts:
        - name: testvol0
          mountPath: "/mnt0"
EOF
kubectl apply -f ./sample.yaml
```

## 検証
Podに入ってPVのmount先にランダムなデータを512MBほど作成する。
```
kubectl exec -it pvpod -- sh
head -c 512m /dev/urandom > /mnt0/testdata
```
作成後の状態はこんな感じ。
```
$ kubectl exec -it pvpod -- ls -lh /mnt0
total 512M
drwx------    2 root     root       16.0K Mar  1 10:01 lost+found
-rw-r--r--    1 root     root      512.0M Mar  7 04:33 testdata
```

この状態で、このPod、PVCがいるNamespaceに対してバックアップを取得する。

バックアップはTanzu Mission ControlのData Protection機能で取得したのでコマンド等は割愛する。

バックアップ後のMinIOのバケットの中身とサイズは以下のようになった。
![1678174713307.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/f87ce49c-ef4d-43f6-d39d-4c971ead267e.png)

mcコマンドでファイルの更新時刻を確認する。
```
$ mc ls mybucket/ -r | sed "s/\[\(.*\) JST\] .*/\1/g" | sort | uniq
2023-03-07 14:39:51
2023-03-07 14:39:56
：（省略）
2023-03-07 14:40:30
2023-03-07 14:40:31
```
14:39から14:40で採取できていることが確認できる。

念の為、リストア出来ることを確認する。
デプロイしていたNamespaceを削除し、TMCからリストアを実施する。
![1678180265360.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/123fcedd-86b5-0f32-1548-48bea4098c3a.png)
```
$ kubectl exec -it pvpod -- ls -lh /mnt0
Defaulted container "busybox" out of: busybox, restic-wait (init)
total 512M
drwx------    2 root     root       16.0K Mar  1 10:01 lost+found
-rw-r--r--    1 root     root      512.0M Mar  7 04:33 testdata
```


ここから差分を100MB程度作ってみる。先ほど作成したファイルに追記する。
```
kubectl exec -it pvpod -- sh
head -c 100m /dev/urandom >> /mnt0/testdata
```
以下のようになった。これをバックアップする。
```
$ kubectl exec -it pvpod -- ls -lh /mnt0
Defaulted container "busybox" out of: busybox, restic-wait (init)
total 612M
drwx------    2 root     root       16.0K Mar  1 10:01 lost+found
-rw-r--r--    1 root     root      612.0M Mar  7 09:11 testdata
```
問題なく取得できた。
![1678180573067.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/53ffa845-971e-59f7-37e6-3bcad02ce3be.png)

ここでバケットの利用量を確認する。
![1678180696492.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/d2c5b2ad-0164-2ab9-d547-8d9840aaa66c.png)

増分バックアップが効かない場合、2回バックアップを取得したので 512MB + 612MB の計1124MB消費していそうだが、実際は612MBとなっており、増分バックアップが働いているように見える。

resticのディレクトリに絞ってファイルの更新を確認する。
```
$ mc ls pso-portal/ -r | grep restic | sed "s/\[\(.*\) JST\] .*/\1/g" | sort | uniq
2023-03-07 14:39:51
2023-03-07 14:39:56
：（省略）
2023-03-07 14:40:25
2023-03-07 18:13:23
2023-03-07 18:13:24
2023-03-07 18:13:25
2023-03-07 18:13:27
2023-03-07 18:13:28
2023-03-07 18:13:44
```
全てのファイルを更新せず、部分的に更新されていることが分かる。
更新されたファイルを抜き出す。
```
$ mc ls pso-portal/ -r  | grep restic |grep 18:13
[2023-03-07 18:13:27 JST]  15KiB STANDARD velero-bucket/01GTAPF9B9RQ8BR2FDTYKAKVR0/restic/pvc-test/data/00/00ef0c7dbc38ef3a98274e7dcd6185907cd7b70a20c3b33f92da90067651bc6d
[2023-03-07 18:13:23 JST]  18MiB STANDARD velero-bucket/01GTAPF9B9RQ8BR2FDTYKAKVR0/restic/pvc-test/data/65/65324e612bac440981ebc7066519d50e4aacf242f8cfb61a4cc210eab444b3ef
[2023-03-07 18:13:28 JST]  14MiB STANDARD velero-bucket/01GTAPF9B9RQ8BR2FDTYKAKVR0/restic/pvc-test/data/76/760d195084b82fc803e189296c88025591221022b3bbf6fcfa4be1c0fb19c7b0
[2023-03-07 18:13:25 JST]  16MiB STANDARD velero-bucket/01GTAPF9B9RQ8BR2FDTYKAKVR0/restic/pvc-test/data/81/8107fbcc4cc299754e2aed1d910021280d9dbe176e9d5c87a932307fd49eddb1
[2023-03-07 18:13:25 JST]  18MiB STANDARD velero-bucket/01GTAPF9B9RQ8BR2FDTYKAKVR0/restic/pvc-test/data/af/af5f6cda20277ee7c084337e154e0fc4ded379e1a315aed56d6ef7f433ba24aa
[2023-03-07 18:13:24 JST]  17MiB STANDARD velero-bucket/01GTAPF9B9RQ8BR2FDTYKAKVR0/restic/pvc-test/data/b9/b912af442b68e2be9e86042d73c1031f7a1a2a26df9cfbc8ad3572e947bf65cb
[2023-03-07 18:13:25 JST]  17MiB STANDARD velero-bucket/01GTAPF9B9RQ8BR2FDTYKAKVR0/restic/pvc-test/data/df/dff19f3d7fc61fded576c657f7cea947b582b2a62baf79bc3417ac1cf07eee30
[2023-03-07 18:13:44 JST] 3.8KiB STANDARD velero-bucket/01GTAPF9B9RQ8BR2FDTYKAKVR0/restic/pvc-test/index/1f523e690cf205243f18249c119561fced738250c7b9ce83e961d92bdbd279a8
[2023-03-07 18:13:44 JST]   355B STANDARD velero-bucket/01GTAPF9B9RQ8BR2FDTYKAKVR0/restic/pvc-test/snapshots/c4b819d5c3fc9cec398ecf43738910c09c282f76689797931ee57cdbac2aa1ac
```
上記から以下が分かる。
- 変更があった（追加された）ファイルの合計は100MB
- data以外のディレクトリとしてはindexとsnapshots以下のファイルが更新される
- data以外の更新量は微々たるもの

以上より、以下が言えそうだ。
- VeleroでResticを使ってバックアップした場合、増分バックアップが自動で有効となる
- 増分しか更新しないため、ストレージの節約やS3への転送量削減が見込める

なお、転送量を正確に測っていないため、本当に転送量が減るかは実環境で利用する際は確認して利用した方がよい。
また、注意点としてPluginによって増分バックアップに対応していないことがある（例えば[Velero Plugin for vSphere](https://github.com/vmware-tanzu/velero-plugin-for-vsphere)は増分バックアップに対応していない）。Restic以外のPluginを使う場合はその点を念頭において利用する必要がある。