Terraform CLI を使用して、ACK クラスター内にバックアップリポジトリ、アプリケーションバックアップ、アプリケーション復元用のカスタムリソース (CR) をデプロイします。これにより、バックアップおよび移行全体のワークフローをインフラストラクチャコードとして管理できます。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
Kubernetes 1.18 以降を実行する ACK マネージドクラスター(Terraform を使用して作成済み)。詳細については、「Terraform を使用した ACK マネージドクラスターの作成」をご参照ください。
migrate-controller コンポーネントは、必要な権限でインストールされています。詳細については、「migrate-controller コンポーネントのインストールと権限の付与」をご参照ください。また、Terraform を使用してコンポーネントをインストールすることもできます。詳細については、「Terraform を使用したコンポーネントのインストール」をご参照ください。
バックアップを保存するための Object Storage Service (OSS) バケットです。バケット名は
cnfs-oss-で始める必要があります。詳細については、「Terraform を使用したバケットの作成」および「alicloud_oss_bucket」をご参照ください。(任意)永続ボリューム (PV) のバックアップを行う場合は、ECS スナップショットサービスおよび Cloud Backup サービスを有効化する必要があります。詳細については、「OSS の有効化」「ECS スナップショットの有効化」および「Cloud Backup の有効化」をご参照ください。
注意事項
バックアップまたは復元ジョブを削除する際に、
kubectl deleteを使用しないでください。関連するクラウドリソースが完全にクリーンアップされない場合があります。バックアップ関連リソースを削除するには、「手順 5:バックアップセンターからリソースを削除」に従ってください。migrate-controller コンポーネントを最新バージョンに更新したままにしてください。詳細については、「コンポーネントの管理」をご参照ください。
サンプルコードからパラメーターを削除しないでください。パラメーターが不足すると、バックアップの復元が失敗する可能性があります。
手順 1:クラスターの関連付け
Kubernetes プロバイダーを使用して、Terraform をご利用のクラスターに接続します。詳細については、「Kubernetes プロバイダー」をご参照ください。
以下の例では、kubeconfig ファイルを使用してクラスターを関連付けます。
Terraform の作業ディレクトリを作成します。
作業ディレクトリ内に、
csdr.tfという名前の設定ファイルを作成します。Kubernetes プロバイダーの設定を以下のように追加します。provider "kubernetes" { config_path = "~/.kube/config" }Terraform 実行環境を初期化するために、以下のコマンドを実行します。
terraform init以下の出力は、Terraform の初期化が正常に完了したことを示しています。
手順 2:バックアップリポジトリの作成
csdr.tfに以下の内容を追加し、必要に応じてパラメーターを変更します。パラメーター 必須 説明 nameはい バックアップリポジトリの名前。Kubernetes の命名規則に準拠している必要があります。 networkはい OSS バケットへのアクセスに使用するネットワークモード。有効な値: internal(関連付けられたすべてのクラスターがバケットと同じリージョンにある必要があります)、public(リージョン制限なし)。regionはい OSS バケットが存在するリージョン。 bucketはい OSS バケットの名前。必ず cnfs-oss-で始まる必要があります。prefixいいえ OSS バケット内のサブディレクトリ。指定した場合、バックアップはこのサブディレクトリに保存されます。 resource "kubernetes_manifest" "backuplocation-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "BackupLocation" metadata = { name = "<yourBackupLocationName>" namespace = "csdr" } spec = { backupSyncPeriod = "0s" config = { network = "internal" region = "cn-beijing" } objectStorage = { bucket = "<cnfs-oss-yourBucketName>" prefix = "<subDir>" } provider = "alibabacloud" } } wait { fields = { "status.phase" = "Available" } } timeouts { create = "10m" } }リソースプランをプレビューするために、以下のコマンドを実行します。
terraform planバックアップリポジトリを作成するために、以下のコマンドを実行します。
terraform apply以下の出力は、バックアップリポジトリが正常に作成されたことを示しています。
手順 3:バックアップジョブの作成
ご使用のシナリオに応じて、バックアップタイプを選択します。
アプリケーションバックアップ:クラスター内で実行中のアプリケーション(クラスターリソースおよびそのアプリケーションが使用する永続ボリュームを含む)をバックアップします。
データ保護:永続ボリュームのデータのみをバックアップします。永続ボリューム要求 (PVC) および永続ボリューム (PV) のみが対象です。
これらの 2 つのモードの比較については、「アプリケーションのバックアップとデータ保護のシナリオ」をご参照ください。
アプリケーションバックアップ
即時バックアップの作成
csdr.tfに以下の内容を追加し、必要に応じてパラメーターを変更します。waitブロックはコメントアウトされています(バックアップの所要時間が可変であるため)。Terraform が完了を待機するようにするには、waitおよびtimeoutsブロックのコメントを解除し、必要に応じてタイムアウトを調整してください。パラメーター 必須 説明 csdr.alibabacloud.com/backuplocationsはい バックアップリポジトリに関する情報。バックアップリポジトリの構成と一致している必要があります。 nameはい 即時バックアップの名前。 includedNamespacesはい バックアップ対象の名前空間。 includedResourcesいいえ バックアップ対象のクラスターリソースタイプ。 includedResourcesまたはexcludedResourcesのいずれか一方のみを設定してください。両方とも空欄の場合は、すべてのリソースタイプがバックアップされます。excludedResourcesいいえ バックアップ対象外のクラスターリソースタイプ。 includedResourcesまたはexcludedResourcesのいずれか一方のみを設定してください。両方とも空欄の場合は、すべてのリソースタイプがバックアップされます。matchLabelsいいえ リソースをフィルターするためのラベル。ラベルが一致するリソースのみがバックアップされます。 includeClusterResourcesいいえ クラスター階層のリソース(例:StorageClasses、CustomResourceDefinitions (CRDs)、Webhook)をバックアップするかどうか。 true:すべてのクラスター階層リソースをバックアップ。false(ACK コンソールでのデフォルト):指定された名前空間内の名前空間階層リソースによって参照されるクラスター階層リソースのみをバックアップ(例:Pod のサービスアカウントが使用するクラスターロール、カスタムリソースの CRD)。defaultPvBackupいいえ 永続ボリュームを含めるかどうか。 true:アプリケーションおよびその永続ボリュームをバックアップ。false:アプリケーションのみをバックアップ。storageLocationはい バックアップリポジトリの名前。クラスターで既に Velero を使用している場合は、DingTalk グループ(ID:35532895)に参加してサポートを受けてください。 ttlはい 保持期間。バックアップの有効期限が切れた後は、データを復元できません。フォーマット: 720h0m0s。有効範囲:24h0m0s~1572864h0m0s。resource "kubernetes_manifest" "applicationbackup-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "ApplicationBackup" metadata = { name = "<yourApplicationBackupName>" namespace = "csdr" annotations = { "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<yourBackupLocationName>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-yourBucketName>\",\"prefix\":\"<subDir>\",\"provider\":\"alibabacloud\"}" } } spec = { includedNamespaces = ["default","default1"] includedResources = ["statefulset"] excludedResources = ["excludedResources"] labelSelector = { matchLabels = { "app" = "mysql-sts" } } pvBackup = { defaultPvBackup = "false" } storageLocation = "<yourBackupLocationName>" ttl = "720h0m0s" includeClusterResources = "false" } } # バックアップの完了は、status.phase が Completed に変化したときです。 # バックアップの所要時間は、リソース数および永続ボリュームデータ量に依存します。 #wait { # fields = { # "status.phase" = "Completed" # } #} #timeouts { # create = "60m" #} }リソースプランをプレビューするために、以下のコマンドを実行します。
terraform plan即時バックアップを作成するために、以下のコマンドを実行します。
terraform apply以下の出力は、バックアップジョブが正常に作成されたことを示しています。
kubernetes_manifest.applicationbackup-demo: Creating... kubernetes_manifest.applicationbackup-demo: Creation complete after 1s Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
バックアップスケジュールの作成
csdr.tfに以下の内容を追加し、必要に応じてパラメーターを変更します。<details> <summary>設定ファイルを表示</summary>パラメーター 必須 説明 csdr.alibabacloud.com/backuplocationsはい バックアップリポジトリに関する情報。バックアップリポジトリの構成と一致している必要があります。 nameはい バックアップスケジュールの名前。 scheduleはい バックアップスケジュール(cron 形式)。cron フィールドの順序: 分 時 日 月 曜日。たとえば、"1 4 * * *"は、毎日 04:01 にバックアップを実行します。フォーマットの詳細については、「バックアッププランを作成する際にバックアップサイクルを指定する方法は?」をご参照ください。クイックリファレンス:# ┌── 分 (0–59) ┌── 時 (0–23) ┌── 日 (1–31) ┌── 月 (1–12) ┌── 曜日 (0–6、日曜日=0)includedNamespacesはい バックアップ対象の名前空間。 includedResourcesいいえ バックアップ対象のクラスターリソースタイプ。 includedResourcesまたはexcludedResourcesのいずれか一方のみを設定してください。両方とも空欄の場合は、すべてのリソースタイプがバックアップされます。excludedResourcesいいえ バックアップ対象外のクラスターリソースタイプ。 includedResourcesまたはexcludedResourcesのいずれか一方のみを設定してください。両方とも空欄の場合は、すべてのリソースタイプがバックアップされます。matchLabelsいいえ リソースをフィルターするためのラベル。ラベルが一致するリソースのみがバックアップされます。 includeClusterResourcesいいえ クラスター階層のリソースをバックアップするかどうか。即時バックアップのパラメーターテーブルの説明をご参照ください。 defaultPvBackupはい 永続ボリュームを含めるかどうか。 true:アプリケーションおよびその永続ボリュームをバックアップ。false:アプリケーションのみをバックアップ。storageLocationはい バックアップリポジトリの名前。クラスターで既に Velero を使用している場合は、DingTalk グループ(ID:35532895)に参加してサポートを受けてください。 ttlはい 保持期間。フォーマット: 720h0m0s。有効範囲:24h0m0s~1572864h0m0s。リソースプランをプレビューするために、以下のコマンドを実行します。
terraform planバックアップスケジュールを作成するために、以下のコマンドを実行します。
terraform apply以下の出力は、バックアップスケジュールが正常に作成されたことを示しています。
kubernetes_manifest.backupschedule-demo: Creating... kubernetes_manifest.backupschedule-demo: Creation complete after 1s Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
その他の操作
バックアップスケジュールによって作成されたバックアップの検索
labelSelector を使用して、特定のスケジュールによって作成されたバックアップを一覧表示します。
data "kubernetes_resources" "list-applicationbackup" {
api_version = "csdr.alibabacloud.com/v1beta1"
kind = "ApplicationBackup"
namespace = "csdr"
label_selector = "csdr/schedule-name=terraform-schedule-test"
}
output "applicationbackup-name" {
value = data.kubernetes_resources.list-applicationbackup.objects
}バックアップスケジュールの変更
バックアップスケジュールを一時停止するには、
spec.pausedをtrueに設定し、その後spec.scheduleなどの他のフィールドを変更します。変更内容をプレビューするために、以下のコマンドを実行します。
terraform plan以下の出力は、リソースプランが正常に作成されたことを示しています。
kubernetes_manifest.backupschedule-demo: Refreshing state... Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: ~ update in-place Terraform will perform the following actions: # kubernetes_manifest.backupschedule-demo will be updated in-place ~ resource "kubernetes_manifest" "backupschedule-demo" { ~ manifest = { ~ spec = { ~ paused = "false" -> "true" ~ schedule = "1 4 * * *" -> "0 5 * * *" # (1 unchanged attribute hidden) } # (3 unchanged attributes hidden) } ~ object = { ~ spec = { ~ paused = false -> true ~ schedule = "1 4 * * *" -> "0 5 * * *" # (2 unchanged attributes hidden) } # (3 unchanged attributes hidden) } ~ wait { ~ fields = { ~ "status.phase" = "Enabled" -> "Paused" } } # (1 unchanged block hidden) } Plan: 0 to add, 1 to change, 0 to destroy.変更を適用するために、以下のコマンドを実行します。
terraform apply以下の出力は、バックアップスケジュールが正常に更新されたことを示しています。
kubernetes_manifest.backupschedule-demo: Modifying... kubernetes_manifest.backupschedule-demo: Modifications complete after 1s Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
データ保護
即時バックアップの作成
csdr.tfに以下の内容を追加し、必要に応じてパラメーターを変更します。resource "kubernetes_manifest" "applicationbackup-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "ApplicationBackup" metadata = { name = "<yourApplicationBackupName>" namespace = "csdr" annotations = { "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<yourBackupLocationName>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-yourBucketName>\",\"prefix\":\"<subDir>\",\"provider\":\"alibabacloud\"}" } } spec = { backupType = "PvBackup" includedNamespaces = ["default","default1"] pvBackup = { pvcList = [ { namespace = "default" name = "pvc-nas" }, { namespace = "default1" name = "pvc-oss" } ] storageClassList = ["disk-essd","disk-ssd"] } storageLocation = "<yourBackupLocationName>" ttl = "720h0m0s" } } # バックアップの完了は、status.phase が Completed に変化したときです。 # バックアップの所要時間は、永続ボリュームデータ量に依存します。 #wait { # fields = { # "status.phase" = "Completed" # } #} #timeouts { # create = "60m" #} } }リソースプランをプレビューするために、以下のコマンドを実行します。
terraform plan即時バックアップを作成するために、以下のコマンドを実行します。
terraform apply以下の出力は、バックアップジョブが正常に作成されたことを示しています。
バックアッププランの作成
csdr.tfに以下の内容を追加し、必要に応じてパラメーターを変更します。<details> <summary>設定ファイルを表示</summary>パラメーター 必須 説明 csdr.alibabacloud.com/backuplocationsはい バックアップリポジトリに関する情報。バックアップリポジトリの構成と一致している必要があります。 nameはい バックアッププランの名前。 scheduleはい バックアップスケジュール(cron 形式)です。cron フィールドの順序は、 分 時 日 月 曜日です。フォーマットの詳細については、「バックアッププランを作成するときにバックアップサイクルを指定する方法は?」をご参照ください。includedNamespacesはい バックアップ対象の名前空間。 pvcListいいえ 名前および名前空間で指定された PVC をバックアップ対象とします。 pvcListおよびstorageClassListの両方が指定されている場合、storageClassListは無視されます。どちらも指定されていない場合、指定された名前空間内のすべての PV がバックアップされます。storageClassListいいえ バックアップ対象の PV の StorageClass を指定します。 storageLocationはい バックアップリポジトリの名前。クラスターで既に Velero を使用している場合は、DingTalk グループ(ID:35532895)に参加してサポートを受けてください。 ttlはい 保持期間。フォーマット: 720h0m0s。有効範囲:24h0m0s~1572864h0m0s。resource "kubernetes_manifest" "backupschedule-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "BackupSchedule" metadata = { name = "<yourBackupScheduleName>" namespace = "csdr" annotations = { "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<yourBackupLocationName>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-yourBucketName>\",\"prefix\":\"<subDir>\",\"provider\":\"alibabacloud\"}" } } spec = { schedule = "1 4 * * *" template = { includedNamespaces = ["default","default1"] pvBackup = { pvcList = [ { namespace = "default" name = "pvc-nas" }, { namespace = "default1" name = "pvc-oss" } ] storageClassList = ["disk-essd","disk-ssd"] } storageLocation = "<yourBackupLocationName>" ttl = "720h0m0s" } } } wait { fields = { "status.phase" = "Enabled" } } timeouts { create = "10m" } }リソースプランをプレビューするために、以下のコマンドを実行します。
terraform planバックアッププランを作成するために、以下のコマンドを実行します。
terraform apply以下の出力は、バックアッププランが正常に作成されたことを示しています。
kubernetes_manifest.backupschedule-demo: Creating... kubernetes_manifest.backupschedule-demo: Creation complete after 1s Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
手順 4:復元ジョブの作成
csdr.tfに以下の内容を追加し、必要に応じてパラメーターを変更します。waitブロックはコメントアウトされています(復元の所要時間が可変であるため)。Terraform が完了を待機するようにするには、waitおよびtimeoutsブロックのコメントを解除し、必要に応じてタイムアウトを調整してください。パラメーター 必須 説明 csdr.alibabacloud.com/backuplocationsはい バックアップリポジトリに関する情報。バックアップリポジトリの構成と一致している必要があります。 nameはい 復元ジョブの名前。 appRestoreOnlyいいえ アプリケーションバックアップタスク(データ保護ではない)にのみ適用されます。PVC、PV、およびボリュームデータを復元せずにアプリケーションのみを復元するかどうかを指定します。 true:アプリケーションのみを復元(データソースを変更する場合は、あらかじめ PVC および PV を手動で作成する必要があります)。false(デフォルト):アプリケーションおよびすべてのボリュームデータを復元。preserveNodePortsいいえ アプリケーションバックアップタスク(データ保護ではない)にのみ適用されます。NodePort を保持するかどうかを指定します。バックアップおよび復元クラスターが同じ NodePort を共有する場合は、代わりにランダムポートを割り当てるために、これを falseに設定します。それ以外の場合は、trueに設定します。includedNamespacesはい 復元対象の名前空間。空欄の場合は、バックアップされたすべての名前空間が復元されます。 includedResourcesいいえ アプリケーションバックアップタスクにのみ適用されます。復元対象のクラスターリソースタイプ。 includedResourcesまたはexcludedResourcesのいずれか一方のみを設定してください。両方とも空欄の場合は、すべてのリソースタイプが復元されます。excludedResourcesいいえ アプリケーションバックアップタスクにのみ適用されます。復元対象外のクラスターリソースタイプ。 includedResourcesまたはexcludedResourcesのいずれか一方のみを設定してください。両方とも空欄の場合は、すべてのリソースタイプが復元されます。backupNameはい 復元対象のバックアップの名前。スケジュールされたバックアップの場合は、特定のポイントインタイムバックアップの名前を指定します。バックアップ名の形式は <BackupScheduleName>-<Timestamp>であり、<Timestamp>はYYYYMMDDhhmmss形式(例:my-schedule-20221205225845)です。namespaceMappingいいえ バックアップクラスターの名前空間を復元クラスターの名前空間にマップします。 <backupNamespace>:バックアップからの名前空間。<restoreNamespace>:復元クラスターのターゲット名前空間。ターゲット名前空間が存在しない場合は、自動的に作成されます。このパラメーターを空欄のままにした場合、リソースはバックアップ時の名前空間と同じ名前空間に復元されます。imageRegistryMappingいいえ 復元時にイメージレジストリのアドレスを再マップします。 <oldimageregistry>:元のレジストリアドレス。<newImageRegistry>:ターゲットレジストリアドレス。設定されていない場合、イメージ設定は変更されません。convertedargいいえ ファイルシステム型ボリューム(OSS、NAS、CPFS、およびローカルボリューム)の復元時に StorageClass を変換します。サポートされるターゲットタイプ:ディスクまたは NAS StorageClass。StorageClass は現在のクラスターに存在している必要があります。必須フィールド: convertToStorageClassType(ターゲット StorageClass)、namespace(PVC 名前空間)、persistentVolumeClaim(PVC 名)。オプションフィールド:convertToAccessModes(ターゲットアクセスモード)。重要ReadWriteMany または ReadOnlyMany ボリュームをディスクに復元する場合、強制的なディスクデタッチを防ぐために、
convertToAccessModesをReadWriteOnceに設定します。バックアップ内の PVC 情報を照会するには、kubectl -ncsdr describe <backup-name>を実行し、status.resourceList.dataResource.pvcBackupInfoを確認してください。resource "kubernetes_manifest" "applicationrestore-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "ApplicationRestore" metadata = { name = "<yourApplicationRestoreName>" namespace = "csdr" annotations = { "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<yourBackupLocationName>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-yourBucketName>\",\"prefix\":\"<subDir>\",\"provider\":\"alibabacloud\"}" } } spec = { appRestoreOnly = "false" preserveNodePorts = "true" includedNamespaces = ["default","default1"] includedResources = ["statefulset"] excludedResources = ["excludedResources"] convertedarg = [ { convertToStorageClassType = "alicloud-disk-topology-alltype" namespace = "default" persistentVolumeClaim = "pvc-nas" }, { convertToStorageClassType = "alicloud-disk-topology-alltype" namespace = "default1" persistentVolumeClaim = "pvc-oss" } ] backupName = "<yourApplicationBackupName>" namespaceMapping = { "<backupNamespace>" = "<restoreNamespace>" } } } # 復元の完了は、status.phase が Completed に変化したときです。 # 復元の所要時間は、リソース数および永続ボリュームデータ量に依存します。 #wait { # fields = { # "status.phase" = "Completed" # } #} #timeouts { # create = "60m" #} }リソースプランをプレビューするために、以下のコマンドを実行します。
terraform plan復元ジョブを作成するために、以下のコマンドを実行します。
terraform apply以下の出力は、復元ジョブが正常に作成されたことを示しています。
手順 5:バックアップセンターからリソースを削除
他のクラスターでも作成したバックアップリポジトリを使用している可能性があります。BackupLocation オブジェクトの削除はサポートされていません。
バックアップスケジュールの削除
バックアップスケジュールリソースを削除し、スケジュールされたバックアップを停止するには、terraform destroy を実行します。
バックアップまたは復元ジョブの削除
csdr.tfに以下の内容を追加し、必要に応じてパラメーターを変更します。パラメーター 必須 説明 nameはい 削除要求の名前。バックアップジョブの場合は <ApplicationBackupName>-dbr、復元ジョブの場合は<ApplicationRestoreName>-dbrの形式を使用します。deleteObjectNameはい 削除対象のリソースの名前。 deleteObjectTypeはい 削除対象のリソースのタイプ。 "Backup":ApplicationBackup オブジェクトおよび関連リソースを削除。"Restore":ApplicationRestore オブジェクトおよび関連リソースを削除。バックアップジョブを削除しても、クラスター内に既に作成されたバックアップには影響しません。復元ジョブを削除しても、すでに復元されたデータには影響しません。resource "kubernetes_manifest" "deleterequest-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "DeleteRequest" metadata = { name = "<objectName-dbr>" namespace = "csdr" } spec = { deleteObjectName = "<objectName>" deleteObjectType = "Backup" } } }リソースプランをプレビューするために、以下のコマンドを実行します。
terraform plan削除要求を送信するために、以下のコマンドを実行します。
terraform apply以下の出力は、削除要求が正常に処理されたことを示しています。
バックアップまたは復元ジョブが削除されると、DeleteRequest リソースは自動的に削除されます。
次のステップ
kubectl を使用したアプリケーションのバックアップおよび復元については、「kubectl を使用したクラスター内アプリケーションのバックアップおよび復元」をご参照ください。
ACK コンソールでバックアップを管理するには、以下のトピックをご参照ください。