Skip to main content
NetApp container solutions
Se proporciona el idioma español mediante traducción automática para su comodidad. En caso de alguna inconsistencia, el inglés precede al español.

Realiza copias de seguridad y restaura aplicaciones en contenedores en un clúster de Kubernetes Service de vSphere usando Trident Protect

Colaboradores banum-netapp

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

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
Nota 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
Trident Protect pods en funcionamiento
Trident Protect pods en funcionamiento

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

Importante 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"
ONTAP S3 AppVault creado

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".

Nota 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
Aplicación Trident Protect creada

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
Copia de seguridad bajo demanda creada
El estado de protección de la aplicación es parcial

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
Programación de copias de seguridad creada
Programación de copias de seguridad

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".

Objetos de Postgres-app
Objetos de Postgres-app
Objetos de Postgres-app eliminados

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
Copia de seguridad restaurada sin movimiento creada

Comprueba que se hayan restaurado la puesta en marcha de aplicaciones de postgres, el servicio, el pod y los PVC.

Aplicación restaurada

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.

Copia de seguridad cada hora disponible
# 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
Nota Para obtener la ruta de la copia de seguridad, utiliza el comando kubectl get backups <backup-name> -n postgres -o jsonpath='{.status.appArchivePath}'.
Ruta de copia de seguridad cada hora
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
Restauración de copia de seguridad creada

Comprueba que los objetos de la aplicación postgres y los PVC se hayan creado en el nuevo espacio de nombres postgres2.

La aplicación Postgres se restauró en el nuevo espacio de nombres

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
Instantánea bajo demanda

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
programación e instantánea creadas según una programación

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.

Objetos de la aplicación eliminados

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.

Aplicación de Postgres restaurada desde una instantánea

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.

Eliminar objetos de aplicación y PVC

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
Restauración de instantánea creada

Comprueba que los objetos y los PVC de la aplicación se restauraron en el espacio de nombres postgres2.

Aplicación restaurada en un espacio de nombres diferente