Veleroを使用してDigitalOceanでKubernetesクラスタをバックアップおよび復元する方法

提供:Dev Guides
移動先:案内検索

序章

Velero は、Kubernetesオブジェクトを圧縮してオブジェクトストレージにバックアップする、Kubernetesクラスター用の便利なバックアップツールです。 また、クラウドプロバイダーのブロックストレージスナップショット機能を使用してクラスターの永続ボリュームのスナップショットを取得し、クラスターのオブジェクトと永続ボリュームを以前の状態に復元できます。

DigitalOcean Veleroプラグインを使用すると、DigitalOceanブロックストレージを使用して永続ボリュームのスナップショットを作成し、Spacesを使用してKubernetesオブジェクトをバックアップできます。 DigitalOceanでKubernetesクラスターを実行すると、クラスターの状態をすばやくバックアップし、災害が発生した場合にクラスターを復元できます。

このチュートリアルでは、ローカルマシンでveleroコマンドラインツールをセットアップして構成し、サーバーコンポーネントをKubernetesクラスターにデプロイします。 次に、ロギングに永続ボリュームを使用するサンプルNginxアプリをデプロイしてから、ディザスタリカバリシナリオをシミュレートします。

前提条件

このチュートリアルを開始する前に、次のものを利用できるようにしておく必要があります。

ローカルコンピューターの場合:

  • クラスタに接続するように構成されたkubectlコマンドラインツール。 kubectlのインストールと設定の詳細については、公式のKubernetesドキュメントをご覧ください。
  • gitコマンドラインユーティリティ。 gitのインストール方法については、 Getting Started withGitをご覧ください。

DigitalOceanアカウントの場合:

  • DigitalOceanドロップレット上のDigitalOceanKubernetes クラスター、またはKubernetesクラスター(バージョン1.7.5以降)。
  • クラスタ内で実行されているDNSサーバー。 DigitalOcean Kubernetesを使用している場合、これはデフォルトで実行されています。 Kubernetes DNSサービスの設定の詳細については、Kuberentesの公式ドキュメントからDNSサービスのカスタマイズを参照してください。
  • バックアップされたKubernetesオブジェクトを保存するDigitalOceanスペース。 Spaceの作成方法については、Spaces製品のドキュメントを参照してください。
  • DigitalOceanSpaceのアクセスキーペア。 アクセスキーのセットを作成する方法については、スペースへの管理アクセスを管理する方法を参照してください。
  • DigitalOceanAPIで使用するための個人用アクセストークン。 パーソナルアクセストークンの作成方法については、パーソナルアクセストークンの作成方法を参照してください。 作成または使用するトークンにRead/Write権限があることを確認してください。そうしないと、スナップショットが機能しません。

これらすべてを設定したら、このガイドを開始する準備が整います。

ステップ1—Veleroクライアントのインストール

Veleroバックアップツールは、ローカルコンピューターにインストールされたクライアントと、Kubernetesクラスターで実行されるサーバーで構成されます。 まず、ローカルのVeleroクライアントをインストールします。

Webブラウザーで、Velero GitHubリポジトリリリースページに移動し、OSとシステムアーキテクチャに対応するリリースを見つけて、リンクアドレスをコピーします。 このガイドでは、ローカルマシンとしてx86-64(またはAMD64)プロセッサ上のUbuntu 18.04サーバーと、Velerov1.2.0リリースを使用します。

注:このガイドに従うには、Veleroクライアントのv1.2.0をダウンロードしてインストールする必要があります。


次に、ローカルコンピュータのコマンドラインから、一時的な/tmpディレクトリに移動してcdに移動します。

cd /tmp

wgetと前にコピーしたリンクを使用して、リリースtarballをダウンロードします。

wget https://link_copied_from_release_page

ダウンロードが完了したら、tarを使用してtarballを抽出します(ファイル名はリリースバージョンとOSによって異なる場合があります)。

tar -xvzf velero-v1.2.0-linux-amd64.tar.gz

/tmpディレクトリには、解凍したvelero-v1.2.0-linux-amd64ディレクトリと、ダウンロードしたtarballが含まれているはずです。

