Backup and Restore Using DataCore Puls8 with Veeam Kasten

Explore this Page

Overview

DataCore Puls8 integrates Veeam Kasten K10 to provide snapshot-based backup and restore capabilities for Kubernetes workloads that require application-aware data protection, scheduling, and off-cluster retention. The integration leverages Kubernetes CSI snapshots to protect Puls8-backed persistent volumes, with optional export of backup data to supported object storage locations. Veeam Kasten K10 operates alongside Puls8 to deliver policy-driven backup, restore, and recovery workflows through a centralized management interface.

This document describes how to configure and use Veeam Kasten with DataCore Puls8 to perform backup and restore operations. It covers installation, storage configuration, backup policy creation, restore workflows, and validation of restored applications.

  • Backup and restore operations using Veeam Kasten are supported with DataCore Puls8 storages:
    • Replicated PV Mayastor
    • Local PV LVM (only thin-provisioned LVM volumes are supported)
    • Local PV ZFS
  • Local PV ZFS supports both filesystem and block mode exports. Refer to the Protecting Applications section in the Veeam Kasten documentation for block-mode export configuration.

Requirements

Before you begin, ensure the following requirements are met:

  • A functional Kubernetes cluster with cluster-admin privileges
  • Helm CLI installed and configured
  • Prerequisites for DataCore Puls8 completed
  • Prerequisites for Veeam Kasten K10 completed, including access to the Veeam Kasten keyring file
  • Worker nodes with available storage devices for Replicated PV Mayastor
  • Network access to required container registries
  • DataCore Puls8 Helm chart installed on the cluster
  • A VolumeSnapshotClass configured and annotated for Veeam Kasten, enabling snapshot-based backup and restore operations for Puls8-backed PersistentVolumes:
  • Copy
    Create a VolumeSnapshotClass Annotated for Veeam Kasten
    cat <<EOF | kubectl create -f -
    kind: VolumeSnapshotClass
    apiVersion: snapshot.storage.k8s.io/v1
    metadata:
      name: csi-mayastor-snapshotclass
      annotations:
        k10.kasten.io/is-snapshot-class: "true"
    driver: io.openebs.csi-mayastor
    deletionPolicy: Delete
    EOF

    This example applies to Replicated PV Mayastor. Use the appropriate CSI driver when configuring snapshots for Local PV LVM or Local PV ZFS.

    Refer to the CSI Snapshot Configuration in the Veeam Kasten documentation for more information.

Install Veeam Kasten K10

  1. Add the Veeam Kasten Helm chart repository and update the local Helm index.

    Copy
    Add and Update the Veeam Kasten Helm Chart Repository
    helm repo add kasten https://charts.kasten.io/
    helm repo update
  2. Deploy Veeam Kasten K10 using Helm.

    Copy
    Install Veeam Kasten K10 using Helm
    helm install k10 kasten/k10 --namespace=kasten-io --create-namespace --verify --keyring=/path/to/keyringfile --version <version>
    Copy
    Example
    helm install k10 kasten/k10 --namespace=kasten-io --create-namespace --verify --keyring=/kastentesting/RPM-KASTEN --version 8.0.11

    Download the key ring file as specified in the prerequisites and specify the path to the file using the --keyring option. Refer to the Installing on Kubernetes documentation for more information.

  3. Verify Veeam Kasten pod status.

    Copy
    Verify that all Kasten K10 Pods are running
    kubectl get pods -n kasten-io
    Copy
    Sample Output
    NAME                                     READY   STATUS    RESTARTS   AGE
    aggregatedapis-svc-f4f9f7966-k9dtq       1/1     Running   0          4h1m
    auth-svc-569685bf5f-dt9cd                1/1     Running   0          4h1m
    catalog-svc-784fb8898c-6nvqh             2/2     Running   0          4h1m
    controllermanager-svc-784c456997-2zrmh   1/1     Running   0          4h1m
    crypto-svc-5bdd4b765f-tqvr6              4/4     Running   0          4h1m
    dashboardbff-svc-688798bfc7-lcm29        2/2     Running   0          4h1m
    executor-svc-5dc78f474f-6jq4t            1/1     Running   0          4h1m
    executor-svc-5dc78f474f-fsk8c            1/1     Running   0          4h1m
    executor-svc-5dc78f474f-n86z2            1/1     Running   0          4h1m
    frontend-svc-97874b4f9-w8dh7             1/1     Running   0          4h1m
    gateway-bbc9b4ff4-b55tt                  1/1     Running   0          4h1m
    jobs-svc-cf4f8d7fc-zvzq2                 1/1     Running   0          4h1m
    kanister-svc-65c75d5d8b-xdzb5            1/1     Running   0          4h1m
    logging-svc-d97bfdbb-6bpc5               1/1     Running   0          4h1m
    metering-svc-5dfc6c9f85-ph2c9            1/1     Running   0          4h1m
    prometheus-server-5f8bf7cb5d-cgjqw       2/2     Running   0          4h1m
    state-svc-7c687d9f4f-q52l6               2/2     Running   0          4h1m

