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:
Um ACK managed cluster executando Kubernetes 1.18 ou posterior.
O migrate-controller instalado com as permissões necessárias. Ou instale-o com o Terraform.
Um bucket do OSS cujo nome comece com
cnfs-oss-. Use o Terraform para gerenciar o OSS e alicloud_oss_bucket.(Se fizer backup de volumes) Snapshots do Elastic Compute Service (ECS) e Cloud Backup ativados. Activate OSS, Activate ECS snapshots e Activate Cloud Backup.
Observações de uso
Não execute
kubectl deletepara 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.
Crie um diretório de trabalho do Terraform.
-
No diretório, crie um arquivo chamado
csdr.tf:provider "kubernetes" { config_path = "~/.kube/config" } -
Inicialize o Terraform:
terraform init
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.
-
Adicione o seguinte conteúdo ao arquivo
csdr.tf, substituindo os espaços reservados:Parâmetro
Obrigatório
Descrição
nameSim
Nome do cofre de backup. Deve estar em conformidade com as convenções de nomenclatura do Kubernetes.
networkSim
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.regionSim
Região onde o bucket do OSS reside.
bucketSim
Nome do bucket do OSS. Deve começar com
cnfs-oss-.prefixNão
Subdiretório no bucket do OSS para armazenamento de backup.
providerSim
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" } } -
Visualize as alterações:
terraform plan -
Crie o cofre de backup:
terraform apply
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
-
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/backuplocationsSim
Anotação do cofre de backup. Deve corresponder exatamente à configuração do BackupLocation.
nameSim
Nome da tarefa de backup instantâneo.
includedNamespacesSim
Namespaces para backup.
includedResourcesNão
Tipos de recursos a incluir. Especifique apenas um entre
includedResourcesouexcludedResources. Se ambos estiverem vazios, o sistema fará backup de todos os tipos de recursos.excludedResourcesNão
Tipos de recursos a excluir. Consulte
includedResources.matchLabelsNão
Rótulos dos recursos para backup.
includeClusterResourcesNão
Controla recursos com escopo de cluster.
true: todos os recursos com escopo de cluster.falseou não definido: apenas aqueles referenciados pelos namespaces especificados. Padrão no console do ACK:false.defaultPvBackupNão
true: faz backup de aplicações e volumes.false: faz backup apenas das aplicações.storageLocationSim
Nome do cofre de backup (BackupLocation).
ttlSim
Período de validade do backup. Formato:
720h0m0s. Intervalo válido:24h0m0sa1572864h0m0s. 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" #} } -
Visualize as alterações:
terraform plan -
Crie a tarefa de backup instantâneo:
terraform apply
Criar uma tarefa de backup agendado
-
Adicione o seguinte conteúdo ao arquivo
csdr.tf, substituindo os espaços reservados:Parâmetro
Obrigatório
Descrição
csdr.alibabacloud.com/backuplocationsSim
Anotação do cofre de backup. Deve corresponder exatamente à configuração do BackupLocation.
nameSim
Nome da tarefa de backup agendado.
scheduleSim
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.includedNamespacesSim
Namespaces para backup.
includedResourcesNão
Tipos de recursos a incluir. Especifique apenas um entre
includedResourcesouexcludedResources. Se ambos estiverem vazios, o sistema fará backup de todos os tipos de recursos.excludedResourcesNão
Tipos de recursos a excluir. Consulte a observação sobre
includedResources.matchLabelsNão
Rótulos dos recursos para backup.
includeClusterResourcesNão
Controla recursos com escopo de cluster.
true: todos os recursos com escopo de cluster.falseou não definido: apenas aqueles referenciados pelos namespaces especificados.defaultPvBackupSim
true: faz backup de aplicações e volumes.false: faz backup apenas das aplicações.storageLocationSim
Nome do cofre de backup (BackupLocation).
ttlSim
Período de validade do backup. Formato:
720h0m0s. Intervalo válido:24h0m0sa1572864h0m0s. -
Visualize as alterações:
terraform plan -
Crie a tarefa de backup agendado:
terraform apply
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:
-
Defina
spec.pausedcomo"true"para pausar o agendamento e, em seguida, atualize os parâmetros. Exemplo: -
Visualize as alterações:
terraform plan -
Aplique a configuração atualizada:
terraform applySaí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
-
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" } } } -
Gere o plano de recursos:
terraform plan -
Crie a tarefa de backup instantâneo:
terraform apply
Criar um agendamento PvBackup
-
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" } } } } -
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.
-
Adicione o seguinte conteúdo ao arquivo
csdr.tf, substituindo os espaços reservados:Parâmetro Obrigatório Descrição csdr.alibabacloud.com/backuplocationsSim Anotação do cofre de backup. Deve corresponder à configuração do BackupLocation. nameSim Nome da tarefa de restauração. appRestoreOnlyNã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.preserveNodePortsNão true: mantém os valores originais de NodePort.false: reatribui NodePorts para portas aleatórias. Defina comofalsequando ambos os clusters compartilharem o mesmo NodePort.includedNamespacesSim Namespaces a restaurar. Se estiver vazio, todos os namespaces com backup serão restaurados. includedResourcesNão Tipos de recursos a incluir. Especifique apenas um entre includedResourcesouexcludedResources.excludedResourcesNão Tipos de recursos a excluir. backupNameSim Nome do backup a partir do qual restaurar. Para backups agendados, especifique um nome de backup pontual, como <your-schedule-name>-20221205225845.namespaceMappingNão Mapeia <backup-namespace>para<target-namespace>. Namespaces de destino inexistentes são criados automaticamente.convertedargNã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),namespaceepersistentVolumeClaim. Executekubectl -ncsdr describe <backup-name>para identificar PVCs elegíveis.ImportanteVolumes 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" #} } -
Visualize as alterações:
terraform plan -
Crie a tarefa de restauração:
terraform apply
Etapa 5: Exclua recursos
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.
-
Adicione o seguinte conteúdo ao arquivo
csdr.tf:Parâmetro
Obrigatório
Descrição
nameSim
Nome da solicitação de exclusão. Formato:
<ApplicationBackup-name>-dbrpara excluir uma tarefa de backup, ou<ApplicationRestore-name>-dbrpara excluir uma tarefa de restauração.deleteObjectNameSim
Nome do recurso a ser excluído.
deleteObjectTypeSim
"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 } } } -
Visualize as alterações:
terraform plan -
Aplique a exclusão:
terraform applyApós excluir o recurso de destino, o sistema também exclui o CR DeleteRequest.