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-storageStorageClassを使用した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コンテナ内に入ると、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に基づいています。