スタンドアローンの Velero と Restic を使用して、TKG クラスタで実行されているワークロードをバックアップおよびリストアできます。これは Velero Plugin for vSphere を使用する代わりの方法です。スタンドアローンの Velero は、主に移植性が必要な場合に利用します。ステートフル ワークロードには、Restic が必要です。

前提条件

スタンドアローンの Velero と Restic を使用して TKG クラスタでワークロードをバックアップおよびリストアするには、ターゲット クラスタにスタンドアローン バージョンの Velero と Restic をインストールする必要があります。リストアを別のターゲット クラスタで実行する場合は、ターゲット クラスタにも Velero と Restic をインストールする必要があります。TKG クラスタへのスタンドアローン Velero と Restic のインストールと構成を参照してください。

TKG クラスタで実行されているステートレス アプリケーションのバックアップ

TKG クラスタで実行されているステートレス アプリケーションをバックアップするには、Velero を使用する必要があります。

この例では、サンプル ステートレス アプリケーションの名前空間にすべてのアプリケーション コンポーネントがある場合に、 --include namespaces タグを使用して、そのサンプル ステートレス アプリケーションをバックアップおよびリストアする方法を示します。
velero backup create example-backup --include-namespaces example-backup
次の内容が表示されます。
Backup request "example-backup" submitted successfully.
Run `velero backup describe example-backup` or `velero backup logs example-backup` for more details.
作成されたバックアップを確認します。
velero backup get
velero backup describe example-backup

MinIO サーバなどの S3 互換オブジェクト ストアの Velero バケットを確認します。

Velero は Kubernetes カスタム リソース定義 (CRD) にメタデータを書き込みます。
kubectl get crd
Velero CRD では、次のような特定のコマンドを実行できます。
kubectl get backups.velero.io -n velero
kubectl describe backups.velero.io guestbook-backup -n velero

TKG クラスタで実行されているステートレス アプリケーションのリストア

TKG クラスタで実行されているステートレス アプリケーションをリストアするには、Velero を使用する必要があります。

サンプル アプリケーションのリストアをテストするために、サンプル アプリケーションを削除します。

名前空間を削除します。
kubectl delete ns guestbook
namespace "guestbook" deleted
アプリケーションをリストアします。
velero restore create --from-backup example-backup
次の内容が表示されます。
Restore request "example-backup-20200721145620" submitted successfully.
Run `velero restore describe example-backup-20200721145620` or `velero restore logs example-backup-20200721145620` for more details.
アプリケーションがリストアされたことを確認します。
velero restore describe example-backup-20200721145620
検証のために、次のコマンドを実行します。
velero restore get
kubectl get ns
kubectl get pod -n example
kubectl get svc -n example

TKG クラスタで実行されているステートフル アプリケーションのバックアップ

TKG クラスタで実行されているステートフル アプリケーションをバックアップする場合は、保存されているアプリケーション メタデータとアプリケーション データの両方をパーシステント ボリュームにバックアップする必要があります。これを行うには、Velero と Restic の両方が必要です。

この例では、Guestbook アプリケーションを使用します。Guestbook アプリケーションは、TKG クラスタにデプロイされているものと想定します。TKG クラスタへの Guestbook アプリケーションのデプロイを参照してください。

ステートフルなバックアップとリストアを説明するために、フロントエンド Web ページを使用してメッセージを Guestbook アプリケーションに送信し、そのメッセージが保存されるようにしてみましょう。例:

送信したメッセージは、保存するメッセージのリストに表示されます。

この例では、 --include namespace タグやポッドの注釈を使用して、Guestbook アプリケーションをバックアップおよびリストアする方法を示します。
注: この例では、注釈を使用します。ただし、Velero バージョン 1.5 以降では、注釈は不要になりました。注釈を使用しないようにするには、バックアップの作成時に --default-volumes-to-restic オプションを使用してください。これにより、すべての PV が Restic を使用して自動的にバックアップされます。詳細については https://velero.io/docs/v1.5/restic/を参照してください。
バックアップ手順を開始するために、ポッドの名前を取得します。
kubectl get pod -n guestbook
例:
kubectl get pod -n guestbook