バイナリを実行して、veleroクライアントを実行できることを確認します。

./velero-v1.2.0-linux-amd64/velero help

次のヘルプ出力が表示されます。

OutputVelero is a tool for managing disaster recovery, specifically for Kubernetes
cluster resources. It provides a simple, configurable, and operationally robust
way to back up your application state and associated data.

If you're familiar with kubectl, Velero supports a similar model, allowing you to
execute commands such as 'velero get backup' and 'velero create schedule'. The same
operations can also be performed as 'velero backup get' and 'velero schedule create'.

Usage:
  velero [command]

Available Commands:
  backup            Work with backups
  backup-location   Work with backup storage locations
  bug               Report a Velero bug
  client            Velero client related commands
  completion        Output shell completion code for the specified shell (bash or zsh)
  create            Create velero resources
  delete            Delete velero resources
  describe          Describe velero resources
  get               Get velero resources
  help              Help about any command
  install           Install Velero
  plugin            Work with plugins
  restic            Work with restic
  restore           Work with restores
  schedule          Work with schedules
  snapshot-location Work with snapshot locations
  version           Print the velero version and associated image
. . .

この時点で、velero実行可能ファイルを一時的な/tmpディレクトリから移動し、PATHに追加する必要があります。 UbuntuシステムのPATHに追加するには、/usr/local/binにコピーするだけです。

sudo mv velero-v1.2.0-linux-amd64/velero /usr/local/bin/velero

これで、Veleroサーバーのシークレットを設定し、それをKubernetesクラスターにデプロイする準備が整いました。

ステップ2—シークレットの構成

Veleroのサーバーコンポーネントを設定する前に、DigitalOceanSpacesキーとAPIトークンを準備する必要があります。 cdコマンドを使用して、一時ディレクトリ/tmpに再度移動します。

cd /tmp

次に、DigitalOcean用のVeleroプラグインのコピーをダウンロードします。 プラグインのGithubリリースページにアクセスし、.tar.gzで終わるファイルへのリンクをコピーします。

wgetと前にコピーしたリンクを使用して、リリースtarballをダウンロードします。

wget https://link_copied_from_release_page

ダウンロードが完了したら、tarを使用してtarballを抽出します(ファイル名はリリースバージョンによって異なる場合があることに注意してください)。

tar -xvzf v1.0.0.tar.gz

/tmpディレクトリには、解凍したvelero-plugin-1.0.0ディレクトリと、ダウンロードしたtarballが含まれているはずです。

次に、cdvelero-plugin-1.0.0ディレクトリに配置します。

cd velero-plugin-1.0.0

これで、DigitalOcean SpaceのアクセスキーとAPIトークンを保存して、Kubernetesシークレットとして使用できるようになりました。 まず、お気に入りのエディタを使用してexamples/cloud-credentialsファイルを開きます。

nano examples/cloud-credentials

ファイルは次のようになります。

/tmp/velero-plugin-1.0.0/examples/cloud-credentials

[default]
aws_access_key_id=<AWS_ACCESS_KEY_ID>
aws_secret_access_key=<AWS_SECRET_ACCESS_KEY>

<AWS_ACCESS_KEY_ID>および<AWS_SECRET_ACCESS_KEY>プレースホルダーを編集して、DigitalOceanSpacesキーを使用します。 必ず<>の文字を削除してください。

次のステップは、01-velero-secret.patch.yamlファイルを編集して、DigitalOceanAPIトークンが含まれるようにすることです。 お気に入りのエディターでファイルを開きます。

nano examples/01-velero-secret.patch.yaml

次のようになります。

---
apiVersion: v1
kind: Secret
stringData:
digitalocean_token: <DIGITALOCEAN_API_TOKEN>
type: Opaque

<DIGITALOCEAN_API_TOKEN>プレースホルダー全体を変更して、DigitalOceanパーソナルAPIトークンを使用します。 線はdigitalocean_token: 18a0d730c0e0....のようになります。 繰り返しになりますが、<および>の文字を必ず削除してください。

ステップ3—Veleroサーバーのインストール

