Terraformのコマンドラインインターフェイス (CLI) を使用して、バックアップボールト、アプリケーションバックアップ、およびアプリケーション復元用のカスタムリソース (CR) をバックアップクラスターおよび復元クラスターにデプロイし、クラスター間でアプリケーションを移行できます。
前提条件
Kubernetes 1.18以降を実行するContainer Service for Kubernetes (ACK) クラスターが作成されます。 詳細については、「ACK管理クラスターの作成」をご参照ください。
migrate-コントローラがインストールされ、権限が付与されます。 詳細については、「migrate-controllerのインストールと権限の付与」をご参照ください。 Terraformを使用してコンポーネントをインストールすることもできます。 詳細については、「Terraformを使用したアドオンの管理」をご参照ください。
cnfs-OSS-*
形式のObject Storage Service (oss) バケットが作成され、バックアップが保存されます。 詳細については、「Terraformを使用したOSSの管理」および「alicloud_oss_bucket」をご参照ください。バックアップにボリュームを使用する場合は、Elastic Compute Service (ECS) スナップショットとCloud Backupを使用できます。 詳細については、「OSS cobsoleを使用して開始する」トピックの [OSSの有効化] セクション、[ECSスナップショットの有効化] 、および [クラウドバックアップの有効化] をご参照ください。
使用上の注意
kubectlを使用してバックアップおよび復元タスクを削除して、
delete
コマンドを実行しないでください。 そうしないと、関連するクラウドリソースが完全に削除されない場合があります。 バックアップを削除する方法の詳細については、このトピックの「手順5: バックアップセンターからリソースを削除する」を参照してください。migrate-controllerという名前のバックアップセンターコンポーネントの新しいリリースに細心の注意を払い、できるだけ早くコンポーネントを最新バージョンに更新してください。 詳細については、「コンポーネントの管理」をご参照ください。
バックアップファイルを復元できない場合は、次のサンプルコードのパラメーターを削除しないでください。
手順1: クラスターの関連付け
Kubernetesプロバイダーを使用してクラスターを関連付けることができます。 Kubernetesプロバイダーの詳細については、「Kubernetesプロバイダー」をご参照ください。
この例では、KubeConfigファイルを使用して、クラスターを関連付ける方法を説明します。
Terraformディレクトリを作成します。
Terraformディレクトリにcsdr.tfという名前の設定ファイルを作成し、次の内容を設定ファイルにコピーしてKubeConfigファイルに関連付けます。
provider "kubernetes" { config_path = "~/.kube/config" }
次のコマンドを実行して、Terraformのランタイム環境を初期化します。
terraform init
Terraformが初期化されたことを示す次の出力が返されます。
ステップ2: バックアップコンテナーの作成
次のコンテンツをcsdr.tf設定ファイルに追加し、ビジネス要件に基づいてコンテンツを変更します。
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" } }
パラメーター
必須 / 任意
説明
name
可
バックアップボールトの名前。 名前はKubernetesの命名規則に準拠している必要があります。
ネットワーク
可
指定されたObject Storage Service (OSS) バケットへのアクセスに使用されるネットワークモード。 有効な値:
internal: 内部モード。 関連付けられているすべてのクラスターは、OSSバケットと同じリージョンにデプロイする必要があります。
public: パブリックモード。 このモードには領域制限はありません。
region
可
OSS バケットが存在するリージョンです。
バケット
可
OSS バケットの名前。 OSSバケット名が存在し、cnfs-oss-で始まることを確認してください。
プレフィックス
不可
OSSバケット内のサブディレクトリ。 このパラメーターを指定すると、指定したサブディレクトリにバックアップが保存されます。
次のコマンドを実行して、リソース計画を作成します。
terraform plan
次の出力が返されます。これは、リソース計画が作成されたことを示します。
次のコマンドを実行して、バックアップコンテナーを作成します。
terraform apply
次の出力が返されます。これは、バックアップコンテナーが作成されたことを示します。
kubernetes_manifest.backuplocation-demo: Creating... kubernetes_manifest.backuplocation-demo: Creation complete after 1s Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
ステップ3: バックアップタスクを作成する
インスタントバックアップタスクの作成
次のコンテンツを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 = { includedNamespaces = ["default","default1"] includedResources = ["statefulset"] excludedResources = ["excludedResources"] labelSelector = { matchLabels = { "app" = "mysql-sts" } } pvBackup = { defaultPvBackup = "false" } storageLocation = "<yourBackuplocationName>" ttl = "720h0m0s" includeClusterResources = "false" } } # If the value of the status.phase parameter changes to Completed, the backup is successful. # The backup duration depends on the number of applications in the cluster and the amount of data stored in the volumes. #wait { # fields = { # "status.phase" = "Completed" # } #} #timeouts { # create = "60m" #} } }
パラメーター
必須 / 任意
説明
csdr.alibabacloud.com/backuplocations
可
バックアップを保存するバックアップコンテナー。 情報がバックアップコンテナーの構成と同じであることを確認します。
name
可
リアルタイムバックアップタスクの名前。
includedNamespaces
可
名前空間の名前。
includedResources
不可
バックアップリストに含めるクラスターリソースのタイプ。
重要バックアップが期待どおりに作成されるようにするには、includedResourcesおよびexcludedResourcesのいずれかのパラメーターのみを指定します。 両方のパラメーターを空のままにすると、すべてのリソースタイプがバックアップされます。
excludedResources
不可
バックアップリストから除外するクラスターリソースのタイプ。
重要バックアップが期待どおりに作成されるようにするには、includedResourcesおよびexcludedResourcesのいずれかのパラメーターのみを指定します。 両方のパラメーターを空のままにすると、すべてのリソースタイプがバックアップされます。
matchLabels
不可
バックアップするリソースのラベル。
includeClusterResources
不可
StorageClasses、CustomResourceDefinitions (CRD) 、webhooksなど、すべてのクラスターレベルのリソースをバックアップするかどうかを指定します。
true
: すべてのクラスターレベルのリソースをバックアップします。false
: 指定された名前空間内の名前空間レベルのリソースによって使用されるクラスターレベルのリソースのみをバックアップします。 たとえば、システムがポッドをバックアップすると、ポッドで使用されるサービスアカウントにクラスターロールが割り当てられます。 この場合、クラスターロールは自動的にバックアップされます。 システムがCustomResource (CR) をバックアップすると、対応するCRDがバックアップされます。
説明デフォルトでは、ACKコンソールで作成されたバックアップタスクでは、
IncludeClusterResources
がfalse
に設定されます。defaultPvBackup
ボリュームをバックアップするかどうかを指定します。 有効な値:
true: アプリケーションとボリュームをバックアップします。
false: アプリケーションのみをバックアップします。
storageLocation
可
バックアップボールトの名前。
説明ACKクラスターでVeleroを使用している場合は、DingTalkグループ35532895に参加してテクニカルサポートをリクエストします。
ttl
可
バックアップの有効期間。 期限切れのバックアップからデータを復元することはできません。 期間を720h0m0s形式で指定します。 有効値: 24h0m0s ~ 1572864h0m0s。
次のコマンドを実行して、リソース計画を作成します。
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設定ファイルに追加し、ビジネス要件に基づいてコンテンツを変更します。
パラメーター
必須 / 任意
説明
csdr.alibabacloud.com/backuplocations
可
バックアップを保存するバックアップコンテナー。 情報がバックアップコンテナーの構成と同じであることを確認します。
name
可
スケジュールされたバックアップタスクの名前。
スケジュール
可
cron式で指定されたバックアップサイクル。
includedNamespaces
可
名前空間の名前。
includedResources
不可
バックアップリストに含めるクラスターリソースのタイプ。
重要バックアップが期待どおりに作成されるようにするには、includedResourcesおよびexcludedResourcesのいずれかのパラメーターのみを指定します。 両方のパラメーターを空のままにすると、すべてのリソースタイプがバックアップされます。
excludedResources
不可
バックアップリストから除外するクラスターリソースのタイプ。
重要バックアップが期待どおりに作成されるようにするには、includedResourcesおよびexcludedResourcesのいずれかのパラメーターのみを指定します。 両方のパラメーターを空のままにすると、すべてのリソースタイプがバックアップされます。
matchLabels
不可
バックアップするリソースのラベル。
includeClusterResources
不可
StorageClasses、CustomResourceDefinitions (CRD) 、webhooksなど、すべてのクラスターレベルのリソースをバックアップするかどうかを指定します。
true
: すべてのクラスターレベルのリソースをバックアップします。false
: 指定された名前空間内の名前空間レベルのリソースによって使用されるクラスターレベルのリソースのみをバックアップします。 たとえば、システムがポッドをバックアップすると、ポッドで使用されるサービスアカウントにクラスターロールが割り当てられます。 この場合、クラスターロールは自動的にバックアップされます。 システムがCustomResource (CR) をバックアップすると、対応するCRDがバックアップされます。
説明デフォルトでは、ACKコンソールで作成されたバックアップタスクでは、
IncludeClusterResources
がfalse
に設定されます。defaultPvBackup
可
ボリュームをバックアップするかどうかを指定します。 有効な値:
true: アプリケーションとボリュームをバックアップします。
false: アプリケーションのみをバックアップします。
storageLocation
可
バックアップボールトの名前。
説明ACKクラスターでVeleroを使用している場合は、DingTalkグループ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.
関連する API
スケジュールされたバックアップタスクに基づいてバックアップを検索します。
labelSelector
を使用して、スケジュールされたバックアップタスクによって作成されたバックアップを見つけます。data "kubernetes_resources" "list-applicationbackup" { api_version = "csdr.alibabacloud.com/v1beta1" kind = "ApplicationBackup" namespace = "csdr" label_selector = "csdr/schedule-name=terraform-schedule-test" } # Return the output. output "applicationbackup-name" { value = data.kubernetes_resources.list-applicationbackup.objects }
スケジュールされたバックアップタスクを変更します。
spec.paused
パラメーターをtrue
に設定して、スケジュールされたバックアップタスクを一時停止し、ビジネス要件に基づいてバックアップタスクのバックアップ動作を定義するspec.schedule
など、spec
パラメーターの他のパラメーターを変更します。 サンプルコード:resource "kubernetes_manifest" "backupschedule-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "BackupSchedule" metadata = { name = "<yourBackcupscheduleName>" namespace = "csdr" annotations = { "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<yourBackuplocationName>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-yourBucketName>\",\"prefix\":\"<subDir>\",\"provider\":\"alibabacloud\"}" } } spec = { Pause the backup task. paused = "true" # Modify the backup cycle of the backup task. schedule = "0 5 * * *" template = { includedNamespaces = ["default","default1"] includedResources = ["statefulset"] excludedResources = ["excludedResources"] labelSelector = { matchLabels = { "app" = "mysql-sts" } } pvBackup = { defaultPvBackup = "false" } storageLocation = "vault-a" ttl = "720h0m0s" includeClusterResources = "false" } } } wait { fields = { # After the backup task is paused, the state of the backup task changes to Paused as expected. "status.phase" = "Paused" } } timeouts { create = "10m" } }
次のコマンドを実行して、リソース計画を作成します。
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.
ステップ4: 復元タスクを作成する
次のコンテンツをcsdr.tf設定ファイルに追加し、ビジネス要件に基づいてコンテンツを変更します。
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>" } } } # If the value of the status.phase parameter changes to Completed, the restoration task is successful. # The restoration duration depends on the number of applications in the cluster and the amount of data stored in the volumes. #wait { # fields = { # "status.phase" = "Completed" # } #} #timeouts { # create = "60m" #} }
パラメーター
必須 / 任意
説明
csdr.alibabacloud.com/backuplocations
可
バックアップを保存するバックアップコンテナー。 情報がバックアップコンテナーの構成と同じであることを確認します。
name
可
復元タスクの名前。
appRestoreOnly
不可
ボリュームデータを含むバックアップからアプリケーションのみを復元するかどうかを指定します。 永続ボリュームクレーム (PVC) 、永続ボリューム (PV) 、および関連データは復元されません。 有効な値:
true: アプリケーションのみを復元します。 アプリケーションをバックアップするデータソースを変更する場合は、手動でPVCとPVを作成し、復元タスクを作成してから、このパラメーターをtrueに設定する必要があります。
false: アプリケーションと関連するボリュームデータを復元します。 デフォルト値:false
preserveNodePorts
不可
アプリケーションのNodePortを保持するかどうかを指定します。 バックアップクラスターと復元クラスターで同じNodePortを使用している場合は、このパラメーターをfalseに設定して、NodePortをランダムなポートに変更します。 他のシナリオでは、パラメーターをtrueに設定します。
includedNamespaces
可
復元する名前空間の名前。 このパラメーターを空のままにすると、バックアップされたすべての名前空間が復元されます。
includedResources
不可
復元リストに含めるクラスターリソースのタイプ。
重要バックアップが期待どおりに作成されるようにするには、includedResourcesおよびexcludedResourcesのいずれかのパラメーターのみを指定します。 両方のパラメーターを空のままにすると、すべてのリソースタイプがバックアップされます。
excludedResources
不可
リストアリストから除外するクラスターリソースのタイプ。
重要バックアップが期待どおりに作成されるようにするには、includedResourcesおよびexcludedResourcesのいずれかのパラメーターのみを指定します。 両方のパラメーターを空のままにすると、すべてのリソースタイプがバックアップされます。
backupName
可
復元するバックアップの名前。 スケジュールバックアップ機能を使用する場合は、ある時点で作成されるバックアップの名前を指定する必要があります。 例: <yourBackupScheduleName>-20221205225845
namespaceMapping
不可
このパラメーターは、バックアップクラスターの名前空間を復元クラスターの名前空間にマップします。 有効な値:
<backupNamespace>: バックアップクラスター内のバックアップの名前空間。
<restoreNamespace>: 復元クラスターでリソースが復元される名前空間。 このパラメーターを指定しない場合、リソースはバックアップクラスターの名前空間と同じ名前を使用する名前空間に復元されます。
説明<restoreNamespace> が存在しない場合、システムは自動的に作成します。
convertedarg
不可
StorageClass変換リスト。 OSS、NAS、CPFS、ローカルボリュームなどのFileSystemタイプのボリュームの場合、このパラメーターを設定して、復元プロセス中にPVCのStorageClassesを指定されたStorageClassに変換できます。 たとえば、NASボリュームをディスクボリュームに変換できます。
convertToStorageClassType: 目的のStorageClass。 現在のクラスターにStorageClassが存在することを確認します。 指定できるのは、ディスクまたはNAS StorageClassのみです。
namespace: PVCの名前空間。
persistentVolumeClaim: PVCの名前。
kubectl -ncsdr describe <backup-name>
コマンドを実行して、バックアップのPVC情報を照会できます。 返されたstatus.resourceList.dataResource.pvcBackupInfo
リストのdataTypeフィールドには、PVCのデータ型 (FileSystemまたはSnapshot) が表示されます。 nameSpaceフィールドとpvcNameフィールドには、PVCの名前空間と名前が表示されます。重要ReadWriteManyボリュームの場合、ディスクへの復元はサポートされません。 ReadOnlyManyボリュームの場合、ディスクに復元するときに、ディスクが強制的に分離されないように、レプリカが複数のノードに同時にマウントされないようにします。
次のコマンドを実行して、リソース計画を作成します。
terraform plan
次の出力が返されます。これは、リソース計画が作成されたことを示します。
次のコマンドを実行して、復元タスクを作成します。
terraform apply
復元タスクが作成されたことを示す次の出力が返されます。
kubernetes_manifest.applicationbackup-demo: Creating... kubernetes_manifest.applicationrestore-demo: Creation complete after 1s Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
手順5: バックアップセンターからリソースを削除する
他のクラスターでも、作成したバックアップコンテナーを使用できます。 したがって、バックアップセンターではBackupLocationオブジェクトを削除できません。
スケジュールされたバックアップタスクの削除
terraform destroy
コマンドを実行してBackupScheduleリソースを削除し、スケジュールされたバックアップタスクを停止できます。
バックアップタスクまたは復元タスクの削除
次のコンテンツをcsdr.tf設定ファイルに追加し、ビジネス要件に基づいてコンテンツを変更します。
resource "kubernetes_manifest" "deleterequest-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "DeleteRequest" metadata = { name = "<objectName-dbr>" namespace = "csdr" } spec = { deleteObjectName = "<objectName>" deleteObjectType = "Backup" } } }
パラメーター
必須 / 任意
説明
name
可
削除リクエストの名前。
バックアップタスクを削除するには、バックアップタスクのApplicationBackup name + "-dbr" の形式でリクエスト名を指定します。
復元タスクを削除するには、復元タスクのApplicationRestore name + "-dbr" の形式でリクエスト名を指定します。
deleteObjectName
可
削除するリソースの名前。
deleteObjectType
可
削除するリソースのタイプ。 有効な値:
"Backup": ApplicationBackupオブジェクトとバックアップタスクの関連リソースを削除します。
"Restore": 復元タスクのApplicationRestoreオブジェクトと関連リソースを削除します。
説明バックアップタスクを削除しても、クラスターで作成されるバックアップには影響しません。
復元タスクを削除しても、復元されるデータには影響しません。
次のコマンドを実行して、リソース計画を作成します。
terraform plan
次の出力が返されます。これは、リソース計画が作成されたことを示します。
次のコマンドを実行してリソースを削除します。
terraform apply
次の出力が返されます。これは、リソースを削除するために
deleterequest
リソースが作成されたことを示します。kubernetes_manifest.deleterequest-demo: Creating... kubernetes_manifest.deleterequest-demo: Creation complete after 0s Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
説明システムが
deleterequest
リソースに基づいて対応するバックアップまたは復元タスクを削除すると、deleterequest
リソースも削除されます。
関連ドキュメント
kubectlを使用してアプリケーションをバックアップおよび復元する方法の詳細については、「kubectlを使用してアプリケーションをバックアップおよび復元する」をご参照ください。
ACKコンソールでアプリケーションをバックアップおよび復元する場合は、次のトピックを参照してください。