Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Back up and restore applications with Terraform

Última atualização: Aug 27, 2026

Gerencie cofres de backup, agendamentos e restauração entre clusters no ACK por meio de recursos personalizados do Terraform.

Pré-requisitos

Antes de começar, verifique se você possui:

Observações de uso

  • Não execute kubectl delete para remover tarefas de backup ou restauração, pois os recursos da nuvem podem não ser totalmente limpos. Consulte Step 5: Delete resources.

  • Mantenha o migrate-controller atualizado. Consulte Gerenciar componentes.

  • Evite remover parâmetros do código de exemplo abaixo. A ausência de parâmetros pode impedir a restauração do backup.

Etapa 1: Conectar-se a um cluster

Utilize o provedor Kubernetes do Terraform para se conectar ao seu cluster por meio de um arquivo KubeConfig.

  1. Crie um diretório de trabalho do Terraform.

  2. No diretório, crie um arquivo chamado csdr.tf:

    provider "kubernetes" {
      config_path = "~/.kube/config"
    }
  3. Inicialize o Terraform:

    terraform init

    Expandir para visualizar a saída

    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!

Etapa 2: Criar um cofre de backup

Um cofre de backup (CR BackupLocation) especifica o bucket do OSS e o método de acesso para os backups.

  1. Adicione o seguinte conteúdo ao arquivo csdr.tf, substituindo os espaços reservados:

    Parâmetro

    Obrigatório

    Descrição

    name

    Sim

    Nome do cofre de backup. Deve estar em conformidade com as convenções de nomenclatura do Kubernetes.

    network

    Sim

    Modo de rede para acessar o bucket do OSS. internal: todos os clusters devem estar na mesma região do bucket. public: sem restrições de região.

    region

    Sim

    Região onde o bucket do OSS reside.

    bucket

    Sim

    Nome do bucket do OSS. Deve começar com cnfs-oss-.

    prefix

    Não

    Subdiretório no bucket do OSS para armazenamento de backup.

    provider

    Sim

    Provedor de cloud. Defina como alibabacloud.

    resource "kubernetes_manifest" "backuplocation-demo" {
      manifest = {
        apiVersion = "csdr.alibabacloud.com/v1beta1"
        kind       = "BackupLocation"
        metadata = {
          name      = "<your-backup-vault-name>"   # Must comply with Kubernetes naming conventions
          namespace = "csdr"
        }
    
        spec = {
          backupSyncPeriod = "0s"
          config = {
            network = "internal"    # "internal": bucket and clusters must be in the same region
                                    # "public": no region restrictions
            region  = "cn-beijing"  # Region where the OSS bucket resides
          }
          objectStorage = {
            bucket = "<cnfs-oss-your-bucket-name>"  # Must start with cnfs-oss-
            prefix = "<sub-directory>"              # Optional: stores backups in this subdirectory
          }
          provider = "alibabacloud"
        }
      }
    
      # Wait until the backup vault is ready before proceeding
      wait {
        fields = {
          "status.phase" = "Available"
        }
      }
    
      timeouts {
        create = "10m"
      }
    }
  2. Visualize as alterações:

    terraform plan
  3. Crie o cofre de backup:

    terraform apply

    Expandir para visualizar a resposta

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

Etapa 3: Criar uma tarefa de backup

O ACK suporta dois modos de backup: backup instantâneo (executado uma vez sob demanda) e backup agendado (executado conforme um cronograma cron).