Veleroのインストールは、バックアップを作成、スケジュール、および管理するためにすべてが連携して機能する多数のKubernetesオブジェクトで構成されています。 ダウンロードしたvelero実行可能ファイルは、これらのオブジェクトを生成してインストールできます。 velero installコマンドは、クラスターをバックアップできるようにするための予備的なセットアップ手順を実行します。 具体的には、次のようになります。

  • velero名前空間を作成します。
  • veleroサービスアカウントを追加します。
  • veleroサービスアカウントにアクセス許可を付与するように、役割ベースのアクセス制御(RBAC)ルールを構成します。
  • Velero固有のリソースBackupScheduleRestoreConfigのカスタムリソース定義(CRD)をインストールします。
  • Veleroプラグインを登録して、ブロックスナップショットとスペースストレージを管理します。

velero installコマンドを、デフォルト以外の構成オプションを使用して実行します。 具体的には、スペース構成に一致するように、コマンドの実際の呼び出しで次の各設定を編集する必要があります。

  • --bucket velero-backupsvelero-backupsの値を、DigitalOceanスペースの名前と一致するように変更します。 たとえば、Spaceを「backup-bucket」と呼んだ場合、オプションは次のようになります。--bucket backup-bucket
  • --backup-location-config s3Url=https://nyc3.digitaloceanspaces.com,region=nyc3:スペースの設定に一致するようにURLとリージョンを変更します。 具体的には、nyc3の両方の部分を編集して、スペースがホストされているリージョンに一致させます。 たとえば、Spaceがfra1リージョンでホストされている場合、行は--backup-location-config s3Url=https://fra1.digitaloceanspaces.com,region=fra1のようになります。 リージョンの識別子は、nyc3sfo2sgp1、およびfra1です。

適切なバケットとバックアップの場所の設定の準備ができたら、Veleroをインストールします。 次のコマンドを実行し、必要に応じて値を置き換えます。

velero install \
  --provider velero.io/aws \
  --bucket velero-backups \
  --plugins velero/velero-plugin-for-aws:v1.0.0,digitalocean/velero-plugin:v1.0.0 \
  --backup-location-config s3Url=https://nyc3.digitaloceanspaces.com,region=nyc3 \
  --use-volume-snapshots=false \
  --secret-file ./examples/cloud-credentials

次の出力が表示されます。

OutputCustomResourceDefinition/backups.velero.io: attempting to create resource
CustomResourceDefinition/backups.velero.io: created
CustomResourceDefinition/backupstoragelocations.velero.io: attempting to create resource
CustomResourceDefinition/backupstoragelocations.velero.io: created
CustomResourceDefinition/deletebackuprequests.velero.io: attempting to create resource
CustomResourceDefinition/deletebackuprequests.velero.io: created
CustomResourceDefinition/downloadrequests.velero.io: attempting to create resource
CustomResourceDefinition/downloadrequests.velero.io: created
CustomResourceDefinition/podvolumebackups.velero.io: attempting to create resource
CustomResourceDefinition/podvolumebackups.velero.io: created
CustomResourceDefinition/podvolumerestores.velero.io: attempting to create resource
CustomResourceDefinition/podvolumerestores.velero.io: created
CustomResourceDefinition/resticrepositories.velero.io: attempting to create resource
CustomResourceDefinition/resticrepositories.velero.io: created
CustomResourceDefinition/restores.velero.io: attempting to create resource
CustomResourceDefinition/restores.velero.io: created
CustomResourceDefinition/schedules.velero.io: attempting to create resource
CustomResourceDefinition/schedules.velero.io: created
CustomResourceDefinition/serverstatusrequests.velero.io: attempting to create resource
CustomResourceDefinition/serverstatusrequests.velero.io: created
CustomResourceDefinition/volumesnapshotlocations.velero.io: attempting to create resource
CustomResourceDefinition/volumesnapshotlocations.velero.io: created
Waiting for resources to be ready in cluster...
Namespace/velero: attempting to create resource
Namespace/velero: created
ClusterRoleBinding/velero: attempting to create resource
ClusterRoleBinding/velero: created
ServiceAccount/velero: attempting to create resource
ServiceAccount/velero: created
Secret/cloud-credentials: attempting to create resource
Secret/cloud-credentials: created
BackupStorageLocation/default: attempting to create resource
BackupStorageLocation/default: created
Deployment/velero: attempting to create resource
Deployment/velero: created
Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.

