すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:Terraformを使用したアプリケーションのバックアップと復元

最終更新日:Dec 12, 2024

Terraformのコマンドラインインターフェイス (CLI) を使用して、バックアップボールト、アプリケーションバックアップ、およびアプリケーション復元用のカスタムリソース (CR) をバックアップクラスターおよび復元クラスターにデプロイし、クラスター間でアプリケーションを移行できます。

前提条件

使用上の注意

  • kubectlを使用してバックアップおよび復元タスクを削除して、deleteコマンドを実行しないでください。 そうしないと、関連するクラウドリソースが完全に削除されない場合があります。 バックアップを削除する方法の詳細については、このトピックの「手順5: バックアップセンターからリソースを削除する」を参照してください。

  • migrate-controllerという名前のバックアップセンターコンポーネントの新しいリリースに細心の注意を払い、できるだけ早くコンポーネントを最新バージョンに更新してください。 詳細については、「コンポーネントの管理」をご参照ください。

  • バックアップファイルを復元できない場合は、次のサンプルコードのパラメーターを削除しないでください。

手順1: クラスターの関連付け

Kubernetesプロバイダーを使用してクラスターを関連付けることができます。 Kubernetesプロバイダーの詳細については、「Kubernetesプロバイダー」をご参照ください。

この例では、KubeConfigファイルを使用して、クラスターを関連付ける方法を説明します。

  1. Terraformディレクトリを作成します。

  2. Terraformディレクトリにcsdr.tfという名前の設定ファイルを作成し、次の内容を設定ファイルにコピーしてKubeConfigファイルに関連付けます。

    provider "kubernetes" {
      config_path = "~/.kube/config"
    }
  3. 次のコマンドを実行して、Terraformのランタイム環境を初期化します。

    terraform init

    Terraformが初期化されたことを示す次の出力が返されます。

    ビュー出力

    Initializing the backend...
    
    Initializing provider plugins...
    - Reusing previous version of hashicorp/alicloud from the dependency lock file
    - Reusing previous version of hashicorp/kubernetes from the dependency lock file
    - Using previously-installed hashicorp/alicloud v1.223.1
    - Using previously-installed hashicorp/kubernetes v2.30.0
    
    ╷
    │ Warning: Additional provider information from registry
    │
    │ The remote registry returned warnings for registry.terraform.io/hashicorp/alicloud:
    │ - For users on Terraform 0.13 or greater, this provider has moved to aliyun/alicloud. Please
    │ update your source in required_providers.
    ╵
    
    Terraform has been successfully initialized!
    

ステップ2: バックアップコンテナーの作成

  1. 次のコンテンツを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バケット内のサブディレクトリ。 このパラメーターを指定すると、指定したサブディレクトリにバックアップが保存されます。

  2. 次のコマンドを実行して、リソース計画を作成します。

    terraform plan

    次の出力が返されます。これは、リソース計画が作成されたことを示します。

    ビュー出力

      # kubernetes_manifest.backuplocation-demo will be created
      + 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"
                }
            }
          + object   = {
              + apiVersion = "csdr.alibabacloud.com/v1beta1"
              + kind       = "BackupLocation"
              + metadata   = {
                  + annotations                = (known after apply)
                  + creationTimestamp          = (known after apply)
                  + deletionGracePeriodSeconds = (known after apply)
                  + deletionTimestamp          = (known after apply)
                  + finalizers                 = (known after apply)
                  + generateName               = (known after apply)
                  + generation                 = (known after apply)
                  + labels                     = (known after apply)
                  + managedFields              = (known after apply)
                  + name                       = "<yourBackuplocationName>"
                  + namespace                  = "csdr"
                  + ownerReferences            = (known after apply)
                  + resourceVersion            = (known after apply)
                  + selfLink                   = (known after apply)
                  + uid                        = (known after apply)
                }
              + spec       = {
                  + accessMode          = (known after apply)
                  + backupSyncPeriod    = "0s"
                  + config              = {
                      + network = "internal"
                      + region  = "cn-beijing"
                    }
                  + objectStorage       = {
                      + bucket = "<cnfs-oss-yourBucketName>"
                      + caCert = (known after apply)
                      + prefix = "<subDir>"
                    }
                  + provider            = "alibabacloud"
                  + validationFrequency = (known after apply)
                }
            }
    
          + timeouts {
              + create = "10m"
            }
    
          + wait {
              + fields = {
                  + "status.phase" = "Available"
                }
            }
        }
  3. 次のコマンドを実行して、バックアップコンテナーを作成します。

    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: バックアップタスクを作成する