Access the Veeam Kasten Dashboard

  1. Port-forward the Veeam Kasten gateway service to access the dashboard.

    Copy
    Port-Forward the Kasten Gateway Service
    kubectl --namespace kasten-io port-forward service/gateway 8080:80
    Copy
    Dashboard URL
    http://127.0.0.1:8080/k10/#/

    Port forwarding is not recommended for production environments.

  2. In the left navigation panel, expand Profiles and click Location. The Location Profiles page is displayed.

  3. On the Location Profiles page, click Create New Profile to create a Backup location profile.

  4. In the Create Location Profile wizard:

    • Enter a Name for the location profile.

    • Select the Storage Provider.

  5. Provide the below Configuration Details:

    • In the GCP Service Key field, paste the Google Cloud service account key in JSON or PKCS12 format.

    • From the Location drop-down list, select the region where the Google Cloud Storage bucket is located.

    • In the Bucket field, enter the name of the existing Google Cloud Storage bucket that will be used to store backups.

    • (Optional) Enable Immutable Backups if the bucket has object versioning and object retention already configured.

    • Click Next to continue to the Summary step.

  6. Verify Location Profile status.

    • After submitting the location profile, return to Profiles > Location in the left navigation panel.

    • On the Location Profiles page, locate the newly created profile in the list.

    • Verify the Validation status: Success indicates that the credentials and bucket configuration are valid and accessible.

    • Once the validation status shows Success, the location profile is ready to be used for backup and restore policies.

Deploy an Application Using DataCore Puls8

  1. Create a PVC using the Puls8 StorageClass.

    Copy
    Create a PVC
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: ms-volume-claim
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
      storageClassName: mayastor-1-thin
    Copy
    Apply the PVC Configuration
    kubectl apply -f pvc.yaml
  2. Deploy a NGINX Application.

    Copy
    Deploy an Application using a Puls8-Backed PVC
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      replicas: 1
      strategy:
        type: Recreate
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          nodeSelector:
            openebs.io/engine: mayastor
          volumes:
            - name: web-content
              persistentVolumeClaim:
                claimName: ms-volume-claim
          containers:
            - name: nginx
              image: nginx:latest
              ports:
                - containerPort: 80
              volumeMounts:
                - name: web-content
                  mountPath: /usr/share/nginx/html
    Copy
    Apply the Application Deployment
    kubectl apply -f deployment.yaml
  3. After deploying the application, verify that the PVC is successfully bound and that the application pod is running as expected.

    Copy
    Verify PVC Status
    kubectl get pvc
    Copy
    Sample Output
    NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      VOLUMEATTRIBUTESCLASS   AGE
    ms-volume-claim   Bound    pvc-482a2be1-5c90-4237-bd63-4b85a7a13f35   1Gi        RWO            mayastor-1-thin   <unset>                 4h2m

    Confirm that the PVC status is Bound and associated with the expected StorageClass.

  4. Verify that the application pod is running.

    Copy
    Verify Pod Status
    kubectl get pods
    Copy
    Sample Output
    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-75565c9485-z8btq   1/1     Running   0          3h54m

    Ensure that the pod is in the Running state and all containers are ready.

Access the Application

To validate that the application is correctly serving data from the Puls8-backed PVC, you can access the application using port forwarding.

Port forwarding is not recommended for production environments.

  1. Port-Forward the application pod.

    Copy
    Port-Forward the Application Pod
    kubectl port-forward pod/<pod-name> 8080:80
    Copy
    Sample Output
    Forwarding from 127.0.0.1:8080 -> 80
    Forwarding from [::1]:8080 -> 80
  2. Access the application using the following URL:

    Copy
    URL
    http://127.0.0.1:8080/
  3. Open the URL in a web browser and confirm that the application web page is displayed successfully. The page indicates that the application is serving content from the PVC backed by Replicated PV Mayastor.

Perform Backup

  1. In the Veeam Kasten dashboard, navigate to Policies from the left navigation pane.

  2. Click Create New Policy.

  3. Configure the policy with the following settings:

    • Action: Snapshot
    • Backup Frequency: On Demand
    • Enable Backups via Snapshot Exports: Enabled
    • Export Location Profile: Select the configured backup location
    • Select Applications: By Name
    • Target Application: Select the application namespace (for example, default)
    • Select Application Resources: All Resources

  4. Submit the policy.

  5. On the Policies page, verify that:

    • The policy status is Valid
    • The action is Snapshot + Export
    • The frequency is On Demand

    This confirms that the policy is ready for execution.

  6. From the Policies list, open the three-dot (⋮) menu for the policy and select Run Once.

  7. Specify a snapshot expiration time (optional) and confirm the operation.

  8. After execution begins, monitor the following:

    • Policy execution status
    • Backup phases such as metadata export and restore point export
    • Completion messages for each phase
  9. Verify successful backup completion in the Kasten dashboard.