NAME                                            READY   STATUS    RESTARTS   AGE
guestbook-frontend-deployment-85595f5bf9-h8cff  1/1     Running            0          55m
guestbook-frontend-deployment-85595f5bf9-lw6tg  1/1     Running            0          55m
guestbook-frontend-deployment-85595f5bf9-wpqc8  1/1     Running            0          55m
redis-leader-deployment-64fb8775bf-kbs6s        1/1     Running            0          55m
redis-follower-deployment-84cd76b975-jrn8v      1/1     Running            0          55m
redis-follower-deployment-69df9b5688-zml4f      1/1     Running            0          55m

パーシステント ボリュームが Redis ポッドに接続されます。これらのステートフル ポッドは、Restic を使用してバックアップします。このため、volumeMount の名前を使用して、ステートフル ポッドに注釈を追加する必要があります。

ステートフル ポッドに注釈を付けるには、 volumeMount を知る必要があります。 mountName を取得するには、次のコマンドを実行します。
kubectl describe pod redis-leader-deployment-64fb8775bf-kbs6s -n guestbook

結果には、redis-leader-data からの Containers.leader.Mounts: /data が表示されます。この最後のトークンが、リーダー ポッドの注釈に使用する volumeMount 名です。フォロワーの場合は、redis-follower-data になります。volumeMount 名は、ソース YAML から取得することもできます。

各 Redis ポッドに注釈を付けます。次に例を示します。
kubectl -n guestbook annotate pod redis-leader-64fb8775bf-kbs6s backup.velero.io/backup-volumes=redis-leader-data
次の内容が表示されます。
pod/redis-leader-64fb8775bf-kbs6s annotated
注釈を確認します。
kubectl -n guestbook describe pod redis-leader-64fb8775bf-kbs6s | grep Annotations
Annotations:  backup.velero.io/backup-volumes: redis-leader-data
kubectl -n guestbook describe pod redis-follower-779b6d8f79-5dphr | grep Annotations
Annotations:  backup.velero.io/backup-volumes: redis-follower-data
Velero バックアップを実行します。
velero backup create guestbook-backup --include-namespaces guestbook
次の内容が表示されます。
Backup request "guestbook-backup" submitted successfully.
Run `velero backup describe guestbook-pv-backup` or `velero backup logs guestbook-pv-backup` for more details.
作成されたバックアップを確認します。
velero backup get

NAME                  STATUS      ERRORS   WARNINGS   CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
guestbook-backup      Completed   0        0          2020-07-23 16:13:46 -0700 PDT   29d       default            <none>
バックアップの詳細を確認します。
velero backup describe guestbook-backup --details
Velero では、他にも次のようなコマンドを実行できます。
kubectl get backups.velero.io -n velero

NAME               AGE
guestbook-backup   4m58s
次のコマンドも実行できます。
kubectl describe backups.velero.io guestbook-backup -n velero

TKG 2.0 クラスタで実行されているステートフル アプリケーションのリストア

TKG クラスタで実行されるステートフル アプリケーションをリストアする場合は、保存されているアプリケーション メタデータとアプリケーション データの両方をパーシステント ボリュームにリストアする必要があります。これを行うには、Velero と Restic の両方が必要です。

この例では、前のセクションの説明に従ってステートフル Guestbook アプリケーションをバックアップしたものと想定しています。

ステートフル アプリケーションのリストアをテストするために、その名前空間を削除します。
kubectl delete ns guestbook
namespace "guestbook" deleted
アプリケーションが削除されたことを確認します。
kubectl get ns
kubectl get pvc,pv --all-namespaces
バックアップからアプリケーションをリストアするには、次のコマンド構文を使用します。
velero restore create --from-backup <velero-backup-name>
例:
velero restore create --from-backup guestbook-backup
次のようなメッセージが表示されます。
Restore request "guestbook-backup-20200723161841" submitted successfully.
Run `velero restore describe guestbook-backup-20200723161841` or `velero restore logs guestbook-backup-20200723161841` for more details.
ステートフル Guestbook アプリケーションがリストアされたことを確認します。
velero restore describe guestbook-backup-20200723161841