インスタントバックアップタスクの作成

  1. 次のコンテンツを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コンソールで作成されたバックアップタスクでは、IncludeClusterResourcesfalseに設定されます。

    defaultPvBackup

    ボリュームをバックアップするかどうかを指定します。 有効な値:

    • true: アプリケーションとボリュームをバックアップします。

    • false: アプリケーションのみをバックアップします。

    storageLocation

    バックアップボールトの名前。

    説明

    ACKクラスターでVeleroを使用している場合は、DingTalkグループ35532895に参加してテクニカルサポートをリクエストします。

    ttl

    バックアップの有効期間。 期限切れのバックアップからデータを復元することはできません。 期間を720h0m0s形式で指定します。 有効値: 24h0m0s ~ 1572864h0m0s。

  2. 次のコマンドを実行して、リソース計画を作成します。

    terraform plan

    次の出力が返されます。これは、リソース計画が作成されたことを示します。

    ビュー出力

      # kubernetes_manifest.applicationbackup-demo will be created
      + resource "kubernetes_manifest" "applicationbackup-demo" {
          + manifest = {
              + apiVersion = "csdr.alibabacloud.com/v1beta1"
              + kind       = "ApplicationBackup"
              + metadata   = {
                  + annotations = {
                      + "csdr.alibabacloud.com/backuplocations" = "{name:<yourBackuplocationName>,region:cn-beijing,bucket:<cnfs-oss-yourBucketName>,prefix:<subDir>,provider:alibabacloud}"
                    }
                  + name        = "<yourApplicationBackupName>"
                  + namespace   = "csdr"
                }
              + spec       = {
                  + excludedResources  = [
                      + "excludedResources",
                    ]
                  + includedNamespaces = [
                      + "default",
                      + "default1",
                    ]
                  + includedResources  = [
                      + "statefulset",
                    ]
                  + labelSelector      = {
                      + matchLabels = {
                          + app = "mysql-sts"
                        }
                    }
                  + pvBackup           = {
                      + defaultPvBackup = "false"
                    }
                  + storageLocation    = "vault-a"
                  + ttl                = "720h0m0s"
                }
            }
          + object   = {
              + apiVersion = "csdr.alibabacloud.com/v1beta1"
              + kind       = "ApplicationBackup"
              + metadata   = {
                  + annotations                = (known after apply)
                  + creationTimestamp          = (known after apply)
                  + deletionGracePeriodSeconds = (known after apply)
                  + deletionTimestamp          = (known after apply)
                  + finalizers                 = (known after apply)
                  + generateName               = (known after apply)
                  + generation                 = (known after apply)
                  + labels                     = (known after apply)
                  + managedFields              = (known after apply)
                  + name                       = "<yourApplicationBackupName>"
                  + namespace                  = "csdr"
                  + ownerReferences            = (known after apply)
                  + resourceVersion            = (known after apply)
                  + selfLink                   = (known after apply)
                  + uid                        = (known after apply)
                }
              + spec       = {
                  + backupType              = (known after apply)
                  + excludedNamespaces      = (known after apply)
                  + excludedResources       = [
                      + "excludedResources",
                    ]
                  + includeClusterResources = (known after apply)
                  + includedNamespaces      = [
                      + "default",
                      + "default1",
                    ]
                  + includedResources       = [
                      + "statefulset",
                    ]
                  + labelSelector           = {
                      + matchExpressions = (known after apply)
                      + matchLabels      = {
                          + app = "mysql-sts"
                        }
                    }
                  + orderedResources        = (known after apply)
                  + pvBackup                = {
                      + defaultPvBackup  = false
                      + pvcList          = (known after apply)
                      + pvcSelector      = {
                          + matchExpressions = (known after apply)
                          + matchLabels      = (known after apply)
                        }
                      + snapshotPostRule = (known after apply)
                      + snapshotPreRule  = (known after apply)
                    }
                  + storageLocation     = "<yourBackuplocationName>"
                  + ttl                 = "720h0m0s"
                }
            }
        }
    
  3. 次のコマンドを実行して、インスタントバックアップタスクを作成します。

    terraform apply

    次の出力が返されます。これは、インスタントバックアップタスクが作成されたことを示します。

    kubernetes_manifest.applicationbackup-demo: Creating...
    kubernetes_manifest.applicationbackup-demo: Creation complete after 1s
    
    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

