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

Container Service for Kubernetes:Terraform を使用してアプリケーションをバックアップおよび復元する

最終更新日:Apr 24, 2025

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 = "<バックアップボールト名>"
          namespace = "csdr"
        }
      
        spec = {
          backupSyncPeriod = "0s"
          config = {
            network = "internal"
            region  = "cn-beijing"
          }
          objectStorage = {
            bucket 	= "<cnfs-oss-バケット名>"
            prefix 	= "<サブディレクトリ>"
          }
          provider 	= "alibabacloud"  
        }
      }
      wait {
        fields = {
          "status.phase" = "Available"
        }
      }
    
      timeouts {
        create = "10m"
      }
    }

    パラメーター

    必須

    説明

    name

    はい

    バックアップボールトの名前。名前は Kubernetes の命名規則に準拠している必要があります。

    network

    はい

    指定された Object Storage Service (OSS) バケットにアクセスするために使用されるネットワークモード。有効な値:

    • internal: 内部モード。関連付けられているすべてのクラスターは、OSS バケットと同じリージョンにデプロイする必要があります。

    • public: パブリックモード。このモードにはリージョン制限はありません。

    region

    はい

    OSS バケットが存在するリージョン。

    bucket

    はい

    OSS バケットの名前。 OSS バケット名が cnfs-oss- で始まっていることを確認してください。

    prefix

    いいえ

    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      = "<バックアップボールト名>"
                  + namespace = "csdr"
                }
              + spec       = {
                  + backupSyncPeriod = "0s"
                  + config           = {
                      + network = "internal"
                      + region  = "cn-beijing"
                    }
                  + objectStorage    = {
                      + bucket = "<cnfs-oss-バケット名>"
                      + prefix = "<サブディレクトリ>"
                    }
                  + 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                       = "<バックアップボールト名>"
                  + 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-バケット名>"
                      + caCert = (known after apply)
                      + prefix = "<サブディレクトリ>"
                    }
                  + 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: バックアップタスクを作成する

ビジネス要件に基づいて、次のバックアップタイプのいずれかを選択できます。

  • [アプリケーションバックアップ]: クラスターで実行されているアプリケーション (クラスターリソースとアプリケーションで使用されるボリュームを含む) をバックアップします。

  • [データ保護]: ボリュームデータをバックアップします。リソースには、永続ボリューム要求 (PVC) と永続ボリューム (PV) のみが含まれます。

詳細については、「アプリケーションバックアップとデータ保護のシナリオとは」をご参照ください。

アプリケーションバックアップ

