Realiza copias de seguridad y restaura aplicaciones en contenedores en un clúster de Kubernetes Service de vSphere usando Trident Protect
Realiza copias de seguridad y restaura aplicaciones en contenedores en un clúster de vSphere Kubernetes Service (VKS) usando instantáneas y copias de seguridad de Trident Protect. Este procedimiento incluye crear un AppVault usando almacenamiento de objetos S3 de ONTAP, configurar Trident Protect para capturar datos de la aplicación, incluidos los objetos de recursos de Kubernetes y los volúmenes persistentes, y restaurar los datos cuando sea necesario.
Las aplicaciones en contenedores que se ejecutan en un clúster de VKS se gestionan como cargas de trabajo de Kubernetes en los espacios de nombres de los nodos de trabajo. Es importante proteger tanto los metadatos de la aplicación como los volúmenes persistentes para que, si se pierden o se dañan, puedas recuperarlos.
Los volúmenes persistentes de las aplicaciones VKS pueden respaldarse mediante el almacenamiento ONTAP integrado con el clúster VKS usando "Trident CSI". Este procedimiento usa "Trident Protect" para crear capturas de pantalla de aplicaciones, cuyos metadatos se almacenan en el almacén de objetos ONTAP mientras que los datos de la captura de pantalla de volumen permanecen en el backend de almacenamiento, y copias de seguridad, cuyos datos se copian al almacén de objetos ONTAP. Puedes restaurar desde una captura de pantalla o una copia de seguridad cuando lo necesites.
Trident Protect permite realizar instantáneas, copias de seguridad, restauraciones y recuperación ante desastres de aplicaciones en un clúster de Kubernetes. Los datos que se pueden proteger con Trident Protect incluyen los objetos de recursos de Kubernetes asociados a las aplicaciones y sus volúmenes persistentes.
A continuación se indican las versiones de los distintos componentes utilizados en los ejemplos de esta sección
-
VMware Cloud Foundation (VCF) 9.1 con el servicio de Kubernetes de vSphere
Instala Trident Protect en el clúster de Kubernetes de vSphere
Instala Trident Protect
Utiliza Helm para instalar Trident Protect en el clúster del servicio de Kubernetes de vSphere. Los ejemplos de esta sección utilizan tridentctl-protect, la CLI de Trident Protect. Instálalo siguiendo las instrucciones en "Documentación de la interfaz de línea de comandos (CLI) de Trident Protect". Otros métodos para instalar Trident Protect están documentados en "Documentación de Trident Protect".
En primer lugar, crea y etiqueta el trident-protect espacio de nombres. La etiqueta enforce=privileged es obligatoria porque Trident Protect ejecuta cargas de trabajo con privilegios. Sin ella, el controlador de admisión de seguridad de pods de Kubernetes impedirá que se inicien los pods de Trident Protect.
kubectl create namespace trident-protect
kubectl label namespace trident-protect pod-security.kubernetes.io/enforce=privileged
A continuación, añade el repositorio de Helm e instala Trident Protect en el espacio de nombres.
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
|
|
Si los pods de Trident Protect no se inician con un error de admisión PodSecurity, es posible que las etiquetas de seguridad de los pods no se hayan aplicado al trident-protect espacio de nombres antes de la instalación. Usa --overwrite para volver a aplicarlas y luego verifica que los pods se inicien.
|
kubectl label namespace trident-protect pod-security.kubernetes.io/enforce=privileged --overwrite
kubectl get pods -n trident-protect
Crear App Vault para almacenamiento de objetos
Crear AppVault
Antes de crear instantáneas y copias de seguridad de una aplicación, debes configurar el almacenamiento de objetos en Trident Protect. Esto se hace creando un CR de AppVault. Solo los administradores pueden crear y configurar un CR de AppVault.
Los objetos AppVault son la representación de un recurso personalizado de Kubernetes de un bucket de almacenamiento. Un AppVault CR contiene las configuraciones necesarias para que un bucket se pueda usar en operaciones de protección, como copias de seguridad, instantáneas, operaciones de restauración y replicación SnapMirror.
Los siguientes pasos permiten crear un CR de AppVault configurado para ONTAP S3: Crea un servidor de almacén de objetos S3 en el SVM del clúster ONTAP. . Crea un bucket en el servidor de almacén de objetos. . Crea un usuario S3 en el SVM. Guarda la clave de acceso y la clave secreta en un lugar seguro.
+ NOTA: Trident Protect requiere que el usuario de S3 tenga al menos PutObject, GetObject, ListBucket y DeleteObject permisos. Sin estos permisos, las operaciones de copia de seguridad y restauración de AppVault fallan con errores de acceso denegado. Para más detalles, consulta "Documentación de Trident Protect AppVault". . En el clúster VKS, crea un secreto para guardar las credenciales de ONTAP S3. . Crea un objeto AppVault para ONTAP S3.
Configura Trident Protect AppVault para ONTAP S3
|
|
El manifiesto que se muestra a continuación utiliza HTTPS con la validación de certificados activada, lo cual es obligatorio para producción. Si tu endpoint ONTAP S3 utiliza un certificado firmado por una CA pública en la que el clúster ya confía, no necesitas ninguna configuración adicional de certificados. Si utiliza un certificado autofirmado o de una CA interna, proporciona el certificado de CA raíz personalizado usando el campo rootCA como se muestra en el manifiesto. Consulta la variante solo para laboratorio al final de esta sección si necesitas una configuración HTTP para pruebas aisladas que no sean de producción.
|
# 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 solo para laboratorio (HTTP, sin validación de certificados)
Utiliza únicamente la siguiente s3 configuración en un entorno de laboratorio aislado en el que no haya datos confidenciales. No utilices esta configuración en producción.
s3:
bucketName: trident-protect
endpoint: <lif for S3 access>
secure: "false"
skipCertValidation: "true"
Crear una aplicación de Trident Protect
Crear una aplicación de Trident Protect
Este ejemplo trata sobre la protección de datos de la aplicación de ejemplo «postgres», que está instalada en el espacio de nombres «postgres». Para obtener más información sobre la instalación, consulta "Implementa cargas de trabajo de VKS usando el almacenamiento NetApp".
|
|
Los PVC de PostgreSQL de ejemplo solicitan el modo de acceso RWO. El modo de acceso debe especificarse explícitamente en el manifiesto del PVC; Trident no selecciona automáticamente un modo de acceso en función del protocolo de almacenamiento. Se admite RWX para los PVC respaldados por NAS, y los PVC respaldados por SAN pueden admitir RWX con una configuración adicional. Para obtener más información, consulta "Documentación de Trident Protect". |
En el ejemplo, el espacio de nombres postgres tiene una aplicación y todos los recursos de ese espacio de nombres se incluyen al crear la 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
Protege la aplicación creando una copia de seguridad
Crear copias de seguridad
Crear una copia de seguridad bajo demanda
Crea una copia de seguridad de la aplicación postgres-app creada anteriormente que incluya todos los recursos en el espacio de nombres postgres. Indica el nombre de appvault donde se almacenarán las copias de seguridad.
# 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
Realizar copias de seguridad de forma programada
Crea una programación para las copias de seguridad especificando la granularidad y el número de copias de seguridad que quieres conservar.
# 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
Restaurar desde una copia de seguridad
Restaurar a partir de copias de seguridad
Restaurar la aplicación en el mismo espacio de nombres
En este ejemplo, la copia de seguridad postgres-backup-on-demand contiene la copia de seguridad para postgres-app.
Antes de eliminar la aplicación, comprueba que la copia de seguridad desde la que pretendes restaurar se encuentre en el estado Completed. No puedes usar una copia de seguridad en curso o fallida para restaurar la aplicación.
kubectl get backup -n postgres
Después de confirmar que el estado de la copia de seguridad es Completed, elimina la aplicación postgres y asegúrate de que los PVC y los objetos de pod se eliminen del espacio de nombres "postgres".
Ahora, crea un objeto de restaurar sin movimiento.
# 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
Comprueba que se hayan restaurado la puesta en marcha de aplicaciones de postgres, el servicio, el pod y los PVC.
Restaurar la aplicación en un espacio de nombres diferente
En primer lugar, crea un nuevo espacio de nombres en el que quieras restaurar la app; en este ejemplo, postgres2. Ya está disponible una copia de seguridad horaria creada por la programación para postgres-app. Utiliza esta copia de seguridad para restaurar la aplicación en el nuevo espacio de nombres 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 obtener la ruta de la copia de seguridad, utiliza el 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
Comprueba que los objetos de la aplicación postgres y los PVC se hayan creado en el nuevo espacio de nombres postgres2.
Protege la aplicación mediante instantáneas
Crear instantáneas
Crear una instantánea bajo demanda Crea una instantánea para la app y especifica el AppVault donde se almacenarán los metadatos de la instantánea. Los datos de la instantánea del volumen no se copian en el almacenamiento de objetos; permanecen en el backend de almacenamiento.
# 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
Crear una programación para las instantáneas Crea una programación para las instantáneas. Especifica la granularidad y el número de instantáneas que se van a conservar.
# 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 desde una instantánea
Restaurar desde una instantánea
Restaurar la aplicación desde una instantánea en el mismo espacio de nombres
Antes de eliminar la aplicación, comprueba que la instantánea desde la que pretendes restaurar se encuentre en el estado Completed. No se puede utilizar una instantánea en curso o fallida para restaurar la aplicación.
kubectl get snapshot -n postgres
Después de confirmar que el estado de la instantánea es Completed, elimina los objetos de la aplicación y los PVC de postgres del espacio de nombres de postgres.
Crea un objeto de restaurar sin movimiento a partir de la instantánea.
# 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
Comprueba que los objetos y los PVC de la aplicación se creen en el espacio de nombres postgres.
Restaurar la aplicación desde una instantánea en un espacio de nombres diferente
Elimina la aplicación en el espacio de nombres postgres2 que restauraste previamente desde la copia de seguridad.
Crea el objeto de restaurar sin movimiento de la instantánea a partir de la instantánea y proporciona la asignación del espacio de nombres.
# 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
Comprueba que los objetos y los PVC de la aplicación se restauraron en el espacio de nombres postgres2.