スケジュールされたバックアップタスクの作成

  1. 次のコンテンツをcsdr.tf設定ファイルに追加し、ビジネス要件に基づいてコンテンツを変更します。

    設定ファイルの表示

    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"]
            includedResources 			= ["statefulset"]
            excludedResources 			= ["excludedResources"]
            labelSelector 				= {
              matchLabels 				= {
                "app" = "mysql-sts"
              }
            }
            pvBackup = {
              defaultPvBackup 			= "false"
            } 
            storageLocation 			= "<yourBackuplocationName>"
            ttl											= "720h0m0s"
            includeClusterResources = "false"
          }
        }
      }
      wait {
        fields = {
          "status.phase" = "Enabled"
        }
      }
      timeouts {
        create = "10m"
      }
    }

    パラメーター

    必須 / 任意

    説明

    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コンソールで作成されたバックアップタスクでは、IncludeClusterResourcesfalseに設定されます。

    defaultPvBackup

    ボリュームをバックアップするかどうかを指定します。 有効な値:

    • true: アプリケーションとボリュームをバックアップします。

    • false: アプリケーションのみをバックアップします。

    storageLocation

    バックアップボールトの名前。

    説明

    ACKクラスターでVeleroを使用している場合は、DingTalkグループ35532895に参加してテクニカルサポートをリクエストします。

    ttl

    バックアップの有効期間。 期限切れのバックアップからデータを復元することはできません。 期間を720h0m0s形式で指定します。 有効値: 24h0m0s ~ 1572864h0m0s。

  2. 次のコマンドを実行して、リソース計画を作成します。

    terraform plan

    次の出力が返されます。これは、リソース計画が作成されたことを示します。

    ビュー出力

      # kubernetes_manifest.backupschedule-demo will be created
      + resource "kubernetes_manifest" "backupschedule-demo" {
          + manifest = {
              + apiVersion = "csdr.alibabacloud.com/v1beta1"
              + kind       = "BackupSchedule"
              + metadata   = {
                  + annotations = {
                      + "csdr.alibabacloud.com/backuplocations" = "{name:<yourBackuplocationName>,region:cn-beijing,bucket:<cnfs-oss-yourBucketName>,prefix:<subDir>,provider:alibabacloud}"
                    }
                  + name        = "<yourBackupscheduleName>"
                  + namespace   = "csdr"
                }
              + spec       = {
                  + schedule = "1 4 * * *"
                  + template = {
                      + excludedResources  = [
                          + "excludedResources",
                        ]
                      + includedNamespaces = [
                          + "default",
                          + "default1",
                        ]
                      + includedResources  = [
                          + "statefulset",
                        ]
                      + labelSelector      = {
                          + matchLabels = {
                              + app = "mysql-sts"
                            }
                        }
                      + pvBackup           = {
                          + defaultPvBackup = "false"
                        }
                      + storageLocation    = "<yourBackuplocationName>"
                      + ttl                = "720h0m0s"
                    }
                }
            }
          + object   = {
              + apiVersion = "csdr.alibabacloud.com/v1beta1"
              + kind       = "BackupSchedule"
              + metadata   = {
                  + annotations                = (known after apply)
                  + creationTimestamp          = (known after apply)
                  + deletionGracePeriodSeconds = (known after apply)
                  + deletionTimestamp          = (known after apply)
                  + finalizers                 = (known after apply)
                  + generateName               = (known after apply)
                  + generation                 = (known after apply)
                  + labels                     = (known after apply)
                  + managedFields              = (known after apply)
                  + name                       = "<yourBackupscheduleName>"
                  + namespace                  = "csdr"
                  + ownerReferences            = (known after apply)
                  + resourceVersion            = (known after apply)
                  + selfLink                   = (known after apply)
                  + uid                        = (known after apply)
                }
              + spec       = {
                  + backupAll = (known after apply)
                  + paused    = (known after apply)
                  + schedule  = "1 4 * * *"
                  + template  = {
                      + backupType              = (known after apply)
                      + excludedNamespaces      = (known after apply)
                      + excludedResources       = [
                          + "excludedResources",
                        ]
                      + includeClusterResources = (known after apply)
                      + includedNamespaces      = [
                          + "default",
                          + "default1",
                        ]
                      + includedResources       = [
                          + "statefulset",
                        ]
                      + labelSelector           = {
                          + matchExpressions = (known after apply)
                          + matchLabels      = {
                              + app = "mysql-sts"
                            }
                        }
                      + orderedResources        = (known after apply)
                      + pvBackup                = {
                          + defaultPvBackup  = false
                          + pvcList          = (known after apply)
                          + pvcSelector      = {
                              + matchExpressions = (known after apply)
                              + matchLabels      = (known after apply)
                            }
                          + snapshotPostRule = (known after apply)
                          + snapshotPreRule  = (known after apply)
                        }
                      + storageLocation         = "<yourBackuplocationName>"
                      + ttl                     = "720h0m0s"
                    }
                }
            }
          + timeouts {
              + create = "10m"
            }
    
          + wait {
              + fields = {
                  + "status.phase" = "Enabled"
                }
            }
        }
  3. 次のコマンドを実行して、スケジュールされたバックアップタスクを作成します。

    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
    }
  • スケジュールされたバックアップタスクを変更します。

    1. 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"
        }
      }
    2. 次のコマンドを実行して、リソース計画を作成します。

      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.
    3. 次のコマンドを実行して、変更されたスケジュール済みバックアップタスクを適用します。

      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: 復元タスクを作成する

  1. 次のコンテンツを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ボリュームの場合、ディスクに復元するときに、ディスクが強制的に分離されないように、レプリカが複数のノードに同時にマウントされないようにします。

  2. 次のコマンドを実行して、リソース計画を作成します。

    terraform plan

    次の出力が返されます。これは、リソース計画が作成されたことを示します。

    ビュー出力

      # kubernetes_manifest.applicationrestore-demo will be created
      + resource "kubernetes_manifest" "applicationrestore-demo" {
          + manifest = {
              + apiVersion = "csdr.alibabacloud.com/v1beta1"
              + kind       = "ApplicationRestore"
              + metadata   = {
                  + annotations = {
                      + "csdr.alibabacloud.com/backuplocations" = "{name:<yourBackuplocationName>,region:cn-beijing,bucket:<cnfs-oss-yourBucketName>,prefix:subpath,provider:alibabacloud}"
                    }
                  + name        = "<yourApplicationRestoreName>"
                  + namespace   = "csdr"
                }
              + spec       = {
                  + appRestoreOnly     = "false"
                  + backupName         = "<yourApplicationbackupName>"
                  + convertedarg       = [
                      + {
                          + convertToStorageClassType = "alicloud-disk-topology-alltype"
                          + namespace                 = "default"
                          + persistentVolumeClaim     = "pvc-nas"
                        },
                      + {
                          + convertToStorageClassType = "alicloud-disk-topology-alltype"
                          + namespace                 = "default1"
                          + persistentVolumeClaim     = "pvc-oss"
                        },
                    ]
                  + excludedResources  = [
                      + "excludedResources",
                    ]
                  + includedNamespaces = [
                      + "default",
                      + "default1",
                    ]
                  + includedResources  = [
                      + "statefulset",
                    ]
                  + namespaceMapping   = {
                      + default = "default1"
                    }
                  + preserveNodePorts  = "true"
                }
            }
          + object   = {
              + apiVersion = "csdr.alibabacloud.com/v1beta1"
              + kind       = "ApplicationRestore"
              + metadata   = {
                  + annotations                = (known after apply)
                  + creationTimestamp          = (known after apply)
                  + deletionGracePeriodSeconds = (known after apply)
                  + deletionTimestamp          = (known after apply)
                  + finalizers                 = (known after apply)
                  + generateName               = (known after apply)
                  + generation                 = (known after apply)
                  + labels                     = (known after apply)
                  + managedFields              = (known after apply)
                  + name                       = "<yourApplicationRestoreName>"
                  + namespace                  = "csdr"
                  + ownerReferences            = (known after apply)
                  + resourceVersion            = (known after apply)
                  + selfLink                   = (known after apply)
                  + uid                        = (known after apply)
                }
              + spec       = {
                  + appRestoreOnly          = false
                  + backupName              = "<yourApplicationbackupName>"
                  + convertedarg            = [
                      + {
                          + convertToStorageClassType = "alicloud-disk-topology-alltype"
                          + namespace                 = "default"
                          + persistentVolumeClaim     = "pvc-nas"
                        },
                      + {
                          + convertToStorageClassType = "alicloud-disk-topology-alltype"
                          + namespace                 = "default1"
                          + persistentVolumeClaim     = "pvc-oss"
                        },
                    ]
                  + excludedNamespaces      = (known after apply)
                  + excludedResources       = [
                      + "excludedResources",
                    ]
                  + existingResourcePolicy  = (known after apply)
                  + includeClusterResources = (known after apply)
                  + includedNamespaces      = [
                      + "default",
                      + "default1",
                    ]
                  + includedResources       = [
                      + "statefulset",
                    ]
                  + labelSelector           = {
                      + matchExpressions = (known after apply)
                      + matchLabels      = (known after apply)
                    }
                  + namespaceMapping        = {
                      + default = "default1"
                    }
                  + preserveNodePorts       = true
                  + pvRestore               = {
                      + pvcPrefix = (known after apply)
                      + pvcSuffix = (known after apply)
                    }
                  + pvRestoreOnly           = (known after apply)
                }
            }
        }
  3. 次のコマンドを実行して、復元タスクを作成します。

    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リソースを削除し、スケジュールされたバックアップタスクを停止できます。