出力からkubectlコマンドを使用して、展開ログを監視できます。 デプロイの準備ができたら、サーバーの構成である次のステップに進むことができます。 正常なデプロイは次のようになります(異なるAGE列を使用)。

kubectl get deployment/velero --namespace velero
OutputNAME     READY   UP-TO-DATE   AVAILABLE   AGE
velero   1/1     1            1           2m

この時点で、VeleroのサーバーコンポーネントをデプロイとしてKubernetesクラスターにインストールしました。 また、Kubernetesシークレットを使用してSpacesキーをVeleroに登録しました。

注:veleroコマンドラインツールが--kubeconfigフラグで使用するkubeconfigを指定できます。 このフラグを使用しない場合、veleroKUBECONFIG環境変数をチェックしてから、kubectlのデフォルト(~/.kube/config)にフォールバックします。


ステップ4—スナップショットの構成

Veleroサーバーをインストールしたとき、オプション--use-volume-snapshots=falseはコマンドの一部でした。 Kubernetesクラスター内の基盤となるブロックストレージデバイスのスナップショットを撮りたいので、VeleroにDigitalOceanブロックストレージ用の正しいプラグインを使用するように指示する必要があります。

次のコマンドを実行してプラグインを有効にし、デフォルトのスナップショットプロバイダーとして登録します。

velero snapshot-location create default --provider digitalocean.com/velero

次の出力が表示されます。

OutputSnapshot volume location "default" configured successfully.

ステップ5—APIトークンを追加する

前の手順では、Veleroサーバーにブロックストレージオブジェクトとオブジェクトストレージオブジェクトを作成しました。 digitalocean/velero-plugin:v1.0.0プラグインをサーバーに登録し、Spacesの秘密鍵をクラスターにインストールしました。

最後のステップは、DigitalOceanAPIトークンを使用するために以前に作成したcloud-credentialsシークレットにパッチを適用することです。 このトークンがないと、スナップショットプラグインはDigitalOceanAPIで認証できません。

kubectl editコマンドを使用して、APIトークンを参照してVeleroDeploymentオブジェクトを変更できます。 ただし、複雑なYAMLオブジェクトを手動で編集するのは面倒で、エラーが発生しやすくなります。 代わりに、Kubernetesはパッチオブジェクトをサポートしているため、kubectl patchコマンドを使用します。 適用するパッチファイルの内容を簡単に見てみましょう。

最初のパッチファイルは、前に編集したexamples/01-velero-secret.patch.yamlファイルです。 これは、スペースキーがすでに含まれているsecrets/cloud-credentialsシークレットにAPIトークンを追加するように設計されています。 catファイル:

cat examples/01-velero-secret.patch.yaml

次のようになります(<DIGITALOCEAN_API_TOKEN>プレースホルダーの代わりにトークンを使用):

例/01-velero-secret.patch.yaml

. . .
---
apiVersion: v1
kind: Secret
stringData:
  digitalocean_token: <DIGITALOCEAN_API_TOKEN>
type: Opaque

次に、デプロイメントのパッチファイルを見てみましょう。

cat examples/02-velero-deployment.patch.yaml

次のYAMLが表示されます。

例/02-velero-deployment.patch.yaml

. . .
---
apiVersion: v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      - args:
        - server
        command:
        - /velero
        env:
        - name: DIGITALOCEAN_TOKEN
          valueFrom:
            secretKeyRef:
              key: digitalocean_token
              name: cloud-credentials
        name: velero

このファイルは、veleroと呼ばれるDeploymentのポッド仕様にパッチを適用していることを示しています。 これはパッチであるため、Kubernetesオブジェクトの仕様全体またはメタデータを指定する必要はありません。 この場合、Velero Deploymentは、velero installコマンドによって作成されたため、cloud-credentialsシークレットを使用してすでに構成されています。 したがって、このパッチで行う必要があるのは、digitalocean_tokenを環境変数としてすでにデプロイされているVeleroポッドに登録することだけです。

