Add Application Awareness

In the previous step, we installed the demo application without any application awareness. This means that Keptn assumed that every workload is a single-service application at the moment and created the Application resources for you.

To get the overall state of an application, we need a grouping of workloads, called KeptnApp. To get this working, we need to modify our application manifest with two things:

  • Add an “app.kubernetes.io/part-of” or “keptn.sh/app” label to the deployment
  • Create an application resource

Preparing the Manifest and create an App resource


TL;DR

You can also use the prepared manifest and apply it directly using: kubectl apply -k sample-app/version-2/ and proceed here.


Otherwise

Create a temporary directory and copy the base manifest there:

mkdir ./my-deployment
cp demo-application/base/manifest.yml ./my-deployment

Now, open the manifest in your favorite editor and add the following label to the deployments, e.g.:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: podtato-head-right-leg
  namespace: podtato-kubectl
  labels:
    app: podtato-head
spec:
  selector:
    matchLabels:
      component: podtato-head-right-leg
  template:
    metadata:
      labels:
        component: podtato-head-right-leg
      annotations:
        keptn.sh/workload: "right-leg"
        keptn.sh/version: "0.1.0"
        keptn.sh/app: "podtato-head"
    spec:
      terminationGracePeriodSeconds: 5
      containers:
        - name: server
          image: ghcr.io/podtato-head/right-leg:latest
          imagePullPolicy: Always
          ports:
            - containerPort: 9000
          env:
            - name: PODTATO_PORT
              value: "9000"

Now, update the version of the workloads in the manifest to 0.2.0.

Finally, create an application resource (app.yaml) and save it in the directory as well:

apiVersion: lifecycle.keptn.sh/v1alpha2
kind: KeptnApp
metadata:
  name: podtato-head
  namespace: podtato-kubectl
spec:
  version: "latest"
  workloads:
    - name: left-arm
      version: "myvers12.5"
    - name: left-leg
      version: "my_v24"
    - name: entry
      version: "latest"
    - name: right-arm
      version: "0.1.1"
    - name: left-arm
      version: "0.1.1"
    - name: hat
      version: "0.1.1"

Now, apply the manifests:

kubectl apply -f ./my-deployment/.

Watch Application behavior

Now, your application gets deployed in an application aware way. This means that pre-deployment tasks and evaluations would be executed if you would have any. The same would happen for post-deployment tasks and evaluations after the last workload has been deployed successfully.

Now that you defined your application, you could watch the state of the whole application using:

kubectl get keptnappversions -n podtato-kubectl`

You should see that the application is in a progressing state as long as the workloads (kubectl get kwi) are progressing. After the last application has been deployed, and post-deployment tasks and evaluations are finished (there are none at this point), the state should switch to completed.

Now, we have deployed an application and are able to get the total state of the application state. Metrics and traces get exported and now we’re ready to dive deeper in the world of Pre- and Post-Deployment Tasks.