Faça backup e restaure aplicativos em contêineres em um cluster do vSphere Kubernetes Service usando o Trident Protect
Faça backup e restaure aplicativos em contêineres em um cluster vSphere Kubernetes Service (VKS) usando snapshots e backups do Trident Protect. Este procedimento inclui a criação de um AppVault usando o ONTAP S3 storage de objetos, configurar o Trident Protect para capturar dados do aplicativo, incluindo objetos de recursos do Kubernetes e volumes persistentes, e restaurar os dados quando necessário.
Os aplicativos em contêineres executados em um cluster VKS são gerenciados como cargas de trabalho do Kubernetes em namespaces de nós de trabalho. É importante proteger tanto os metadados do aplicativo quanto os volumes persistentes para que, caso sejam perdidos ou corrompidos, você possa recuperá-los.
Os volumes persistentes de aplicações VKS podem ser suportados pelo armazenamento ONTAP integrado ao cluster VKS usando "O Trident CSI". Este procedimento utiliza "Trident Protect" para criar snapshots de aplicação, cujos metadados são armazenados no storage de objetos ONTAP enquanto os dados do snapshot do volume permanecem no backend de armazenamento, e backups, cujos dados são copiados para o storage de objetos ONTAP. Você pode restaurar a partir de um snapshot ou de um backup quando necessário.
O Trident Protect permite a criação de snapshots, backups, restauração e recuperação de desastres de aplicações em um cluster Kubernetes. Os dados que podem ser protegidos com o Trident Protect incluem objetos de recursos do Kubernetes associados às aplicações e seus volumes persistentes.
A seguir estão as versões dos diversos componentes utilizados nos exemplos desta seção
-
VMware Cloud Foundation (VCF) 9.1 com vSphere Kubernetes Service
Instale o Trident Protect no cluster Kubernetes vSphere
Instalar Trident Protect
Use o Helm para instalar o Trident Protect no cluster do vSphere Kubernetes Service. Os exemplos nesta seção usam tridentctl-protect o Trident Protect CLI. Instale-o seguindo as instruções no "Documentação da CLI do Trident Protect". Métodos adicionais de instalação do Trident Protect estão documentados no "Documentação do Trident Protect".
Primeiro, crie e nomeie o `trident-protect`namespace. O `enforce=privileged`rótulo é necessário porque o Trident Protect executa cargas de trabalho privilegiadas. Sem ele, o controlador de admissão de segurança de pods do Kubernetes impedirá a inicialização dos pods do Trident Protect.
kubectl create namespace trident-protect
kubectl label namespace trident-protect pod-security.kubernetes.io/enforce=privileged
Em seguida, adicione o repositório Helm e instale o Trident Protect no namespace.
helm repo add netapp-trident-protect https://netapp.github.io/trident-protect-helm-chart
helm install trident-protect netapp-trident-protect/trident-protect --set clusterName=<name-of-cluster> --version 100.2606.0 --namespace trident-protect
|
|
Se os pods do Trident Protect não iniciarem com um erro de admissão PodSecurity, é possível que os rótulos de segurança do pod não tenham sido aplicados ao namespace trident-protect antes da instalação. Use --overwrite para reaplicá-los e, em seguida, verifique se os pods iniciam.
|
kubectl label namespace trident-protect pod-security.kubernetes.io/enforce=privileged --overwrite
kubectl get pods -n trident-protect
Crie um App Vault para storage de objetos.
Criar AppVault
Antes de criar snapshots e backups para um aplicativo, você deve configurar o storage de objetos no Trident Protect. Isso é feito criando um CR AppVault. Somente administradores podem criar e configurar um CR AppVault.
Os objetos AppVault são a representação de recurso personalizado do Kubernetes de um bucket de armazenamento. Um CR de AppVault contém as configurações necessárias para que um bucket seja usado em operações de proteção, como backup, snapshots, operações de restauração e replicação do SnapMirror.
As etapas a seguir criam um AppVault CR configurado para o ONTAP S3: Crie um servidor de armazenamento de objetos S3 na SVM no cluster ONTAP. . Crie um bucket no servidor de armazenamento de objetos. . Crie um usuário S3 na SVM. Guarde a chave de acesso e a chave secreta em um local seguro.
+ NOTA: o Trident Protect exige que o usuário S3 tenha pelo menos PutObject, GetObject, ListBucket e DeleteObject permissões. Sem essas permissões, as operações de backup e restauração do AppVault falham com erros de acesso negado. Para obter detalhes, consulte "Documentação do Trident Protect AppVault". . No cluster VKS, crie um segredo para armazenar as credenciais do ONTAP S3. . Crie um objeto AppVault para o ONTAP S3.
Configurar o Trident Protect AppVault para o ONTAP S3
|
|
O manifesto abaixo usa HTTPS com validação de certificado habilitada, o que é necessário para produção. Se o endpoint ONTAP S3 usar um certificado assinado por uma CA pública já confiável pelo cluster, nenhuma configuração de certificado adicional é necessária. Se usar um certificado autoassinado ou de uma CA interna, forneça o certificado da CA raiz personalizada usando o campo rootCA conforme mostrado no manifesto. Consulte a variante somente para laboratório no final desta seção se você precisar de uma configuração HTTP para testes isolados em ambiente de não produção.
|
# alias tp='tridentctl-protect'
# cat appvault-secret.yaml
apiVersion: v1
data:
accessKeyID: <base64 encoded access key>
secretAccessKey: <base64 encoded secret access key>
# Alternatively, remove the data section above and use:
# stringData:
# accessKeyID: "<access key of S3>"
# secretAccessKey: "<secret access key of S3>"
kind: Secret
metadata:
name: ontap-s3-appvault-secret1
namespace: trident-protect
type: Opaque
# cat appvault.yaml
apiVersion: protect.trident.netapp.io/v1
kind: AppVault
metadata:
name: ontap-s3-appvault1
namespace: trident-protect
spec:
providerConfig:
azure:
accountName: ""
bucketName: ""
endpoint: ""
gcp:
bucketName: ""
projectID: ""
s3:
bucketName: trident-protect
endpoint: <lif for S3 access>
secure: "true"
skipCertValidation: "false"
# If your ONTAP S3 endpoint uses a certificate signed by a public CA
# already trusted by the cluster, no additional certificate config is needed.
# If it uses a self-signed or internal CA certificate, provide the
# root CA certificate:
# rootCA: <root CA certificate>
providerCredentials:
accessKeyID:
valueFromSecret:
key: accessKeyID
name: ontap-s3-appvault-secret1
secretAccessKey:
valueFromSecret:
key: secretAccessKey
name: ontap-s3-appvault-secret1
providerType: OntapS3
# kubectl create -f appvault-secret.yaml -n trident-protect
# kubectl create -f appvault.yaml -n trident-protect
Variante exclusiva para laboratório (HTTP, sem validação de certificado)
Utilize as seguintes s3 configurações apenas em um ambiente de laboratório isolado, onde não haja dados confidenciais. Não utilize essas configurações em produção.
s3:
bucketName: trident-protect
endpoint: <lif for S3 access>
secure: "false"
skipCertValidation: "true"
Criar um aplicativo Trident Protect
Criar um aplicativo Trident Protect
Este exemplo aborda a proteção de dados para o aplicativo de exemplo postgres, que está instalado no namespace postgres. Para obter detalhes sobre a instalação, consulte "Implemente cargas de trabalho VKS usando o armazenamento NetApp".
|
|
Os PVCs de exemplo do PostgreSQL solicitam o modo de acesso RWO. O modo de acesso deve ser especificado explicitamente no manifesto do PVC; o Trident não seleciona automaticamente um modo de acesso com base no protocolo de storage. O modo RWX é compatível com PVCs baseados em NAS, e os PVCs baseados em SAN podem suportar RWX com configuração adicional. Para mais informações, consulte "Documentação do Trident Protect". |
No exemplo, o namespace postgres possui um aplicativo e todos os recursos do namespace são incluídos ao criar o Trident Protect Application.
# alias tp='tridentctl-protect'
# tp create app postgres-app --namespaces postgres -n postgres --dry-run > postgres-app.yaml
# cat postgres-app.yaml
apiVersion: protect.trident.netapp.io/v1
kind: Application
metadata:
name: postgres-app
spec:
includedNamespaces:
- namespace: postgres
resourceFilter: {}
# kubectl create -f postgres-app.yaml -n postgres
Proteja o aplicativo criando um backup
Criar backups
Criar um backup sob demanda
Crie um backup do aplicativo postgres-app criado anteriormente, incluindo todos os recursos no namespace postgres. Forneça o nome do appvault onde os backups serão armazenados.
# cat postgres-backup-on-demand.yaml
apiVersion: protect.trident.netapp.io/v1
kind: Backup
metadata:
name: postgres-backup-on-demand
spec:
appVaultRef: ontap-s3-appvault1
applicationRef: postgres-app
cleanupSnapshot: true
replicateSnapshot: false
kubectl create -f postgres-backup-on-demand.yaml -n postgres
Crie backups de acordo com uma programação
Crie um cronograma para os backups especificando a granularidade e o número de backups a serem mantidos.
# tp create schedule backup-schedule1 --app postgres-app --appvault ontap-s3-appvault1 --granularity Hourly --minute 45 --backup-retention 1 -n postgres --dry-run>postgres-backup-schedule1.yaml
#cat postgres-backup-schedule1.yaml
apiVersion: protect.trident.netapp.io/v1
kind: Schedule
metadata:
name: backup-schedule1
namespace: postgres
spec:
appVaultRef: ontap-s3-appvault1
applicationRef: postgres-app
backupRetention: "1"
dayOfMonth: ""
dayOfWeek: ""
enabled: true
granularity: Hourly
hour: ""
minute: "45"
recurrenceRule: ""
replicationRetention: "0"
runImmediately: false
snapshotRetention: "0"
# kubectl create -f postgres-backup-schedule1.yaml -n postgres
Restauração a partir do backup
Restaurar a partir de backups
Restaure o aplicativo no mesmo namespace
Neste exemplo, o backup postgres-backup-on-demand contém o backup para o postgres-app.
Antes de excluir o aplicativo, verifique se o backup que você pretende restaurar está no estado Completed correto. Um backup em andamento ou com falha não pode ser usado para restaurar o aplicativo.
kubectl get backup -n postgres
Após confirmar que o estado do backup é Completed, exclua o aplicativo postgres e certifique-se de que os PVCs e os objetos do pod sejam excluídos do namespace "postgres".
Agora, crie um objeto de restauração no local de backup.
# tp create bir postgres-app-restore --backup postgres/postgres-backup-on-demand -n postgres --dry-run>postgres-app-bir.yaml
# cat postgres-app-bir.yaml
apiVersion: protect.trident.netapp.io/v1
kind: BackupInplaceRestore
metadata:
annotations:
protect.trident.netapp.io/max-parallel-restore-jobs: "25"
name: postgres-app-restore
namespace: postgres
spec:
appArchivePath: postgres-app_314bbaf6-2ce3-4065-b3c1-ab85c7bb7c7c/backups/postgres-backup-on-demand_63efc9d1-92d7-45ce-84fe-846ce7db7b29
appVaultRef: ontap-s3-appvault1
cleanUpAdditionalExecHooks: true
cleanUpArchivedExecHooks: false
resourceFilter: {}
runArchivedExecHooks: true
# kubectl create -f postgres-app-bir.yaml -n postgres
Verifique se a implantação do aplicativo postgres, o serviço, o pod e os PVCs foram restaurados.
Restaure o aplicativo para um namespace diferente
Primeiro, crie um novo namespace para o qual você deseja restaurar o aplicativo, neste exemplo, postgres2. Um backup criado pelo agendamento agora está disponível para o aplicativo postgres-app. Use esse backup para restaurar o aplicativo para o novo namespace postgres2.
# tp create backuprestore --appvault ontap-s3-appvault1 --path postgres-app_314bbaf6-2ce3-4065-b3c1-ab85c7bb7c7c/backups/hourly-cbd11-20260831124500_2b57bda9-5cb0-4c8f-ae7a-20f94c23c3b9 --namespace-mapping postgres:postgres2 -n postgres2 --dry-run>postgres-app-postgres2-br.yaml
|
|
Para obter o caminho do backup, use o comando kubectl get backups <backup-name> -n postgres -o jsonpath='{.status.appArchivePath}'.
|
apiVersion: protect.trident.netapp.io/v1
kind: BackupRestore
metadata:
annotations:
protect.trident.netapp.io/max-parallel-restore-jobs: "25"
name: postgres-app-z2woek
namespace: postgres2
spec:
appArchivePath: postgres-app_314bbaf6-2ce3-4065-b3c1-ab85c7bb7c7c/backups/hourly-cbd11-20260831124500_2b57bda9-5cb0-4c8f-ae7a-20f94c23c3b9
appVaultRef: ontap-s3-appvault1
cleanUpAdditionalExecHooks: true
cleanUpArchivedExecHooks: false
namespaceMapping:
- destination: postgres2
source: postgres
resourceFilter: {}
runArchivedExecHooks: true
skipApplicationCreation: false
# kubectl create -f postgres-app-postgres2-br.yaml -n postgres2
Verifique se os objetos da aplicação postgres e os PVCs foram criados no novo namespace postgres2.
Proteja o aplicativo usando Snapshots
Criar Snapshots
Crie um snapshot sob demanda Crie um snapshot para o aplicativo e especifique o AppVault onde os metadados do snapshot serão armazenados. Os dados do snapshot do volume em si não são copiados para o storage de objetos — eles permanecem no backend de storage.
# tp create snapshot postgres-app-snapshot-ondemand --app postgres-app --appvault ontap-s3-appvault1 -n postgres --dry-run>postgres-app-snapshot-ondemand.yaml
# cat postgres-app-snapshot-ondemand.yaml
apiVersion: protect.trident.netapp.io/v1
kind: Snapshot
metadata:
name: postgres-app-snapshot-ondemand
namespace: postgres
spec:
appVaultRef: ontap-s3-appvault1
applicationRef: postgres-app
cleanupSnapshot: false
completionTimeout: 0s
volumeSnapshotsCreatedTimeout: 0s
volumeSnapshotsReadyToUseTimeout: 0s
# kubectl create -f postgres-app-snapshot-ondemand.yaml
snapshot.protect.trident.netapp.io/postgres-app-snapshot-ondemand created
Crie um cronograma para snapshots Crie um cronograma para os snapshots. Especifique a granularidade e o número de snapshots a serem retidos.
# tp create schedule snapshot-schedule1 --app postgres-app --appvault ontap-s3-appvault1 --granularity Hourly --minute 55 --snapshot-retention 1 -n postgres --dry-run>postgres-app-snapshot-schedule1.yaml
# cat postgres-app-snapshot-schedule1.yaml
apiVersion: protect.trident.netapp.io/v1
kind: Schedule
metadata:
name: snapshot-schedule1
namespace: postgres
spec:
appVaultRef: ontap-s3-appvault1
applicationRef: postgres-app
backupRetention: "0"
dayOfMonth: ""
dayOfWeek: ""
enabled: true
granularity: Hourly
hour: ""
minute: "55"
recurrenceRule: ""
replicationRetention: "0"
runImmediately: false
snapshotRetention: "1"
# kubectl create -f postgres-app-snapshot-schedule1.yaml
schedule.protect.trident.netapp.io/snapshot-schedule1 created
Restaurar a partir de Snapshot
Restaurar a partir de Snapshot
Restaure o aplicativo a partir de um Snapshot para o mesmo namespace
Antes de excluir o aplicativo, verifique se o snapshot que você pretende restaurar está no estado Completed. Um snapshot em andamento ou com falha não pode ser usado para restaurar o aplicativo.
kubectl get snapshot -n postgres
Após confirmar que o estado do snapshot é Completed, exclua os objetos do aplicativo e os PVCs para postgres do namespace postgres.
Crie um objeto de restauração no local a partir do Snapshot.
# tp create sir postgres-restore-from-snapshot --snapshot postgres/hourly-f1dd9-20260831135500 -n postgres --dry-run > postgres-sir.yaml
# cat postgres-sir.yaml
apiVersion: protect.trident.netapp.io/v1
kind: SnapshotInplaceRestore
metadata:
name: postgres-restore-from-snapshot
namespace: postgres
spec:
appArchivePath: postgres-app_314bbaf6-2ce3-4065-b3c1-ab85c7bb7c7c/snapshots/20260831135500_hourly-f1dd9-20260831135500_36c2bd2a-9405-4424-88a7-75e6bbc5b315
appVaultRef: ontap-s3-appvault1
cleanUpAdditionalExecHooks: true
cleanUpArchivedExecHooks: false
resourceFilter: {}
runArchivedExecHooks: true
# kubectl create -f postgres-sir.yaml
snapshotinplacerestore.protect.trident.netapp.io/postgres-restore-from-snapshot created
Verifique se os objetos e PVCs da aplicação são criados no namespace postgres.
Restaurar a aplicação a partir de um Snapshot para um namespace diferente
Exclua o aplicativo no namespace postgres2 que foi restaurado anteriormente do backup.
Crie o objeto de restauração do snapshot a partir do snapshot e forneça o mapeamento de namespace.
# tp create sr postgres-sr --snapshot postgres/hourly-f1dd9-20260831135500 --namespace-mapping postgres:postgres2 -n postgres2 --dry-run>postgres-sr.yaml
# cat postgres-sr.yaml
apiVersion: protect.trident.netapp.io/v1
kind: SnapshotRestore
metadata:
name: postgres-sr
namespace: postgres2
spec:
appArchivePath: postgres-app_314bbaf6-2ce3-4065-b3c1-ab85c7bb7c7c/snapshots/20260831135500_hourly-f1dd9-20260831135500_36c2bd2a-9405-4424-88a7-75e6bbc5b315
appVaultRef: ontap-s3-appvault1
cleanUpAdditionalExecHooks: true
cleanUpArchivedExecHooks: false
namespaceMapping:
- destination: postgres2
source: postgres
resourceFilter: {}
runArchivedExecHooks: true
skipApplicationCreation: false
# kubectl create -f postgres-sr.yaml
snapshotrestore.protect.trident.netapp.io/postgres-sr created
Verifique se os objetos e PVCs da aplicação foram restaurados no namespace postgres2.