kubectl patchコマンドを使用して、最初のシークレットパッチを適用してみましょう。

kubectl patch secret/cloud-credentials -p "$(cat examples/01-velero-secret.patch.yaml)" --namespace velero

次の出力が表示されます。

Outputsecret/cloud-credentials patched

最後に、デプロイメントにパッチを適用します。 次のコマンドを実行します。

kubectl patch deployment/velero -p "$(cat examples/02-velero-deployment.patch.yaml)" --namespace velero

パッチが成功すると、次のように表示されます。

Outputdeployment.apps/velero patched

velero名前空間でkubectl getを使用して、パッチが適用された展開が機能していることを確認しましょう。

kubectl get deployment/velero --namespace velero

次の出力が表示されます。

OutputNAME     READY   UP-TO-DATE   AVAILABLE   AGE
velero   1/1     1            1           12s

この時点で、Veleroは実行され、完全に構成されており、Kubernetesクラスターオブジェクトと永続ボリュームをDigitalOceanSpacesとBlockStorageにバックアップおよび復元する準備ができています。

次のセクションでは、簡単なテストを実行して、バックアップと復元の機能が期待どおりに機能することを確認します。

ステップ6—バックアップと復元の手順のテスト

Veleroのインストールと構成が正常に完了したので、永続ボリュームとサービスを使用してテスト用のNginxデプロイメントを作成できます。 展開が実行されたら、バックアップと復元のドリルを実行して、Veleroが正しく構成され、機能していることを確認します。

/tmp/velero-plugin-1.0.0ディレクトリで作業していることを確認してください。 examplesディレクトリには、nginx-example.yamlと呼ばれるサンプルのNginxマニフェストが含まれています。

選択したエディターを使用してこのファイルを開きます。

nano examples/nginx-example.yaml

次のテキストが表示されます。

Output. . .
---
apiVersion: v1
kind: Namespace
metadata:
  name: nginx-example
  labels:
    app: nginx

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nginx-logs
  namespace: nginx-example
  labels:
    app: nginx
spec:
  storageClassName: do-block-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  namespace: nginx-example
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      volumes:
        - name: nginx-logs
          persistentVolumeClaim:
           claimName: nginx-logs
      containers:
      - image: nginx:stable
        name: nginx
        ports:
        - containerPort: 80
        volumeMounts:
          - mountPath: "/var/log/nginx"
            name: nginx-logs
            readOnly: false

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: nginx-svc
  namespace: nginx-example
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer

このファイルでは、次の仕様を確認しています。

  • nginx-exampleと呼ばれるNginx名前空間
  • nginx:stableコンテナイメージの単一のレプリカで構成されるNginxデプロイメント
  • do-block-storage StorageClassを使用した5Gi永続ボリュームクレーム(nginx-logsと呼ばれる)
  • ポート80を公開するLoadBalancerサービス

kubectl applyを使用してオブジェクトを作成します。

kubectl apply -f examples/nginx-example.yaml

次の出力が表示されます。

Outputnamespace/nginx-example created
persistentvolumeclaim/nginx-logs created
deployment.apps/nginx-deploy created
service/nginx-svc created

展開が成功したことを確認します。

kubectl get deployments --namespace=nginx-example

次の出力が表示されます。

OutputNAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   1/1     1            1           1m23s

Availableが1に達すると、kubectl getを使用してNginxロードバランサーの外部IPをフェッチします。

kubectl get services --namespace=nginx-example

my-nginxサービスの内部CLUSTER-IPEXTERNAL-IPの両方が表示されます。

OutputNAME        TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
nginx-svc   LoadBalancer   10.245.147.61   159.203.48.191   80:30232/TCP   3m1s

EXTERNAL-IPに注意し、Webブラウザを使用してそこに移動します。

次のNGINXウェルカムページが表示されます。

これは、Nginxのデプロイとサービスが稼働していることを示しています。