バックアップタスクまたは復元タスクの削除

  1. 次のコンテンツを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オブジェクトと関連リソースを削除します。

    説明
    • バックアップタスクを削除しても、クラスターで作成されるバックアップには影響しません。

    • 復元タスクを削除しても、復元されるデータには影響しません。

  2. 次のコマンドを実行して、リソース計画を作成します。

    terraform plan

    次の出力が返されます。これは、リソース計画が作成されたことを示します。

    ビュー出力

      # kubernetes_manifest.deleterequest-demo will be created
      + resource "kubernetes_manifest" "deleterequest-demo" {
          + manifest = {
              + apiVersion = "csdr.alibabacloud.com/v1beta1"
              + kind       = "DeleteRequest"
              + metadata   = {
                  + name      = "<objectName-dbr>"
                  + namespace = "csdr"
                }
              + spec       = {
                  + deleteObjectName = "<objectName>"
                  + deleteObjectType = "Backup"
                }
            }
          + object   = {
              + apiVersion = "csdr.alibabacloud.com/v1beta1"
              + kind       = "DeleteRequest"
              + metadata   = {
                  + annotations                = (known after apply)
                  + creationTimestamp          = (known after apply)
                  + deletionGracePeriodSeconds = (known after apply)
                  + deletionTimestamp          = (known after apply)
                  + finalizers                 = (known after apply)
                  + generateName               = (known after apply)
                  + generation                 = (known after apply)
                  + labels                     = (known after apply)
                  + managedFields              = (known after apply)
                  + name                       = "<objectName-dbr>"
                  + namespace                  = "csdr"
                  + ownerReferences            = (known after apply)
                  + resourceVersion            = (known after apply)
                  + selfLink                   = (known after apply)
                  + uid                        = (known after apply)
                }
              + spec       = {
                  + backupName       = (known after apply)
                  + deleteObjectName = "<objectName>"
                  + deleteObjectType = "Backup"
                }
            }
        }
  3. 次のコマンドを実行してリソースを削除します。

    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リソースも削除されます。

関連ドキュメント