Name:         guestbook-backup-20200723161841
Namespace:    velero
Labels:       <none>
Annotations:  <none>

Phase:  Completed

Backup:  guestbook-backup

Namespaces:
  Included:  all namespaces found in the backup
  Excluded:  <none>

Resources:
  Included:        *
  Excluded:        nodes, events, events.events.k8s.io, backups.velero.io, restores.velero.io, resticrepositories.velero.io
  Cluster-scoped:  auto

Namespace mappings:  <none>

Label selector:  <none>

Restore PVs:  auto

Restic Restores (specify --details for more information):
  Completed:  3
さらに次のコマンドを実行して、リストアを確認します。
velero restore get

NAME                                 BACKUP                STATUS      ERRORS   WARNINGS   CREATED                         SELECTOR
guestbook-backup-20200723161841      guestbook-backup      Completed   0        0          2021-08-11 16:18:41 -0700 PDT   <none>
名前空間がリストアされたことを確認します。
kubectl get ns

NAME              STATUS   AGE
default           Active   16d
guestbook         Active   76s
...
velero            Active   2d2h
アプリケーションがリストアされたことを確認します。
vkubectl get all -n guestbook

NAME                                READY   STATUS    RESTARTS   AGE
pod/frontend-6cb7f8bd65-h2pnb       1/1     Running   0          6m27s
pod/frontend-6cb7f8bd65-kwlpr       1/1     Running   0          6m27s
pod/frontend-6cb7f8bd65-snwl4       1/1     Running   0          6m27s
pod/redis-leader-64fb8775bf-kbs6s   1/1     Running   0          6m28s
pod/redis-follower-779b6d8f79-5dphr 1/1     Running   0          6m28s
pod/redis-follower-899c7e2z65-8apnk 1/1     Running   0          6m28s

NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
service/guestbook-frontend           LoadBalancer   10.10.89.59      10.19.15.99     80:31513/TCP   65s
service/redis-follower               ClusterIP      10.111.163.189   <none>          6379/TCP       65s
service/redis-leader                 ClusterIP      10.111.70.189    <none>          6379/TCP       65s

NAME                                            READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/guestbook-frontend-deployment   3/3     3            3           65s
deployment.apps/redis-follower-deployment       1/2     2            1           65s
deployment.apps/redis-leader-deployment         1/1     1            1           65s

NAME                                                       DESIRED   CURRENT   READY   AGE
replicaset.apps/guestbook-frontend-deployment-56fc5b6b47   3         3         3       65s
replicaset.apps/redis-follower-deployment-6fc9cf5759       2         2         1       65s
replicaset.apps/redis-leader-deployment-7d89bbdbcf         1         1         1       65s
パーシステント ボリュームがリストアされたことを確認します。
kubectl get pvc,pv -n guestbook

NAME                                       STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/redis-leader-claim   Bound    pvc-a2f6e6d4-42db-4fb8-a198-5379a2552509   2Gi        RWO            thin-disk      2m40s
persistentvolumeclaim/redis-follower-claim Bound    pvc-55591938-921f-452a-b418-2cc680c0560b   2Gi        RWO            thin-disk      2m40s

NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                             STORAGECLASS   REASON   AGE
persistentvolume/pvc-55591938-921f-452a-b418-2cc680c0560b   2Gi        RWO            Delete           Bound    guestbook/redis-follower-claim    thin-disk               2m40s
persistentvolume/pvc-a2f6e6d4-42db-4fb8-a198-5379a2552509   2Gi        RWO            Delete           Bound    guestbook/redis-leader-claim      thin-disk               2m40s

最後に、guestbook-frontend サービスの外部 IP アドレスを使用して Guestbook フロントエンドにアクセスし、チュートリアルの最初に送信したメッセージがリストアされたことを確認します。例:

リストアされたメッセージのリスト。