Restart an Application Deployment

Learn how to restart an unsuccessful Keptn Application Deployment.

Restart an Application Deployment

During the deployment of a KeptnApp, it might be that the deployment fails due to an unsuccessful pre-deployment evaluation or pre-deployment task. This could happen because of, e.g., a misconfigured target value of a KeptnEvaluationDefinition, or a wrong URL being checked in a pre deployment check.

To retry a KeptnApp deployment without incrementing the version of the KeptnApp, we introduced the concept of ** revisions** for a KeptnAppVersion. This means that whenever the spec of a KeptnApp changes, even though the version stays the same, the KLT Operator will create a new revision of the KeptnAppVersion referring to the KeptnApp.

This way, when a KeptnApp failed due to a misconfigured pre-deployment check, you can first fix the configuration of the KeptnTaskDefinition/KeptnEvaluationDefinition, then increase the value of spec.revision of the KeptnApp and finally apply the updated KeptnApp manifest. This will result in a restart of the KeptnApp. Afterwards, all related KeptnWorkloadInstances will automatically refer to the newly created revision of the KeptnAppVersion to determine whether they are allowed to enter their respective deployment phase.

To illustrate this, let’s have a look at the following example:

apiVersion: v1
kind: Namespace
metadata:
  name: restartable-apps
  annotations:
    keptn.sh/lifecycle-toolkit: "enabled"
---
apiVersion: lifecycle.keptn.sh/v1alpha2
kind: KeptnApp
metadata:
  name: podtato-head
  namespace: restartable-apps
spec:
  version: "0.1.1"
  revision: 1
  workloads:
    - name: podtato-head-entry
      version: "0.1.2"
  preDeploymentTasks:
    - pre-deployment-check
---
apiVersion: lifecycle.keptn.sh/v1alpha2
kind: KeptnTaskDefinition
metadata:
  name: pre-deployment-check
  namespace: restartable-apps
spec:
  function:
    inline:
      code: |
        console.error("I failed")
        process.exit(1)        
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: podtato-head-entry
  namespace: restartable-apps
  labels:
    app: podtato-head
spec:
  selector:
    matchLabels:
      component: podtato-head-entry
  template:
    metadata:
      labels:
        component: podtato-head-entry
        keptn.sh/workload: podtato-head-entry
        keptn.sh/app: podtato-head
        keptn.sh/version: "0.1.2"
    spec:
      terminationGracePeriodSeconds: 5
      containers:
        - name: server
          image: ghcr.io/podtato-head/entry:0.2.7
          imagePullPolicy: Always
          ports:
            - containerPort: 9000
          env:
            - name: PODTATO_PORT
              value: "9000"

In this example, the KeptnApp executes a pre-deployment check which clearly fails due to the pre-deployment-check task, and will therefore not be able to proceed with the deployment.

After applying this manifest, you can inspect the status of the created KeptnAppVersion:

$ kubectl get keptnappversions.lifecycle.keptn.sh -n restartable-apps
NAME                   APPNAME        VERSION   PHASE
podtato-head-0.1.1-1   podtato-head   0.1.1     AppPreDeployTasks

You will notice that the KeptnAppVersion will stay in the AppPreDeployTasks phase for a while, due to the pre-check trying to run until a certain failure threshold is reached. Eventually, you will find the KeptnAppVersion’s PredeploymentPhase to be in a Failed state, with the remaining phases being Deprecated.

$ kubectl get keptnappversions.lifecycle.keptn.sh -n restartable-apps -owide
NAME                   APPNAME        VERSION   PHASE               PREDEPLOYMENTSTATUS   PREDEPLOYMENTEVALUATIONSTATUS   WORKLOADOVERALLSTATUS   POSTDEPLOYMENTSTATUS   POSTDEPLOYMENTEVALUATIONSTATUS
podtato-head-0.1.1-1   podtato-head   0.1.1     AppPreDeployTasks   Failed                Deprecated                      Deprecated              Deprecated             Deprecated

Now, to fix the deployment of this application, we first need to fix the task that has failed earlier. To do so, edit the pre-deployment-check KeptnTaskDefinition to the following (kubectl -n restartable-apps edit keptntaskdefinitions.lifecycle.keptn.sh pre-deployment-check):

apiVersion: lifecycle.keptn.sh/v1alpha2
kind: KeptnTaskDefinition
metadata:
  name: pre-deployment-check
  namespace: restartable-apps
spec:
  function:
    inline:
      code: |
                console.error("Success")

After we have done that, we can restart the deployment of our KeptnApplication by incrementing the spec.revision field by one (kubectl -n restartable-apps edit keptnapps.lifecycle.keptn.sh podtato-head):

apiVersion: lifecycle.keptn.sh/v1alpha2
kind: KeptnApp
metadata:
  name: podtato-head
  namespace: restartable-apps
spec:
  version: "0.1.1"
  revision: 2 # Increased this value from 1 to 2
  workloads:
    - name: podtato-head-entry
      version: "0.1.2"
  preDeploymentTasks:
    - pre-deployment-check

After those changes have been made, you will notice a new revision of the podtato-head KeptnAppVersion:

$ kubectl get keptnappversions.lifecycle.keptn.sh -n restartable-apps       
NAME                   APPNAME        VERSION   PHASE
podtato-head-0.1.1-1   podtato-head   0.1.1     AppPreDeployTasks
podtato-head-0.1.1-2   podtato-head   0.1.1     AppDeploy

As you will see, the newly created revision podtato-head-0.1.1-2 has made it beyond the pre-deployment check phase and has reached its AppDeployPhase.

You can also verify the execution of the pre-deployment-check by retrieving the list of KeptnTasks in the restartable-apps namespace:

$ kubectl get keptntasks.lifecycle.keptn.sh -n restartable-apps
NAME                             APPNAME        APPVERSION   WORKLOADNAME   WORKLOADVERSION   JOB NAME                              STATUS
pre-pre-deployment-check-49827   podtato-head   0.1.1                                         klc-pre-pre-deployment-check--77601   Failed
pre-pre-deployment-check-65056   podtato-head   0.1.1                                         klc-pre-pre-deployment-check--57313   Succeeded

You will notice that for both the KeptnAppVersions and KeptnTasks the previous failed instances are still available, as this might be useful historical data to keep track of what went wrong during earlier deployment attempts.

Last modified 2023-06-21: releasing documentation v0.8.0 (24f0a46)