災害シナリオをシミュレートする前に、まずNginxアクセスログ(Nginxポッドに接続された永続ボリュームに保存されている)を確認しましょう。

kubectl getを使用してポッドの名前を取得します。

kubectl get pods --namespace nginx-example
OutputNAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-694c85cdc8-vknsk   1/1     Running   0          4m14s

ここで、execを実行中のNginxコンテナーに入れて、その中にシェルを取得します。

kubectl exec -it nginx-deploy-694c85cdc8-vknsk --namespace nginx-example -- /bin/bash

Nginxコンテナ内に入ると、catNginxアクセスログ:

cat /var/log/nginx/access.log

いくつかのNginxアクセスエントリが表示されます。

Output10.244.0.119 - - [03/Jan/2020:04:43:04 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"
10.244.0.119 - - [03/Jan/2020:04:43:04 +0000] "GET /favicon.ico HTTP/1.1" 404 153 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"

これらをメモして(特にタイムスタンプ)、復元手順の成功を確認するために使用します。 ポッドを終了します。

exit

これで、バックアップ手順を実行して、すべてのnginx KubernetesオブジェクトをSpacesにコピーし、Nginxのデプロイ時に作成した永続ボリュームのスナップショットを取得できます。

veleroコマンドラインクライアントを使用して、nginx-backupというバックアップを作成します。

velero backup create nginx-backup --selector app=nginx

--selector app=nginxは、app=nginxラベルセレクターを使用してKubernetesオブジェクトのみをバックアップするようにVeleroサーバーに指示します。

次の出力が表示されます。

OutputBackup request "nginx-backup" submitted successfully.
Run `velero backup describe nginx-backup` or `velero backup logs nginx-backup` for more details.

velero backup describe nginx-backup --detailsを実行すると、少し遅れて次の出力が得られます。

OutputName:         nginx-backup
Namespace:    velero
Labels:       velero.io/backup=nginx-backup
              velero.io/pv=pvc-6b7f63d7-752b-4537-9bb0-003bed9129ca
              velero.io/storage-location=default
Annotations:  <none>

Phase:  Completed

Namespaces:
  Included:  *
  Excluded:  <none>

Resources:
  Included:        *
  Excluded:        <none>
  Cluster-scoped:  auto

Label selector:  app=nginx

Storage Location:  default

Snapshot PVs:  auto

TTL:  720h0m0s

Hooks:  <none>

Backup Format Version:  1

Started:    2020-01-02 23:45:30 -0500 EST
Completed:  2020-01-02 23:45:34 -0500 EST

Expiration:  2020-02-01 23:45:30 -0500 EST

Resource List:
  apps/v1/Deployment:
    - nginx-example/nginx-deploy
  apps/v1/ReplicaSet:
    - nginx-example/nginx-deploy-694c85cdc8
  v1/Endpoints:
    - nginx-example/nginx-svc
  v1/Namespace:
    - nginx-example
  v1/PersistentVolume:
    - pvc-6b7f63d7-752b-4537-9bb0-003bed9129ca
  v1/PersistentVolumeClaim:
    - nginx-example/nginx-logs
  v1/Pod:
    - nginx-example/nginx-deploy-694c85cdc8-vknsk
  v1/Service:
    - nginx-example/nginx-svc

Persistent Volumes:
  pvc-6b7f63d7-752b-4537-9bb0-003bed9129ca:
    Snapshot ID:        dfe866cc-2de3-11ea-9ec0-0a58ac14e075
    Type:               ext4
    Availability Zone:  
    IOPS:               <N/A>

この出力は、nginx-backupが正常に完了したことを示しています。 リソースのリストには、バックアップに含まれていた各Kubernetesオブジェクトが表示されます。 最後のセクションでは、ファイルシステムのスナップショットを使用してPersistentVolumeもバックアップされたことを示しています。

DigitalOceanクラウドコントロールパネル内から確認するには、Kubernetesバックアップファイルを含むスペースに移動します。

Veleroバックアップファイルを含むnginx-backupという新しいディレクトリが表示されます。

左側のナビゲーションバーを使用して、画像スナップショットの順に移動します。 スナップショット内で、ボリュームに移動します。 上記の出力にリストされているPVCに対応するスナップショットが表示されます。

これで、復元手順をテストできます。

まず、nginx-example名前空間を削除しましょう。 これにより、ロードバランサーや永続ボリュームなど、ネームスペース内のすべてが削除されます。

kubectl delete namespace nginx-example

ロードバランサーエンドポイントでNginxにアクセスできなくなったこと、およびnginx-exampleデプロイメントが実行されていないことを確認します。

kubectl get deployments --namespace=nginx-example
OutputNo resources found in nginx-example namespace.

これで、もう一度veleroクライアントを使用して、復元手順を実行できます。

velero restore create --from-backup nginx-backup

ここでは、createを使用して、nginx-backupオブジェクトからVeleroRestoreオブジェクトを作成します。

次の出力が表示されます。

OutputRestore request "nginx-backup-20200102235032" submitted successfully.
Run `velero restore describe nginx-backup-20200102235032` or `velero restore logs nginx-backup-20200102235032` for more details.

復元されたデプロイメントのステータスを確認します。

kubectl get deployments --namespace=nginx-example
OutputNAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   1/1     1            1           58s

永続ボリュームの作成を確認します。

 kubectl get pvc --namespace=nginx-example
OutputNAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
nginx-logs   Bound    pvc-6b7f63d7-752b-4537-9bb0-003bed9129ca   5Gi        RWO            do-block-storage   75s

復元により、LoadBalancerも作成されました。 サービスが新しいIPアドレスで再作成される場合があります。 EXTERNAL-IPアドレスをもう一度見つける必要があります。

kubectl get services --namespace nginx-example
OutputNAME        TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
nginx-svc   LoadBalancer   10.245.15.83   159.203.48.191   80:31217/TCP   97s

Nginxサービスの外部IPにもう一度移動して、Nginxが稼働していることを確認します。

最後に、復元された永続ボリュームのログをチェックして、復元後にログ履歴が保存されていることを確認します。

これを行うには、kubectl getを使用してポッドの名前をもう一度取得します。

kubectl get pods --namespace nginx-example
OutputNAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-694c85cdc8-vknsk   1/1     Running   0          2m20s

次に、execをその中に入れます。

kubectl exec -it nginx-deploy-694c85cdc8-vknsk --namespace nginx-example -- /bin/bash

Nginxコンテナ内に入ると、catNginxアクセスログ:

cat /var/log/nginx/access.log
Output10.244.0.119 - - [03/Jan/2020:04:43:04 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"
10.244.0.119 - - [03/Jan/2020:04:43:04 +0000] "GET /favicon.ico HTTP/1.1" 404 153 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"

同じバックアップ前のアクセス試行(タイムスタンプに注意)が表示され、永続ボリュームの復元が成功したことが確認されます。 復元を実行した後にNginxランディングページにアクセスした場合、ログに追加の試行が行われる可能性があることに注意してください。

この時点で、KubernetesオブジェクトをDigitalOcean Spacesに正常にバックアップし、ブロックストレージボリュームスナップショットを使用して永続ボリュームをバックアップしました。 災害シナリオをシミュレートし、テストNginxアプリケーションへのサービスを復元しました。

結論

このガイドでは、VeleroKubernetesバックアップツールをDigitalOceanベースのKubernetesクラスターにインストールして構成しました。 KubernetesオブジェクトをDigitalOceanSpacesにバックアップし、Block StorageVolumeSnapshotsを使用して永続ボリュームをバックアップするようにツールを構成しました。

Veleroを使用して、ディザスタリカバリのためにKubernetesクラスタの定期的なバックアップをスケジュールすることもできます。 これを行うには、velero scheduleコマンドを使用できます。 Veleroを使用して、あるクラスターから別のクラスターにリソースを移行することもできます。

DigitalOcean Spacesの詳細については、公式Spacesドキュメントを参照してください。 ブロックストレージボリュームの詳細については、ブロックストレージボリュームのドキュメントを参照してください。

このチュートリアルは、StackPointCloudのark-plugin-digitaloceanGitHubリポジトリにあるREADMEに基づいています。