Applications

Note

The Application resource is in developer preview and a number of breaking changes to the resource API schema may happen in subsequent releases.

An Application resource represents an application that Veeam Kasten has been automatically discovered on the Kubernetes cluster. The application encapsulates all stateless and stateful resources that comprise it.

Life Cycle and Namespaces

Application resources are read-only and are automatically instantiated by Veeam Kasten when it discovers applications that are running on the Kubernetes cluster.

An Application resource is available in for each application that is currently running in the cluster. This resource resides in the same namespace as the application that it corresponds to.

When an application, for which Veeam Kasten has at least one existing RestorePointContent from a previous backup, is deleted from the cluster, a Application resource representing the application is still available in the namespace where Veeam Kasten is installed. The resource will be marked as a deleted application, but it will be possible for an administrator to restore the application.

Apps are also available to track applications that have been deleted from the Kubernetes cluster, but are available to be restored based on an existing RestorePointContent captured by Veeam Kasten.

Application Operations

List of Applications

The Application API allows you to discover all applications that are installed and currently present on the Kubernetes cluster.

# list available applications
$ kubectl get applications.apps.kio.kasten.io --namespace kasten-io \
                           --field-selector=status.state=Active
NAME                       AGE
my-app-1                   <unknown>
my-app-2                   <unknown>
my-app-3                   <unknown>

List of Deleted Applications

The Application API allows you to discover applications that Veeam Kasten can restore which have been previously deleted from the cluster.

# list deleted applications
$ kubectl get applications.apps.kio.kasten.io --namespace kasten-io \
                           --field-selector=status.state=Deleted
NAME                       AGE
my-app-5                   <unknown>
my-app-6                   <unknown>

Restore of Deleted Applications

In addition to discovery of deleted applications, Veeam Kasten makes it possible to restore an application that has been deleted but was previously protected.

The procedure, which requires Veeam Kasten administrative privileges, is as follows:

  • Step 1: Find the RestorePointContent that corresponds to the desired point-in-time.

  • Step 2: Re-create the namespace where you would like to restore the application.

  • Step 3: Create a RestorePoint in the new namespace that is backed by the RestorePointContent. See Creating RestorePoint from RestorePointContent Example for details.

  • Step 4: Initiate a RestoreAction to restore the application from the created RestorePoint. See RestoreAction for details.

Get Application Components

In addition to discovering the applications on the cluster, Veeam Kasten also tracks all resources associated with the application. You can get a summary of all resources (stateful and stateless) discovered in the context of the application. This is done by querying a details sub-resource for the particular application you are interested in.

# get the details of application named <APPNAME> in namespace <NS>
# yq is used for readability
$ kubectl get --raw /apis/apps.kio.kasten.io/v1alpha1/namespaces/<NS>/applications/<APPNAME>/details | yq -y .status.appDetails
components:
  config:
  - kind: secret
    name: default-token-wghrq
    namespace: sample-app
  - kind: secret
    name: muddled-saola-postgresql
    namespace: sample-app
  network:
  - kind: service
    name: muddled-saola-postgresql
    namespace: sample-app
  - kind: service
    name: muddled-saola-postgresql-headless
    namespace: sample-app
  volumes:
  - persistentVolumeClaimName: datadir
    size: 1
    type: EBS
  workloads:
  - kind: statefulset
    name: muddled-saola-postgresql
    namespace: sample-app

Initiate Backup for an Application

Apps can be protected on a scheduled basis using a Policy or in an ad hoc manner using a BackupAction.

For details see, Create a Backup Policy or BackupAction.

Veeam Kasten App API Type

The following is a complete specification of the Application resource.

Note

The Application resource is read-only.

# Standard Kubernetes API Version declaration. Required.
apiVersion: apps.kio.kasten.io/v1alpha1
# Standard Kubernetes Kind declaration. Required.
kind: Application
# Standard Kubernetes metadata. Required.
metadata:
  # Name of the K10App. Auto-derived.
  name: sample-app
  # Namespace of the K10App. Auto-derived.
  namespace: sample-app
  # Timestamp for when the application was created.
  creationTimestamp: '2019-02-11T03:03:47Z'
# K10App parameters. Required.
spec:
  # Currently only applications defines as namespaces are supported.
  # This may change in the near future with additional app types
  # Namespaced based app.
  namespace:
    # Name of the namespace hosting the application
    name: sample-app
# Status of the K10App. Users should not set any data here.
status:
  # State of the application.
  # Possible values:
  # Active - application is currently active
  # Deleted - application is not active but can be recovered
  state: Active

Veeam Kasten App Details API Type

The following is a complete specification of the appDetails section of the Application API. These fields are only available in the Application API when the details sub-resource is used as shown in the example above.

apiVersion: apps.kio.kasten.io/v1alpha1
kind: Application
...
spec:
...
status:
  ...
  # Details about the components of the application.
  appDetails:
    # Categorized components of the application.
    components:
      # List of 'config' components.
      config:
        # Zero or more elements.
        # Kind for config components.
      - kind: secret
        # Kubernetes name of the component.
        name: default-token-wghrq
        # Namespace of the component.
        namespace: sample-app
        # API version of the component.
        apiVersion: v1
        # Group name of the component.
        group:
        # Resource name of the component.
        resource: secrets
        # Annotations of the component.
        annotations:
        - sample-annotation: sample-app
        # List of blueprints bound to the resource via blueprint bindings.
        boundBlueprints:
          # Name of the bound blueprint.
        - name: my-blueprint
          # Namespace of the bound blueprint.
          namespace: kasten-io
          # Reference to a source blueprint binding.
          bindingRef:
            name: my-blueprint-binding
            namespace: kasten-io
      # List of 'network' components.
      network:
        # Analogous to 'config'.
        # Possible kinds: service | ingress
      # List of 'workload' components.
      workloads:
        # Analogous to 'config'.
        # Possible kinds: deployment | statefulset | cronjob
      # List of 'customresource' components.
      customresources:
        # Analogous to 'config'.
      # List of 'volumes' components.
      volumes:
        # Analogous to 'config' with the following additional fields:
        #   persistentVolumeClaimName - name of PVC
        #   podName - name of the pod
        #   size - size of underlying volume in GB
        #   type - identifier of disk type
      - persistentVolumeClaimName: datadir
        podName: sample-app-84xu1
        size: 1
        type: EBS

    # Additional component types maybe introduced.