Simulate Application Loss

  1. Verify the currently running application resources.

    Copy
    List Existing Application Resources
    kubectl get all
    Copy
    Sample Output
    NAME                         READY        STATUS          RESTARTS       AGE
    pod/nginx-75565c9485-z8btq   1/1          Running         0              18h

    NAME                         TYPE         CLUSTER-IP    EXTERNAL-IP    PORT(S)   AGE
    service/kubernetes           ClusterIP    10.96.0.1     <none>         443/TCP   22h

    NAME                         READY        UP-TO-DATE   AVAILABLE       AGE
    deployment.apps/nginx        1/1          1            1               18h
  2. Delete the application workloads.

    Using kubectl delete all --all can result in the unintended deletion of essential Kubernetes resources. This command should not be used in shared, production, or multi-tenant clusters. Instead, delete only the specific application resources created for this workflow, such as Deployments, Pods, Services, and PersistentVolumeClaims.

    Copy
    Delete Application Resources
    kubectl delete all --all
    Copy
    Sample Output
    pod "nginx-75565c9485-z8btq" deleted
    service "kubernetes" deleted
    deployment.apps "nginx" deleted
  3. Delete the PVC associated with the application.

    Copy
    Delete the PVC
    kubectl delete pvc --all
    Copy
    Sample Output
    persistentvolumeclaim "ms-volume-claim" deleted
  4. Confirm that all application resources and PVCs have been removed.

    Copy
    Verify Resource Deletion
    kubectl get all
    Copy
    Sample Output
    NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
    service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   16s

Restore the Application from Backup

  1. In the Veeam Kasten dashboard, navigate to Applications from the left navigation pane.

  2. Locate the application namespace (for example, default) that was previously backed up.

  3. Click the More options (⋮) menu next to the application and select Restore.

  4. In the Restore Points view, identify the most recent exported restore point associated with the backup policy.

  5. From the More options (⋮) menu for the restore point, select Restore.

  6. Verify the following information in the Restore Point summary:

    • Originating backup policy
    • Export profile
    • Creation time and restore point type

    Click Restore to proceed.

  7. In the Confirm Restore dialog, review the target application and restore timestamp. Click Restore to start the restore process.

  8. Specify a snapshot expiration time (optional) and confirm the operation.

  9. Monitor Restore progress:

    • Monitor the restore action status until it shows Completed.
    • Ensure all restore phases complete successfully without errors.

  10. Verify restored pods and PVCs.

    Copy
    Verify Pods and Kubernetes Resources
    kubectl get all
    Copy
    Sample Output
    NAME                               READY       STATUS       RESTARTS      AGE
    pod/nginx-75565c9485-d2dhg         1/1         Running      0             39s

    NAME                                TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
    service/kubernetes                  ClusterIP   10.96.0.1    <none>        443/TCP   7m37s

    NAME                               READY       UP-TO-DATE   AVAILABLE     AGE
    deployment.apps/nginx              1/1         1            1             40s

    NAME                               DESIRED     CURRENT      READY         AGE
    replicaset.apps/nginx-75565c9485   1           1            1             40s
  11. Confirm that the restored PVCs are successfully bound.

    Copy
    Verify PVCs
    kubectl get pvc
    Copy
    Sample Output
    NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      VOLUMEATTRIBUTESCLASS   AGE
    ms-volume-claim   Bound    pvc-ba0cc0ff-28c7-4a2a-bcb8-e1c33b9f87c6   1Gi        RWO            mayastor-1-thin   <unset>                 50s

Validate Application Functionality

  1. Access the application endpoint. Forward the application pod port to your local machine.

    Copy
    Forward Application Pod Port
    kubectl port-forward pod/<pod-name> 8080:80
    Copy
    Sample Output
    Forwarding from 127.0.0.1:8080 -> 80
    Forwarding from [::1]:8080 -> 80
    Handling connection for 8080
  2. Verify application behavior.

    Copy
    Open the Following URL in a Web Browser
    http://127.0.0.1:8080/

    Confirm that:

    • The application UI is accessible.
    • Application data is present and consistent with the pre-backup state.

Backup and restore operations can be performed in a similar manner using Local PV ZFS. Refer to the Configuring DataCore Puls8 Documentation for configuring and using Local PV ZFS.

Benefits of Using DataCore Puls8 with Veeam Kasten

  • Application-Consistent Backups: DataCore Puls8 Replicated PV Mayastor and Local PV ZFS integrate seamlessly with Veeam Kasten to enable snapshot-based backups that capture application state and persistent data consistently.
  • Snapshot-Based Data Protection: Application backups are performed using CSI snapshots, allowing persistent data to be captured and restored without manual volume handling.
  • Operational Visibility Through Veeam Kasten UI: Backup execution, restore progress, and completion status are clearly tracked using the Veeam Kasten dashboard.
  • Storage-Aware Restore Verification: Post-restore verification confirms that Puls8-backed PVCs are correctly rebound and application data is accessible after recovery.

Learn More