Terraform のカスタムリソースを使用して、ACK でバックアップボールト、スケジュール、クロスクラスター復元を管理します。
前提条件
開始する前に、次の条件を満たしていることを確認してください。
-
Kubernetes 1.18 以降を実行しているACK マネージドクラスター。
-
必要な権限を持つ migrate-controller がインストールされている必要があります。または、Terraform でインストールしてください。
-
名前が
cnfs-oss-で始まる OSS バケットが必要です。Terraform を使用して OSS を管理する方法については、「alicloud_oss_bucket」をご参照ください。 -
(ボリュームをバックアップする場合) Elastic Compute Service (ECS) スナップショットと Cloud Backup が有効になっていること。OSS を有効化し、ECS スナップショットを有効化し、Cloud Backup を有効化してください。
使用上の注意
-
kubectl deleteを実行してバックアップタスクや復元タスクを削除しないでください。クラウドリソースが完全にクリーンアップされない可能性があります。詳細については、「ステップ5:リソースの削除」をご参照ください。 -
migrate-controller を最新の状態に保ってください。詳細については、「コンポーネントの管理」をご参照ください。
-
以下のサンプルコードからパラメータを削除しないでください。パラメータが不足すると、バックアップの復元ができなくなる可能性があります。
ステップ1:クラスターへの接続
Terraform Kubernetes プロバイダーを使用して、KubeConfig ファイル経由でクラスターに接続します。
-
Terraform 作業ディレクトリを作成します。
-
このディレクトリ内に、
csdr.tfという名前のファイルを作成します。provider "kubernetes" { config_path = "~/.kube/config" } -
Terraform を初期化します。
terraform init
ステップ2:バックアップボールトの作成
バックアップボールト (BackupLocation CR) は、バックアップ用の OSS バケットとアクセス方法を指定します。
-
csdr.tfに次の内容を追加し、プレースホルダーを置き換えます。パラメータ 必須 説明 nameはい バックアップボールトの名前。Kubernetes の命名規則に準拠する必要があります。 networkはい OSS バケットへのアクセスに使用するネットワークモードです。 internal:すべてのクラスターがバケットと同じリージョンに存在する必要があります。public:リージョンの制限はありません。regionはい OSS バケットが配置されているリージョン。 bucketはい OSS バケット名。 cnfs-oss-で始まる必要があります。prefixいいえ バックアップを保存する OSS バケット内のサブディレクトリ。 providerはい クラウドプロバイダー。 alibabacloudに設定します。resource "kubernetes_manifest" "backuplocation-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "BackupLocation" metadata = { name = "<your-backup-vault-name>" # Kubernetes の命名規則に準拠する必要があります namespace = "csdr" } spec = { backupSyncPeriod = "0s" config = { network = "internal" # "internal": バケットとクラスターは同じリージョンに存在する必要があります # "public": リージョンの制限はありません region = "cn-beijing" # OSS バケットが配置されているリージョン } objectStorage = { bucket = "<cnfs-oss-your-bucket-name>" # cnfs-oss- で始まる必要があります prefix = "<sub-directory>" # オプション: このサブディレクトリにバックアップを保存します } provider = "alibabacloud" } } # バックアップボールトが利用可能になるまで待機します wait { fields = { "status.phase" = "Available" } } timeouts { create = "10m" } } -
変更内容をプレビューします。
terraform plan -
バックアップボールトを作成します。
terraform apply
ステップ3:バックアップタスクの作成
ACK は 2 つのバックアップモードをサポートしています。即時バックアップ (オンデマンドで 1 回実行) とスケジュールバックアップ (cron スケジュールで実行) です。
即時バックアップタスクの作成
-
csdr.tfに次の内容を追加し、プレースホルダーを置き換えます。ACK クラスターで Velero をご利用の場合、技術サポートについては DingTalk グループ 35532895 にご参加ください。
パラメータ 必須 説明 csdr.alibabacloud.com/backuplocationsはい バックアップボールトのアノテーション。BackupLocation の設定と完全に一致する必要があります。 nameはい 即時バックアップタスクの名前。 includedNamespacesはい バックアップする名前空間。 includedResourcesいいえ 含めるリソースタイプ。 includedResourcesまたはexcludedResourcesのいずれか 1 つのみを指定します。両方が空の場合、すべてのリソースタイプがバックアップされます。excludedResourcesいいえ 除外するリソースタイプ。 includedResourcesを参照してください。matchLabelsいいえ バックアップするリソースのラベル。 includeClusterResourcesいいえ クラスター スコープのリソースを制御します。 true:すべてのクラスター スコープのリソース。falseまたは未設定:指定された名前空間によって参照されるリソースのみ。ACK コンソールでのデフォルト:false。defaultPvBackupいいえ true:アプリケーションとボリュームをバックアップします。false:アプリケーションのみをバックアップします。storageLocationはい バックアップボールト (BackupLocation) の名前。 ttlはい バックアップの有効期間。形式: 720h0m0s。有効範囲:24h0m0s~1572864h0m0s。有効期限が切れたバックアップは復元できません。resource "kubernetes_manifest" "applicationbackup-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "ApplicationBackup" metadata = { name = "<your-backup-task-name>" namespace = "csdr" annotations = { # バックアップボールトの設定と完全に一致する必要があります "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<your-backup-vault-name>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-your-bucket-name>\",\"prefix\":\"<sub-directory>\",\"provider\":\"alibabacloud\"}" } } spec = { includedNamespaces = ["default", "default1"] # バックアップする名前空間 # includedResources または excludedResources のいずれか 1 つのみを指定します。 # 両方が空の場合、すべてのリソースタイプがバックアップされます。 includedResources = ["statefulset"] excludedResources = ["excludedResources"] labelSelector = { matchLabels = { "app" = "mysql-sts" # オプション: これらのラベルを持つリソースのみをバックアップします } } pvBackup = { defaultPvBackup = "false" # "true": アプリケーションとボリュームをバックアップ、"false": アプリケーションのみ } storageLocation = "<your-backup-vault-name>" # BackupLocation 名と一致する必要があります ttl = "720h0m0s" # バックアップの有効期間。形式:720h0m0s # 有効範囲:24h0m0s ~ 1572864h0m0s # 有効期限が切れたバックアップは復元できません # includeClusterResources は、クラスター スコープのリソースを含めるかどうかを制御します: # "true" — すべてのクラスター スコープのリソース (StorageClass、CRD、webhook など) を含めます # "false" — 指定された名前空間によって参照されるクラスター スコープのリソースのみを含めます # (たとえば、Pod がクラスターロールを持つサービスアカウントを使用している場合、 # そのクラスターロールは自動的に含まれます) # 未設定 — 名前空間フィルタリングが使用される場合、"false" と同じ動作 includeClusterResources = "false" } } # バックアップの完了を待機するには、コメントを解除します (スクリプト化されたワークフローに推奨)。 # バックアップ時間は、アプリケーション数とボリュームデータサイズによって異なります。 #wait { # fields = { # "status.phase" = "Completed" # } #} #timeouts { # create = "60m" #} } -
変更内容をプレビューします。
terraform plan -
即時バックアップタスクを作成します。
terraform apply
スケジュールバックアップタスクの作成
-
csdr.tfに次の内容を追加し、プレースホルダーを置き換えます。パラメータ 必須 説明 csdr.alibabacloud.com/backuplocationsはい バックアップボールトのアノテーション。BackupLocation の設定と完全に一致する必要があります。 nameはい スケジュールバックアップタスクの名前。 scheduleはい cron 式としてのバックアップ頻度。形式: 分 時 日 月 曜日。例:"1 4 * * *"は毎日 04:01 に実行されます。includedNamespacesはい バックアップする名前空間。 includedResourcesいいえ 含めるリソースタイプ。 includedResourcesまたはexcludedResourcesのいずれか 1 つのみを指定します。両方が空の場合、すべてのリソースタイプがバックアップされます。excludedResourcesいいえ 除外するリソースタイプ。 includedResourcesの注記を参照してください。matchLabelsいいえ バックアップするリソースのラベル。 includeClusterResourcesいいえ クラスター スコープのリソースを制御します。 true:すべてのクラスター スコープのリソース。falseまたは未設定:指定された名前空間によって参照されるリソースのみ。defaultPvBackupはい true:アプリケーションとボリュームをバックアップします。false:アプリケーションのみをバックアップします。storageLocationはい バックアップボールト (BackupLocation) の名前。 ttlはい バックアップの有効期間。形式: 720h0m0s。有効範囲:24h0m0s~1572864h0m0s。 -
変更内容をプレビューします。
terraform plan -
スケジュールバックアップタスクを作成します。
terraform apply
スケジュールバックアップタスクの管理
スケジュールによって作成されたバックアップの検索
特定のスケジュールから作成されたバックアップを一覧表示します。
data "kubernetes_resources" "list-applicationbackup" {
api_version = "csdr.alibabacloud.com/v1beta1"
kind = "ApplicationBackup"
namespace = "csdr"
label_selector = "csdr/schedule-name=<your-schedule-name>"
}
output "applicationbackup-name" {
value = data.kubernetes_resources.list-applicationbackup.objects
}
スケジュールバックアップタスクの変更
スケジュール頻度などのパラメータを変更するには、次の手順を実行します。
-
spec.pausedを"true"に設定してスケジュールを一時停止し、その後パラメータを更新します。例: -
変更内容をプレビューします。
terraform plan -
更新された設定を適用します。
terraform apply出力例:
kubernetes_manifest.backupschedule-demo: Modifying... kubernetes_manifest.backupschedule-demo: Modifications complete after 1s Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
データ保護 (PvBackup)
backupType を PvBackup に設定すると、ボリュームデータのみをバックアップします。pvcList を指定して特定の PVC をバックアップするか、storageClassList を指定して特定のストレージクラスのボリュームをバックアップします。両方を設定した場合、storageClassList は無視されます。どちらも設定しない場合、含まれる名前空間内のすべてのボリュームがバックアップされます。
即時PvBackupタスクの作成
-
csdr.tfに次の内容を追加し、必要に応じて値を調整します。resource "kubernetes_manifest" "applicationbackup-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "ApplicationBackup" metadata = { name = "<yourApplicationBackupName>" namespace = "csdr" annotations = { "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<yourBackuplocationName>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-yourBucketName>\",\"prefix\":\"<subDir>\",\"provider\":\"alibabacloud\"}" } } spec = { backupType = "PvBackup" includedNamespaces = ["default", "default1"] pvBackup = { pvcList = [ { namespace = "default", name = "pvc-nas" }, { namespace = "default1", name = "pvc-oss" } ] storageClassList = ["disk-essd", "disk-ssd"] } storageLocation = "<yourBackuplocationName>" ttl = "720h0m0s" } } } -
リソースプランを生成します。
terraform plan -
即時バックアップタスクを作成します。
terraform apply
PvBackupスケジュールの作成
-
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"] pvBackup = { pvcList = [ { namespace = "default", name = "pvc-nas" }, { namespace = "default1", name = "pvc-oss" } ] storageClassList = ["disk-essd", "disk-ssd"] } storageLocation = "<yourBackuplocationName>" ttl = "720h0m0s" } } } } -
リソースプランを生成して適用します。
terraform plan terraform apply
ステップ4:復元タスクの作成
復元タスク (ApplicationRestore CR) は、バックアップからアプリケーションを復元します。オプションで名前空間マッピングとストレージクラス変換が可能です。
-
csdr.tfに次の内容を追加し、プレースホルダーを置き換えます。パラメータ 必須 説明 csdr.alibabacloud.com/backuplocationsはい バックアップボールトのアノテーション。BackupLocation の設定と一致する必要があります。 nameはい 復元タスクの名前。 appRestoreOnlyいいえ true:アプリケーションのみを復元します (PersistentVolumeClaim (PVC)、PersistentVolume (PV)、またはボリュームデータは復元しません)。復元前に手動で PVC と PV を作成してください。false:アプリケーションとボリュームデータを復元します。デフォルト:false。preserveNodePortsいいえ true:元の NodePort 値を保持します。false:NodePort をランダムなポートに再割り当てします。両方のクラスターが同じ NodePort を共有している場合は、falseに設定してください。includedNamespacesはい 復元する名前空間。空の場合、バックアップされたすべての名前空間が復元されます。 includedResourcesいいえ 含めるリソースタイプ。 includedResourcesまたはexcludedResourcesのいずれか 1 つのみを指定します。excludedResourcesいいえ 除外するリソースタイプ。 backupNameはい 復元元のバックアップ名。スケジュールバックアップの場合、ポイントインタイムバックアップ名を指定します (例: <your-schedule-name>-20221205225845)。namespaceMappingいいえ <backup-namespace>を<target-namespace>にマッピングします。存在しないターゲット名前空間は自動的に作成されます。convertedargいいえ FileSystem タイプのボリューム (OSS、NAS、CPFS、ローカル) のストレージクラス変換リスト。各エントリは convertToStorageClassType(ターゲットストレージクラス。ディスクまたは NAS である必要があり、クラスターに存在する必要があります)、namespace、およびpersistentVolumeClaimを指定します。kubectl -ncsdr describe <backup-name>を実行して、対象となる PVC を特定してください。重要ReadWriteMany ボリュームはディスクに変換できません。ReadOnlyMany ボリュームの場合、レプリカが複数のノードに同時にマウントされないようにしてください。
resource "kubernetes_manifest" "applicationrestore-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "ApplicationRestore" metadata = { name = "<your-restoration-task-name>" namespace = "csdr" annotations = { "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<your-backup-vault-name>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-your-bucket-name>\",\"prefix\":\"<sub-directory>\",\"provider\":\"alibabacloud\"}" } } spec = { # "false": アプリケーションとボリュームデータを復元します (デフォルト) # "true": アプリケーションのみを復元します。事前に PVC と PV を手動で作成してください appRestoreOnly = "false" # "true": バックアップから元の NodePort 値を保持します # "false": NodePort をランダムなポートに再割り当てします (バックアップクラスターとターゲットクラスターが同じ NodePort を共有している場合に使用) preserveNodePorts = "true" includedNamespaces = ["default", "default1"] includedResources = ["statefulset"] excludedResources = ["excludedResources"] # FileSystem タイプのボリューム (OSS、NAS、CPFS、ローカルボリューム) のストレージクラス変換。 # `kubectl -ncsdr describe ` を実行し、 # `status.resourceList.dataResource.pvcBackupInfo` を確認して、変換可能な PVC を見つけてください。 # 重要:ReadWriteMany ボリュームはディスクに変換できません。 # ReadOnlyMany ボリュームをディスクに変換する場合、レプリカが複数のノードに同時にマウントされないようにしてください。 convertedarg = [ { convertToStorageClassType = "alicloud-disk-topology-alltype" # ターゲットストレージクラス (クラスターに存在する必要があります。ディスクまたは NAS のみ) namespace = "default" persistentVolumeClaim = "pvc-nas" }, { convertToStorageClassType = "alicloud-disk-topology-alltype" namespace = "default1" persistentVolumeClaim = "pvc-oss" } ] # 復元元のバックアップ。 # スケジュールバックアップの場合、ポイントインタイムバックアップ名を指定します。例: # "<your-schedule-name>-20221205225845" backupName = "<your-backup-task-name>" # バックアップ内の名前空間をターゲットクラスター内の別の名前空間にマッピングします。 # ターゲット名前空間が存在しない場合、自動的に作成されます。 namespaceMapping = { "<backup-namespace>" = "<target-namespace>" } } } # 復元の完了を待機するには、コメントを解除します (スクリプト化されたワークフローに推奨)。 # 復元時間は、アプリケーション数とボリュームデータサイズによって異なります。 #wait { # fields = { # "status.phase" = "Completed" # } #} #timeouts { # create = "60m" #} } -
変更内容をプレビューします。
terraform plan -
復元タスクを作成します。
terraform apply
ステップ5:リソースの削除
バックアップボールト (BackupLocation) は、他のクラスターが依存している可能性があるため削除できません。
スケジュールバックアップタスクの削除
terraform destroy を実行して、BackupSchedule を削除し、スケジュールを停止します。
バックアップタスクまたは復元タスクの削除
DeleteRequest CR を使用して、バックアップタスクまたは復元タスクと関連するクラウドリソースを安全に削除します。
バックアップタスクを削除しても、既存のバックアップには影響しません。復元タスクを削除しても、復元されたデータには影響しません。
-
csdr.tfに次の内容を追加します。パラメータ 必須 説明 nameはい 削除リクエストの名前。形式:バックアップタスクを削除する場合は <ApplicationBackup-name>-dbr、復元タスクを削除する場合は<ApplicationRestore-name>-dbr。deleteObjectNameはい 削除するリソースの名前。 deleteObjectTypeはい "Backup":ApplicationBackup CR と関連リソースを削除します。"Restore":ApplicationRestore CR と関連リソースを削除します。resource "kubernetes_manifest" "deleterequest-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "DeleteRequest" metadata = { name = "<object-name>-dbr" # 形式:<ApplicationBackup-or-ApplicationRestore-name>-dbr namespace = "csdr" } spec = { deleteObjectName = "<object-name>" # 削除するバックアップタスクまたは復元タスクの名前 deleteObjectType = "Backup" # "Backup": ApplicationBackup と関連リソースを削除します # "Restore": ApplicationRestore と関連リソースを削除します } } } -
変更内容をプレビューします。
terraform plan -
削除を適用します。
terraform applyターゲットリソースを削除した後、システムは DeleteRequest CR も削除します。