Criar uma tarefa de backup instantâneo

  1. Adicione o seguinte conteúdo ao arquivo csdr.tf, substituindo os espaços reservados:

    Se o seu cluster ACK usar o Velero, participe do grupo 35532895 no DingTalk para obter suporte técnico.

    Parâmetro

    Obrigatório

    Descrição

    csdr.alibabacloud.com/backuplocations

    Sim

    Anotação do cofre de backup. Deve corresponder exatamente à configuração do BackupLocation.

    name

    Sim

    Nome da tarefa de backup instantâneo.

    includedNamespaces

    Sim

    Namespaces para backup.

    includedResources

    Não

    Tipos de recursos a incluir. Especifique apenas um entre includedResources ou excludedResources. Se ambos estiverem vazios, o sistema fará backup de todos os tipos de recursos.

    excludedResources

    Não

    Tipos de recursos a excluir. Consulte includedResources.

    matchLabels

    Não

    Rótulos dos recursos para backup.

    includeClusterResources

    Não

    Controla recursos com escopo de cluster. true: todos os recursos com escopo de cluster. false ou não definido: apenas aqueles referenciados pelos namespaces especificados. Padrão no console do ACK: false.

    defaultPvBackup

    Não

    true: faz backup de aplicações e volumes. false: faz backup apenas das aplicações.

    storageLocation

    Sim

    Nome do cofre de backup (BackupLocation).

    ttl

    Sim

    Período de validade do backup. Formato: 720h0m0s. Intervalo válido: 24h0m0s a 1572864h0m0s. Backups expirados não podem ser restaurados.

    resource "kubernetes_manifest" "applicationbackup-demo" {
      manifest = {
        apiVersion = "csdr.alibabacloud.com/v1beta1"
        kind       = "ApplicationBackup"
        metadata = {
          name      = "<your-backup-task-name>"
          namespace = "csdr"
          annotations = {
            # Must match the backup vault configuration exactly
            "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"]  # Namespaces to back up
    
          # Specify only one of includedResources or excludedResources.
          # If both are empty, all resource types are backed up.
          includedResources = ["statefulset"]
          excludedResources = ["excludedResources"]
    
          labelSelector = {
            matchLabels = {
              "app" = "mysql-sts"  # Optional: back up only resources with these labels
            }
          }
    
          pvBackup = {
            defaultPvBackup = "false"  # "true": back up apps and volumes; "false": apps only
          }
    
          storageLocation = "<your-backup-vault-name>"  # Must match the BackupLocation name
    
          ttl = "720h0m0s"  # Backup validity period. Format: 720h0m0s
                            # Valid range: 24h0m0s to 1572864h0m0s
                            # Expired backups cannot be restored
    
          # includeClusterResources controls whether cluster-scoped resources are included:
          # "true"  — include all cluster-scoped resources (StorageClasses, CRDs, webhooks, etc.)
          # "false" — include only cluster-scoped resources referenced by the specified namespaces
          #           (for example, if a pod uses a service account with a cluster role,
          #            that cluster role is automatically included)
          # Unset  — same behavior as "false" when namespace filtering is used
          includeClusterResources = "false"
        }
      }
    
      # Uncomment to wait for backup completion (recommended for scripted workflows).
      # Backup duration depends on the number of applications and volume data size.
      #wait {
      #  fields = {
      #    "status.phase" = "Completed"
      #  }
      #}
      #timeouts {
      #  create = "60m"
      #}
    }
  2. Visualize as alterações:

    terraform plan
  3. Crie a tarefa de backup instantâneo:

    terraform apply

    Expandir para visualizar a saída

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

Criar uma tarefa de backup agendado

  1. Adicione o seguinte conteúdo ao arquivo csdr.tf, substituindo os espaços reservados:

    Expandir para visualizar o arquivo de configuração

    resource "kubernetes_manifest" "backupschedule-demo" {
      manifest = {
        apiVersion = "csdr.alibabacloud.com/v1beta1"
        kind       = "BackupSchedule"
        metadata = {
          name      = "<your-schedule-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 = {
          # Cron expression for the backup schedule (server time zone).
          # Format:  minute  hour  day-of-month  month  day-of-week
          # Example: "1 4 * * *" runs at 04:01 every day.
          schedule = "1 4 * * *"
    
          template = {
            includedNamespaces = ["default", "default1"]
            includedResources  = ["statefulset"]
            excludedResources  = ["excludedResources"]
            labelSelector = {
              matchLabels = {
                "app" = "mysql-sts"
              }
            }
            pvBackup = {
              defaultPvBackup = "false"  # Required for BackupSchedule
            }
            storageLocation         = "<your-backup-vault-name>"
            ttl                     = "720h0m0s"
            includeClusterResources = "false"
          }
        }
      }
    
      wait {
        fields = {
          "status.phase" = "Enabled"
        }
      }
    
      timeouts {
        create = "10m"
      }
    }

    Parâmetro

    Obrigatório

    Descrição

    csdr.alibabacloud.com/backuplocations

    Sim

    Anotação do cofre de backup. Deve corresponder exatamente à configuração do BackupLocation.

    name

    Sim

    Nome da tarefa de backup agendado.

    schedule

    Sim

    Frequência de backup como uma expressão cron. Formato: minute hour day-of-month month day-of-week. Exemplo: "1 4 * * *" executa às 04:01 todos os dias.

    includedNamespaces

    Sim

    Namespaces para backup.

    includedResources

    Não

    Tipos de recursos a incluir. Especifique apenas um entre includedResources ou excludedResources. Se ambos estiverem vazios, o sistema fará backup de todos os tipos de recursos.

    excludedResources

    Não

    Tipos de recursos a excluir. Consulte a observação sobre includedResources.

    matchLabels

    Não

    Rótulos dos recursos para backup.

    includeClusterResources

    Não

    Controla recursos com escopo de cluster. true: todos os recursos com escopo de cluster. false ou não definido: apenas aqueles referenciados pelos namespaces especificados.

    defaultPvBackup

    Sim

    true: faz backup de aplicações e volumes. false: faz backup apenas das aplicações.

    storageLocation

    Sim

    Nome do cofre de backup (BackupLocation).

    ttl

    Sim

    Período de validade do backup. Formato: 720h0m0s. Intervalo válido: 24h0m0s a 1572864h0m0s.

  2. Visualize as alterações:

    terraform plan
  3. Crie a tarefa de backup agendado:

    terraform apply

    Expandir para visualizar a saída

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