インスタントバックアップタスクを作成する

  1. 次の内容を csdr.tf 構成ファイルに追加し、ビジネス要件に基づいて内容を変更します。

    resource "kubernetes_manifest" "applicationbackup-demo" {
      manifest = {
        apiVersion  	= "csdr.alibabacloud.com/v1beta1"
        kind        	= "ApplicationBackup"
        metadata = {
          name		= "<アプリケーションバックアップ名>"
          namespace 	= "csdr"
          annotations = {
            "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<バックアップボールト名>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-バケット名>\",\"prefix\":\"<サブディレクトリ>\",\"provider\":\"alibabacloud\"}"
        }
        spec = {
          includedNamespaces 	= ["default","default1"]
          includedResources 	= ["statefulset"]
          excludedResources 	= ["excludedResources"]
          labelSelector 		= {
            matchLabels 		= {
              "app" = "mysql-sts"
            }
          }
          pvBackup = {
            defaultPvBackup 	= "false"
          } 
          storageLocation 		= "<バックアップボールト名>"
          ttl									= "720h0m0s"
          includeClusterResources = "false"
        }
      }
      
      # status.phase パラメーターの値が Completed に変わると、バックアップは成功です。
      # バックアップの所要時間は、クラスター内のアプリケーションの数とボリュームに保存されているデータ量によって異なります。
      #wait {
      #  fields = {
      #    "status.phase" = "Completed"
      #  }
      #}
    
      #timeouts {
      #  create = "60m"
      #}
     }
    }

    パラメーター

    必須

    説明

    csdr.alibabacloud.com/backuplocations

    はい

    バックアップを保存するバックアップボールト。情報がバックアップボールトの構成と同じであることを確認してください。

    name

    はい

    リアルタイムバックアップタスクの名前。

    includedNamespaces

    はい

    名前空間の名前。

    includedResources

    いいえ

    バックアップリストに含めるクラスターリソースのタイプ。

    重要

    予期しないバックアップ結果を避けるために、includedResources パラメーターと excludedResources パラメーターのいずれか 1 つのみを構成する必要があります。両方のパラメーターを空のままにすると、すべてのリソースタイプがバックアップされます。

    excludedResources

    いいえ

    バックアップリストから除外するクラスターリソースのタイプ。

    重要

    予期しないバックアップ結果を避けるために、includedResources パラメーターと excludedResources パラメーターのいずれか 1 つのみを構成する必要があります。両方のパラメーターを空のままにすると、すべてのリソースタイプがバックアップされます。

    matchLabels

    いいえ

    バックアップするリソースのラベル。

    includeClusterResources

    いいえ

    StorageClass、CustomResourceDefinitions (CRD)、Webhook など、すべてのクラスターレベルリソースをバックアップするかどうかを指定します。

    • true: すべてのクラスターレベルリソースをバックアップします。

    • false: 指定された名前空間内の名前空間レベルリソースで使用されるクラスターレベルリソースのみをバックアップします。たとえば、システムがポッドをバックアップすると、ポッドで使用されるサービスアカウントにクラスターロールが割り当てられます。この場合、クラスターロールは自動的にバックアップされます。システムがカスタムリソース (CR) をバックアップすると、対応する CRD がバックアップされます。

    説明

    デフォルトでは、IncludeClusterResourcesfalseACK コンソールで作成されたバックアップタスクでは、IncludeClusterResources は false に設定されています。

    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:<バックアップボールト名>,region:cn-beijing,bucket:<cnfs-oss-バケット名>,prefix:<サブディレクトリ>,provider:alibabacloud}"
                    }
                  + name        = "<アプリケーションバックアップ名>"
                  + 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                       = "<アプリケーションバックアップ名>"
                  + 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     = "<バックアップボールト名>"
                  + 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		= "<スケジュールバックアップタスク名>"
          namespace 	= "csdr"
          annotations = {
            "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<バックアップボールト名>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-バケット名>\",\"prefix\":\"<サブディレクトリ>\",\"provider\":\"alibabacloud\"}"
          }
        }
        spec = {
          schedule = "1 4 * * *"
          template = {
            includedNamespaces 			= ["default","default1"]
            includedResources 			= ["statefulset"]
            excludedResources 			= ["excludedResources"]
            labelSelector 				= {
              matchLabels 				= {
                "app" = "mysql-sts"
              }
            }
            pvBackup = {
              defaultPvBackup 			= "false"
            } 
            storageLocation 			= "<バックアップボールト名>"
            ttl											= "720h0m0s"
            includeClusterResources = "false"
          }
        }
      }
      wait {
        fields = {
          "status.phase" = "Enabled"
        }
      }
      timeouts {
        create = "10m"
      }
    }

    パラメーター

    必須

    説明

    csdr.alibabacloud.com/backuplocations

    はい

    バックアップを保存するバックアップボールト。情報がバックアップボールトの構成と同じであることを確認してください。

    name

    はい

    スケジュールバックアップタスクの名前。

    schedule

    はい

    バックアップサイクルを指定する Cron 式。 Cron 式の指定方法の詳細については、「バックアッププランを作成するときにバックアップサイクルを指定するにはどうすればよいですか。」をご参照ください。

    includedNamespaces

    はい

    名前空間の名前。

    includedResources

    いいえ

    バックアップリストに含めるクラスターリソースのタイプ。

    重要

    予期しないバックアップ結果を避けるために、includedResources パラメーターと excludedResources パラメーターのいずれか 1 つのみを構成する必要があります。両方のパラメーターを空のままにすると、すべてのリソースタイプがバックアップされます。

    excludedResources

    いいえ

    バックアップリストから除外するクラスターリソースのタイプ。

    重要

    予期しないバックアップ結果を避けるために、includedResources パラメーターと excludedResources パラメーターのいずれか 1 つのみを構成する必要があります。両方のパラメーターを空のままにすると、すべてのリソースタイプがバックアップされます。

    matchLabels

    いいえ

    バックアップするリソースのラベル。

    includeClusterResources

    いいえ

    StorageClass、CustomResourceDefinitions (CRD)、Webhook など、すべてのクラスターレベルリソースをバックアップするかどうかを指定します。

    • true: すべてのクラスターレベルリソースをバックアップします。

    • false: 指定された名前空間内の名前空間レベルリソースで使用されるクラスターレベルリソースのみをバックアップします。たとえば、システムがポッドをバックアップすると、ポッドで使用されるサービスアカウントにクラスターロールが割り当てられます。この場合、クラスターロールは自動的にバックアップされます。システムがカスタムリソース (CR) をバックアップすると、対応する CRD がバックアップされます。

    説明

    デフォルトでは、IncludeClusterResourcesfalseACK コンソールで作成されたバックアップタスクでは、IncludeClusterResources は false に設定されています。

    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:<バックアップボールト名>,region:cn-beijing,bucket:<cnfs-oss-バケット名>,prefix:<サブディレクトリ>,provider:alibabacloud}"
                    }
                  + name        = "<スケジュールバックアップタスク名>"
                  + namespace   = "csdr"
                }
              + spec       = {
                  + schedule = "1 4 * * *"
                  + template = {
                      + excludedResources  = [
                          + "excludedResources",
                        ]
                      + includedNamespaces = [
                          + "default",
                          + "default1",
                        ]
                      + includedResources  = [
                          + "statefulset",
                        ]
                      + labelSelector      = {
                          + matchLabels = {
                              + app = "mysql-sts"
                            }
                        }
                      + pvBackup           = {
                          + defaultPvBackup = "false"
                        }
                      + storageLocation    = "<バックアップボールト名>"
                      + 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                       = "<スケジュールバックアップタスク名>"
                  + 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         = "<バックアップボールト名>"
                      + 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.

関連操作

  • スケジュールバックアップタスクに基づいてバックアップを検索します。

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

    1. spec.paused パラメーターを true に設定してスケジュールバックアップタスクを一時停止し、ビジネス要件に基づいてバックアップタスクのバックアップ動作を定義する spec.schedule などの spec パラメーターの他のパラメーターを変更します。サンプルコード:

      resource "kubernetes_manifest" "backupschedule-demo" {
        manifest = {
          apiVersion          = "csdr.alibabacloud.com/v1beta1"
          kind                = "BackupSchedule"
          metadata = {
            name                              = "<スケジュールバックアップタスク名>"
            namespace         = "csdr"
            annotations = {
              "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<バックアップボールト名>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-バケット名>\",\"prefix\":\"<サブディレクトリ>\",\"provider\":\"alibabacloud\"}"
            }
          }
          spec = {
            # バックアップタスクを一時停止します。
            paused = "true"
            # バックアップタスクのバックアップサイクルを変更します。
            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 = {
            # バックアップタスクが一時停止されると、バックアップタスクの状態は想定どおりに Paused に変わります。
            "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.

データ保護

インスタントバックアップタスクを作成する

  1. 次の内容を csdr.tf 構成ファイルに追加し、ビジネス要件に基づいて内容を変更します。

    resource "kubernetes_manifest" "applicationbackup-demo" {
      manifest = {
        apiVersion  	= "csdr.alibabacloud.com/v1beta1"
        kind        	= "ApplicationBackup"
        metadata = {
          name		= "<アプリケーションバックアップ名>"
          namespace 	= "csdr"
          annotations = {
            "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<バックアップボールト名>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-バケット名>\",\"prefix\":\"<サブディレクトリ>\",\"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 		= "<バックアップボールト名>"
          ttl									= "720h0m0s"
        }
      }
      
      # status.phase フィールドの値が Completed に変わると、バックアッププロセスは正常に完了します。
      # バックアッププロセスに必要な時間は、クラスター内のアプリケーションの数とボリューム内のデータ量によって異なります。
      #wait {
      #  fields = {
      #    "status.phase" = "Completed"
      #  }
      #}
    
      #timeouts {
      #  create = "60m"
      #}
     }
    }
  2. 次のコマンドを実行して、リソースプランを作成します。

    terraform plan
  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		= "<スケジュールバックアップタスク名>"
          namespace 	= "csdr"
          annotations = {
            "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<バックアップボールト名>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-バケット名>\",\"prefix\":\"<サブディレクトリ>\",\"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 			= "<バックアップボールト名>"
            ttl											= "720h0m0s"
          }
        }
      }
      wait {
        fields = {
          "status.phase" = "Enabled"
        }
      }
      timeouts {
        create = "10m"
      }
    }

    パラメーター

    必須

    説明

    csdr.alibabacloud.com/backuplocations

    はい

    バックアップを保存するバックアップボールト。情報がバックアップボールトの構成と同じであることを確認してください。

    name

    はい

    リアルタイムバックアップタスクの名前。

    schedule

    はい

    バックアップサイクルを指定する Cron 式。 Cron 式の指定方法の詳細については、「バックアッププランを作成するときにバックアップサイクルを指定するにはどうすればよいですか。」をご参照ください。

    includedNamespaces

    はい

    名前空間の名前。

    pvcList

    いいえ

    バックアップするボリュームに対応する PVC。name パラメーターは、PVC の名前を指定します。

    重要
    • pvcListstorageClassList の両方が指定されている場合、storageClassList の構成は無効になります。

    • pvcListstorageClassList も指定されていない場合、指定された名前空間内のすべてのボリュームがバックアップされます。

    storageClassList

    いいえ

    バックアップするボリュームのタイプ。StorageClass の名前です。

    storageLocation

    はい

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

    説明

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

    ttl

    はい

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

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

    terraform plan
  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.

手順 4: 復元タスクを作成する

  1. 次の内容を csdr.tf 構成ファイルに追加し、ビジネス要件に基づいて内容を変更します。

    resource "kubernetes_manifest" "applicationrestore-demo" {
      manifest = {
        apiVersion  = "csdr.alibabacloud.com/v1beta1"
        kind        = "ApplicationRestore"
        metadata = {
          name        = "<アプリケーション復元名>"
          namespace   = "csdr"
          annotations = {
            "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<バックアップボールト名>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-バケット名>\",\"prefix\":\"<サブディレクトリ>\",\"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			= "<アプリケーションバックアップ名>"
          namespaceMapping			= {
            "<バックアップ名前空間>" = "<復元名前空間>"
          }
          imageRegistryMapping = {
            "<古いイメージレジストリ>" = "<新しいイメージレジストリ>"
          }
        }
      }
      
      # status.phase パラメーターの値が Completed に変わると、復元タスクは成功です。
      # 復元の所要時間は、クラスター内のアプリケーションの数とボリュームに保存されているデータ量によって異なります。
      #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

    いいえ

    このパラメーターはアプリケーションバックアップタスクにのみ有効で、データ保護タスクでは有効になりません。

    復元リストに含めるクラスターリソースのタイプ。

    重要

    バックアップが想定どおりに作成されるようにするには、次のパラメーターのいずれか 1 つのみを指定します。includedResourcesexcludedResources。両方のパラメーターを空のままにすると、すべてのリソースタイプがバックアップされます。

    excludedResources

    いいえ

    このパラメーターはアプリケーションバックアップタスクにのみ有効で、データ保護タスクでは有効になりません。

    復元リストから除外するクラスターリソースのタイプ。

    重要

    バックアップが想定どおりに作成されるようにするには、次のパラメーターのいずれか 1 つのみを指定します。includedResourcesexcludedResources。両方のパラメーターを空のままにすると、すべてのリソースタイプがバックアップされます。

    backupName

    はい

    復元するバックアップの名前。スケジュールバックアップ機能を使用する場合は、特定の時点に作成されたバックアップの名前を指定する必要があります。例: <スケジュールバックアップタスク名>-20221205225845

    namespaceMapping

    いいえ

    このパラメーターは、バックアップクラスター内の名前空間を復元クラスター内の名前空間にマップします。有効な値:

    • <バックアップ名前空間>: バックアップクラスター内のバックアップの名前空間。

    • <復元名前空間>: 復元クラスター内でリソースが復元される名前空間。このパラメーターを指定しない場合、リソースはバックアップクラスター内の名前空間と同じ名前を使用する名前空間に復元されます。

    説明

    <復元名前空間> が存在しない場合、システムは自動的に作成します。

    imageRegistryMapping

    いいえ

    このパラメーターは、イメージリポジトリアドレスを再指定し、条件を満たすすべてのアプリケーションのイメージ構成に適用されます。有効な値:

    • <古いイメージレジストリ>: バックアップ時のアプリケーションの元のイメージレジストリアドレス。

    • <新しいイメージレジストリ>: 復元時のターゲットイメージレジストリアドレス。設定されていない場合、アプリケーションのイメージ構成は変更されません。

    例:

    元のクラスター内のアプリケーションがイメージ registry.cn-beijing.aliyuncs.com/my-registry/nginx:v1 を使用しており、registry.cn-hangzhou.aliyuncs.com/my-registry/nginx:v1 に調整する必要がある場合は、このフィールドに次の構成を使用します。

      imageRegistryMapping:
        "registry.cn-beijing.aliyuncs.com/my-registry/": "registry.cn-hangzhou.aliyuncs.com/my-registry/"

    convertedarg

    いいえ

    StorageClass 変換リスト。OSS、NAS、CPFS、ローカルボリュームなどのファイルシステムタイプのボリュームの場合、このパラメーターを構成して、復元プロセス中に PVC の StorageClass を指定された StorageClass に変換できます。たとえば、NAS ボリュームをディスクボリュームに変換できます。

    • convertToStorageClassType: 目的の StorageClass。StorageClass が現在のクラスターに存在することを確認してください。ディスクまたは NAS StorageClass のみ指定できます。

    • namespace: PVC の名前空間。

    • persistentVolumeClaim: PVC の名前。

    上記は、StorageClass 変換機能に必要なパラメーターです。

    StorageClass の変換中に、ボリュームの AccessModes 構成を変更するための次のオプションパラメーターもサポートされています。

    • convertToAccessModes: 目的の AccessModes リスト。

    説明

    AccessModesReadWriteMany または ReadOnlyMany に設定されているボリュームをディスクに復元する場合は、ディスクの強制デタッチを避けるために、AccessModesReadWriteOnce に設定する必要があります。

    kubectl -ncsdr describe <バックアップ名> コマンドを実行して、バックアップの PVC 情報を照会できます。返された status.resourceList.dataResource.pvcBackupInfo リストでは、dataType フィールドに PVC のデータ型が表示されます。これは、ファイルシステムまたはスナップショットです。nameSpace フィールドと pvcName フィールドには、PVC の名前空間と名前が表示されます。

  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:<バックアップボールト名>,region:cn-beijing,bucket:<cnfs-oss-バケット名>,prefix:<サブディレクトリ>,provider:alibabacloud}"
                    }
                  + name        = "<アプリケーション復元名>"
                  + namespace   = "csdr"
                }
              + spec       = {
                  + appRestoreOnly     = "false"
                  + backupName         = "<アプリケーションバックアップ名>"
                  + 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   = {
                      + "<バックアップ名前空間>" = "<復元名前空間>"
                    }
                  + imageRegistryMapping = {
                      + "<古いイメージレジストリ>" = "<新しいイメージレジストリ>"
                    }
    
                  + 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                       = "<アプリケーション復元名>"
                  + namespace                  = "csdr"
                  + ownerReferences            = (known after apply)
                  + resourceVersion            = (known after apply)
                  + selfLink                   = (known after apply)
                  + uid                        = (known after apply)
                }
              + spec       = {
                  + appRestoreOnly          = false
                  + backupName              = "<アプリケーションバックアップ名>"
                  + convertedarg            = [
                      + {
                          + convertToAccessModes        = (known after apply)
                          + convertToStorageClassType = "alicloud-disk-topology-alltype"
                          + namespace                 = "default"
                          + persistentVolumeClaim     = "pvc-nas"
                        },
                      + {
                          + convertToAccessModes        = (known after apply)
    
                          + 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        = {
                      + "<バックアップ名前空間>" = "<復元名前空間>"
                    }
                  + imageRegistryMapping = {
                      + "<古いイメージレジストリ>" = "<新しいイメージレジストリ>"
                    }
                  + preserveNodePorts       = true
                  + pvRestore               = {
                      + pvcPrefix = (known after apply)
                      + pvcSuffix = (known after apply)
                    }
                  + pvRestoreOnly           = (known after apply)
                }
            }
        }
  3. 次のコマンドを実行して、復元タスクを作成します。

    terraform apply

    次の出力が返された場合、復元タスクが作成されています。

    kubernetes_manifest.applicationrestore-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		= "<オブジェクト名-dbr>"
          namespace 	= "csdr"
        }
        spec = {
          deleteObjectName 	= "<オブジェクト名>"
          deleteObjectType	= "Backup"
        }
      }
    }

    パラメーター

    必須

    説明

    name

    はい

    削除リクエストの名前。

    • バックアップタスクを削除するには、次の形式でリクエスト名を指定します。バックアップタスクの ApplicationBackup 名 + "-dbr"。

    • 復元タスクを削除するには、次の形式でリクエスト名を指定します。復元タスクの ApplicationRestore 名 + "-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      = "<オブジェクト名-dbr>"
                  + namespace = "csdr"
                }
              + spec       = {
                  + deleteObjectName = "<オブジェクト名>"
                  + 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                       = "<オブジェクト名-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 = "<オブジェクト名>"
                  + 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 リソースも削除されます。

参考資料