こんにちは、ソリューションアーキテクトの有馬です。
今回はVeleroを使用して、Container Service for Kubernetes (ACK) のバックアップを試してみたいと思います。
はじめに
Kubernetesを利用した環境では、マニフェストへ必要なリソースを定義し、Git等で管理を行う事で容易にアプリケーションのデプロイを行えるようしている場合が多いかと思います。
マニフェストの利用と合わせて、Kubernetesクラスタ上へデプロイされたアプリケーション等の環境を、バックアップしておきたいケースもあるのではないでしょうか。
Container Service for Kubernetes (ACK) では、Veleroを使用してバックアップ・リストアの実行が可能です。
Veleroについて
Velero(以前はHeptio Ark)はKubernetesクラスタリソースのバックアップ・リストアを行うツールです。
現在はVMwareのOpen Source Projectsとして開発されており、複数のプロバイダーがサポートされています。
サポートされている機能は大まかに以下のような内容となっています。
-
・バックアップとリストア
- - クラスタリソース
- - 永続ボリューム(スナップショットを利用します)
- ・バックアップのスケジューリング
- ・バックアップフック
Alibaba CloudのContainer Service for Kubernetes (ACK) でVeleroを使用する場合、コミュニティーから提供されているVelero Pluginを利用します。
今回はそちらを設定し、Kubernetesクラスタ上のリソースを、Alibaba Cloudのオブジェクトストレージサービス(OSS) へバックアップし、
リストアしてみたいと思います。
インストールと各種設定
Alibaba CloudでVeleroを利用する場合のインストールや、バックアップ・リストア等の手順は、Alibaba CloudのGithubリポジトリへ手順がありますので、
今回はその内容に従って進めて行きます。
OSSバケットの準備
バックアップファイルがアップロードされるOSSへ、バケットを作成しておきます。
今回は「ack-backup」という名前で作成しました。
Velero CLIのインストール
Githubから最新のVelero CLIをインストールします。
CLIはPATHが通っているディレクトリへ設置します。
# wget https://github.com/vmware-tanzu/velero/releases/download/v1.3.2/velero-v1.3.2-linux-amd64.tar.gz # tar zxvf velero-v1.3.2-linux-amd64.tar.gz # mv velero-v1.3.2-linux-amd64/velero /usr/local/bin/
RAMユーザの作成
Alibaba Cloudの各APIを実行する為のRAMユーザを作成し、Cloud Disk, Snapshot, OSSへのアクセス権限ポリシーを適応します。
作成したRAMユーザへ、後ほど設定するAccessKeyも作成しておきます。
カスタムポリシー
{ "Version": "1", "Statement": [ { "Action": [ "ecs:DescribeSnapshots", "ecs:CreateSnapshot", "ecs:DeleteSnapshot", "ecs:DescribeDisks", "ecs:CreateDisk", "ecs:Addtags", "oss:PutObject", "oss:GetObject", "oss:DeleteObject", "oss:GetBucket", "oss:ListObjects" ], "Resource": [ "*" ], "Effect": "Allow" } ] }
Credential 設定
GithubからAlibaba CloudのVelero Pluginリポジトリをローカルへダウンロードします。
# git clone https://github.com/AliyunContainerService/velero-plugin.git
ダウンロードしたリポジトリの設定ファイル「credentials-velero」へ、作成したAccessKeyIDとAccessKeySecretを作成します。
velero-plugin/install/credentials-velero
ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
変数設定
作成した OSS のバケット名とリージョンを変数へ設定します。
# BUCKET=ack-backup # REGION=ap-northeast-1
NamespaceとSecret 作成
Veleroをインストールする為のNamespace を作成します。
# kubectl create namespace velero
AccessKeyIDとAccessKeySecretを設定したファイルを指定し、Secretを作成します。
# kubectl create secret generic cloud-credentials --namespace velero --from-file cloud=install/credentials-velero
NamespaceとAccessKeyのSecretが作成されました。
# kubectl get ns velero NAME STATUS AGE velero Active 2m52s # kubectl get secret cloud-credentials -n velero NAME TYPE DATA AGE cloud-credentials Opaque 1 108s
VeleroとPluginインストール
CustomResourceDefinitionを作成します。
# kubectl apply -f install/00-crds.yaml customresourcedefinition.apiextensions.k8s.io/backups.velero.io created customresourcedefinition.apiextensions.k8s.io/backupstoragelocations.velero.io created customresourcedefinition.apiextensions.k8s.io/deletebackuprequests.velero.io created customresourcedefinition.apiextensions.k8s.io/downloadrequests.velero.io created customresourcedefinition.apiextensions.k8s.io/podvolumebackups.velero.io created customresourcedefinition.apiextensions.k8s.io/podvolumerestores.velero.io created customresourcedefinition.apiextensions.k8s.io/resticrepositories.velero.io created customresourcedefinition.apiextensions.k8s.io/restores.velero.io created customresourcedefinition.apiextensions.k8s.io/schedules.velero.io created customresourcedefinition.apiextensions.k8s.io/serverstatusrequests.velero.io created customresourcedefinition.apiextensions.k8s.io/volumesnapshotlocations.velero.io created
マニフェストへ作成したOSSのバケット名とリージョンを設定します。
# sed -i "s#<BUCKET>#$BUCKET#" install/01-velero.yaml # sed -i "s#<REGION>#$REGION#" install/01-velero.yaml
VeleroとPluginをデプロイします。
# kubectl apply -f install/01-velero.yaml serviceaccount/velero created clusterrolebinding.rbac.authorization.k8s.io/velero created backupstoragelocation.velero.io/default created volumesnapshotlocation.velero.io/default created deployment.extensions/velero created
バックアップとリストア
ではバックアップとリストアを実施してみたいと思います。
今回は簡単な検証環境をデプロイし、作成されたリソースをバックアップ・リストアします。
また、バックアップされたオブジェクトはOSSへアップロードされます。
環境準備
examplesのマニフェストをデプロイすると、以下のリソースが作成される為、こちらの環境を利用しバックアップ・リストアを実施します。
ダウンロードしたリポジトリの中のexamplesをデプロイし、検証環境を作成します。
# kubectl apply -f examples/base.yaml namespace/nginx-example created deployment.apps/nginx-deployment created service/my-nginx created
Namespace, Service, Deployment, ReplicaSet, Pod, が作成されました。
# kubectl get all -n nginx-example NAME READY STATUS RESTARTS AGE pod/nginx-deployment-54f57cf6bf-7c5pj 1/1 Running 0 71s pod/nginx-deployment-54f57cf6bf-p4krg 1/1 Running 0 71s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/my-nginx LoadBalancer 172.21.5.66 47.245.35.225 80:31181/TCP 71s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-deployment 2/2 2 2 71s NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-deployment-54f57cf6bf 2 2 2 71s
バックアップ
では、デプロイした検証環境のバックアップを取得してみます。
ローカルへインストールしたVelero CLIから各操作を実行します。
「nginx-backup」という名前で、Namespace「nginx-example」 のバックアップを取得します。
# velero backup create nginx-backup --include-namespaces nginx-example --wait Backup request "nginx-backup" submitted successfully. Waiting for backup to complete. You may safely press ctrl-c to stop waiting - your backup will continue in the background. . Backup completed with status: Completed. You may check for more information using the commands `velero backup describe nginx-backup` and `velero backup logs nginx-backup`.
バックアップの取得が完了しました。
# velero get backups NAME STATUS CREATED EXPIRES STORAGE LOCATION SELECTOR nginx-backup Completed 2020-04-14 13:30:19 +0900 JST 29d default <none>
バックアップ用に作成したOSSのバケットを確認すると、バックアップされたオブジェクトがアップロードされている事が確認できます。
リストア
次にリストアを実行する為、作成したリソースは削除しておきます。
# kubectl delete namespaces nginx-example namespace "nginx-example" deleted
作成したリソースが削除されました。
# kubectl get all -n nginx-example No resources found in nginx-example namespace.
先ほど取得したバックアップから、Velero CLIを使用しリストアを実行します。
# velero restore create --from-backup nginx-backup --wait Restore request "nginx-backup-20200414135145" submitted successfully. Waiting for restore to complete. You may safely press ctrl-c to stop waiting - your restore will continue in the background. Restore completed with status: Completed. You may check for more information using the commands `velero restore describe nginx- backup-20200414135145` and `velero restore logs nginx-backup-20200414135145`.
バックアップした時と同じリソースが作成され、Velero CLIからもリストアが完了している事が確認できます。
# kubectl get all -n nginx-example NAME READY STATUS RESTARTS AGE pod/nginx-deployment-54f57cf6bf-7c5pj 1/1 Running 0 21s pod/nginx-deployment-54f57cf6bf-p4krg 1/1 Running 0 21s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/my-nginx LoadBalancer 172.21.11.176 47.74.46.252 80:32636/TCP 21s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-deployment 2/2 2 2 21s NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-deployment-54f57cf6bf 2 2 2 21s
# velero restore get NAME BACKUP STATUS WARNINGS ERRORS CREATED SELECTOR nginx-backup-20200414135145 nginx-backup Completed 0 0 2020-04-14 13:51:45 +0900 JST <none>
スケジュール
Veleroではスケジュールを設定する事ができる為、定期的なバックアップの取得が可能となっています。
以下の例では、5分毎にバックアップを実行するように設定しています。
オンデマンドでのバックアップと、スケジュールからのバックアップを利用する事で、任意のタイミングでバックアップを取得する事ができます。
# velero schedule create nginx-backup-schedule --include-namespaces nginx-example --schedule "*/5 * * * *" Schedule "nginx-backup-schedule" created successfully. # velero get schedules NAME STATUS CREATED SCHEDULE BACKUP TTL LAST BACKUP SELECTOR nginx-backup-schedule Enabled 2020-04-15 12:57:00 +0900 JST */5 * * * * 720h0m0s 15s ago <none>
まとめ
Veleroを使用して、KubernetesクラスタリソースをAlibaba CloudのOSSへバックアップし、リストアする手順を試してみました。
既存環境からバックアップを取得しておく事で、ディザスタ対策やマイグレーション等で利用できるシーンもあるのではないでしょうか。
今回は永続ボリュームのバックアップ等の手順は省略しましたが、Veleroのドキュメントへ詳細な内容が記載されておりますので、
参考にして頂ければと思います。
また、Alibaba Cloudのドキュメントにも、Veleroを利用したマイグレーション例も記載されておりますので、こちらもご覧頂ければと思います。
最後までお読み頂き、ありがとうございました。