Gerencie tarefas de backup agendado

Localizar backups criados por um agendamento

Liste os backups de um agendamento específico:

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
}

Modifique uma tarefa de backup agendado

Para alterar parâmetros como a frequência do agendamento:

  1. Defina spec.paused como "true" para pausar o agendamento e, em seguida, atualize os parâmetros. Exemplo:

    Expandir para visualizar o arquivo de configuração

    resource "kubernetes_manifest" "backupschedule-demo" {
      manifest = {
        apiVersion = "csdr.alibabacloud.com/v1beta1"
        kind       = "BackupSchedule"
        metadata = {
          name      = "<your-schedule-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 = {
          paused   = "true"        # Pause the schedule before modifying
          schedule = "0 5 * * *"   # Updated backup frequency
          template = {
            includedNamespaces      = ["default", "default1"]
            includedResources       = ["statefulset"]
            excludedResources       = ["excludedResources"]
            labelSelector = {
              matchLabels = {
                "app" = "mysql-sts"
              }
            }
            pvBackup = {
              defaultPvBackup = "false"
            }
            storageLocation         = "<your-backup-vault-name>"
            ttl                     = "720h0m0s"
            includeClusterResources = "false"
          }
        }
      }
      wait {
        fields = {
          "status.phase" = "Paused"  # Confirm the schedule is paused before applying further changes
        }
      }
      timeouts {
        create = "10m"
      }
    }
  2. Visualize as alterações:

    terraform plan
  3. Aplique a configuração atualizada:

    terraform apply

    Saída esperada:

    kubernetes_manifest.backupschedule-demo: Modifying...
    kubernetes_manifest.backupschedule-demo: Modifications complete after 1s
    
    Apply complete! Resources: 0 added, 1 changed, 0 destroyed.

Proteção de dados (PvBackup)

Defina backupType como PvBackup para fazer backup apenas dos dados de volume. Especifique pvcList para fazer backup de PVCs específicos, ou storageClassList para fazer backup de volumes de StorageClasses específicas. Se você definir ambos, storageClassList será ignorado. Se você não definir nenhum, o sistema fará backup de todos os volumes nos namespaces incluídos.

Criar uma tarefa PvBackup instantânea

  1. Adicione o seguinte conteúdo ao arquivo csdr.tf, ajustando os valores conforme necessário:

    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"
        }
      }
    }
  2. Gere o plano de recursos:

    terraform plan
  3. Crie a tarefa de backup instantâneo:

    terraform apply

Criar um agendamento PvBackup

  1. Adicione o seguinte conteúdo ao arquivo csdr.tf, ajustando os valores conforme necessário:

    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"
          }
        }
      }
    }
  2. Gere o plano de recursos e aplique:

    terraform plan
    terraform apply

Etapa 4: Criar uma tarefa de restauração

