Veleroを使用してDigitalOceanでKubernetesクラスタをバックアップおよび復元する方法
序章
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が含まれているはずです。
次に、cd
をvelero-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固有のリソース
Backup
、Schedule
、Restore
、Config
のカスタムリソース定義(CRD)をインストールします。 - Veleroプラグインを登録して、ブロックスナップショットとスペースストレージを管理します。
velero install
コマンドを、デフォルト以外の構成オプションを使用して実行します。 具体的には、スペース構成に一致するように、コマンドの実際の呼び出しで次の各設定を編集する必要があります。
--bucket velero-backups
:velero-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
のようになります。 リージョンの識別子は、nyc3
、sfo2
、sgp1
、および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
を指定できます。 このフラグを使用しない場合、velero
はKUBECONFIG
環境変数をチェックしてから、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-IP
とEXTERNAL-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コンテナ内に入ると、cat
Nginxアクセスログ:
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コンテナ内に入ると、cat
Nginxアクセスログ:
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-digitalocean
GitHubリポジトリにあるREADMEに基づいています。