KubernetesのデファクトバックアップツールであるVeleroではRestic Pluginをサポートしている。公式ドキュメントのRestic PluginのページではemptyDir
とかでなければ増分バックアップに対応していると記載がある。
増分バックアップが利用できれば、以下のような恩恵が受けられそうである。
- ストレージ利用量が削減できる
- S3(+互換ストレージ)への転送量が削減でき、お得になる
この記事は実際に増分バックアップが聞くかどうか検証した時のメモ。
なお、今回は以下の環境で検証したが、恐らくこれ以外の環境でも同様の検証結果を得られるとは思う。
- K8s:vSphere with Tanzu (vSphere7u3)
- S3互換ストレージ:MinIO
- Velero:Tanzu Mission Controlで構築(構築済み)
準備
こんな感じのbusyboxのコンテナを利用するPodとPVCのManifestを作成してデプロイする。
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のバケットの中身とサイズは以下のようになった。
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からリストアを実施する。
$ 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
増分バックアップが効かない場合、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は増分バックアップに対応していない)。Restic以外のPluginを使う場合はその点を念頭において利用する必要がある。