Uma tarefa de restauração (CR ApplicationRestore) restaura aplicações a partir de um backup, com remapeamento opcional de namespace e conversão de StorageClass.

  1. Adicione o seguinte conteúdo ao arquivo csdr.tf, substituindo os espaços reservados:

    Parâmetro Obrigatório Descrição
    csdr.alibabacloud.com/backuplocations Sim Anotação do cofre de backup. Deve corresponder à configuração do BackupLocation.
    name Sim Nome da tarefa de restauração.
    appRestoreOnly Não true: restaura apenas aplicações (não restaura persistent volume claims (PVCs), persistent volumes (PVs) ou dados de volume); crie manualmente PVCs e PVs antes de restaurar. false: restaura aplicações e dados de volume. Padrão: false.
    preserveNodePorts Não true: mantém os valores originais de NodePort. false: reatribui NodePorts para portas aleatórias. Defina como false quando ambos os clusters compartilharem o mesmo NodePort.
    includedNamespaces Sim Namespaces a restaurar. Se estiver vazio, todos os namespaces com backup serão restaurados.
    includedResources Não Tipos de recursos a incluir. Especifique apenas um entre includedResources ou excludedResources.
    excludedResources Não Tipos de recursos a excluir.
    backupName Sim Nome do backup a partir do qual restaurar. Para backups agendados, especifique um nome de backup pontual, como <your-schedule-name>-20221205225845.
    namespaceMapping Não Mapeia <backup-namespace> para <target-namespace>. Namespaces de destino inexistentes são criados automaticamente.
    convertedarg Não Lista de conversão de StorageClass para volumes do tipo FileSystem (OSS, NAS, CPFS, local). Cada entrada especifica convertToStorageClassType (StorageClass de destino; deve ser disco ou NAS e deve existir no cluster), namespace e persistentVolumeClaim . Execute kubectl -ncsdr describe <backup-name> para identificar PVCs elegíveis.
    Importante

    Volumes ReadWriteMany não podem ser convertidos para disco. Para volumes ReadOnlyMany, garanta que as réplicas não sejam montadas simultaneamente em vários nós.

    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": restore applications and volume data (default)
          # "true":  restore applications only; manually create PVCs and PVs beforehand
          appRestoreOnly = "false"
    
          # "true":  retain the original NodePort values from the backup
          # "false": reassign NodePorts to random ports (use when backup and target clusters share the same NodePort)
          preserveNodePorts = "true"
    
          includedNamespaces = ["default", "default1"]
          includedResources  = ["statefulset"]
          excludedResources  = ["excludedResources"]
    
          # StorageClass conversion for FileSystem-type volumes (OSS, NAS, CPFS, local volumes).
          # Run `kubectl -ncsdr describe <backup-name>` and check
          # status.resourceList.dataResource.pvcBackupInfo to find PVCs eligible for conversion.
          # Important: ReadWriteMany volumes cannot be converted to disk.
          # For ReadOnlyMany volumes converted to disk, ensure replicas are not mounted on multiple nodes simultaneously.
          convertedarg = [
            {
              convertToStorageClassType = "alicloud-disk-topology-alltype"  # Target StorageClass (must exist in the cluster; disk or NAS only)
              namespace                 = "default"
              persistentVolumeClaim     = "pvc-nas"
            },
            {
              convertToStorageClassType = "alicloud-disk-topology-alltype"
              namespace                 = "default1"
              persistentVolumeClaim     = "pvc-oss"
            }
          ]
    
          # The backup to restore from.
          # For scheduled backups, specify a point-in-time backup name, for example:
          # "<your-schedule-name>-20221205225845"
          backupName = "<your-backup-task-name>"
    
          # Maps a namespace in the backup to a different namespace in the target cluster.
          # If the target namespace does not exist, it is created automatically.
          namespaceMapping = {
            "<backup-namespace>" = "<target-namespace>"
          }
        }
      }
    
      # Uncomment to wait for restoration completion (recommended for scripted workflows).
      # Restoration duration depends on the number of applications and volume data size.
      #wait {
      #  fields = {
      #    "status.phase" = "Completed"
      #  }
      #}
      #timeouts {
      #  create = "60m"
      #}
    }
  2. Visualize as alterações:

    terraform plan
  3. Crie a tarefa de restauração:

    terraform apply

    Expandir para visualizar as informações retornadas

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

Etapa 5: Exclua recursos

Importante

O cofre de backup (BackupLocation) não pode ser excluído porque outros clusters podem depender dele.

Exclua uma tarefa de backup agendado

Execute terraform destroy para remover o BackupSchedule e interromper o agendamento.

Exclua uma tarefa de backup ou restauração

Use um CR DeleteRequest para remover com segurança tarefas de backup ou restauração e os recursos associados da cloud.

Excluir uma tarefa de backup não afeta os backups existentes. Excluir uma tarefa de restauração não afeta os dados restaurados.
  1. Adicione o seguinte conteúdo ao arquivo csdr.tf:

    Parâmetro

    Obrigatório

    Descrição

    name

    Sim

    Nome da solicitação de exclusão. Formato: <ApplicationBackup-name>-dbr para excluir uma tarefa de backup, ou <ApplicationRestore-name>-dbr para excluir uma tarefa de restauração.

    deleteObjectName

    Sim

    Nome do recurso a ser excluído.

    deleteObjectType

    Sim

    "Backup": exclui o CR ApplicationBackup e recursos relacionados. "Restore": exclui o CR ApplicationRestore e recursos relacionados.

    resource "kubernetes_manifest" "deleterequest-demo" {
      manifest = {
        apiVersion = "csdr.alibabacloud.com/v1beta1"
        kind       = "DeleteRequest"
        metadata = {
          name      = "<object-name>-dbr"  # Format: <ApplicationBackup-or-ApplicationRestore-name>-dbr
          namespace = "csdr"
        }
        spec = {
          deleteObjectName = "<object-name>"   # Name of the backup or restoration task to delete
          deleteObjectType = "Backup"          # "Backup": deletes ApplicationBackup and related resources
                                               # "Restore": deletes ApplicationRestore and related resources
        }
      }
    }
  2. Visualize as alterações:

    terraform plan
  3. Aplique a exclusão:

    terraform apply

    Expandir para visualizar a saída

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

    Após excluir o recurso de destino, o sistema também exclui o CR DeleteRequest.

Próximas etapas

Referências