The activeDeadlineSeconds property on a Pod definition

3 min read | by Jordi Prats

If we take a look all the possible properties for a Pod definition we might notice that there's one to limit the time a Pod can be running:

apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  activeDeadlineSeconds: 10
  containers:
  - args:
    - sleep
    - 24h
    image: alpine
    name: test

If we give it a try it will work as expected for a single Pod:

$ kubectl get pods --watch
NAME                           READY   STATUS             RESTARTS   AGE
test                           0/1     DeadlineExceeded   0          39s

For objects such a Job (or a CronJob) that we might want to be able to cancel if a Pod runs for too long it makes perfect sense:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: democron-sitemapgen
spec:
  schedule: '* * * * *'
  successfulJobsHistoryLimit: 1
  failedJobsHistoryLimit: 1
  jobTemplate:
    metadata:
      name: democron-sitemapgen
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          activeDeadlineSeconds: 40
          containers:
          - name: democron-sitemapgen
            image: alpine:latest
            command:
            - sleep
            - 24h

Trying this out we will be able to see how it kills the Pod once the activeDeadlineSeconds is reached:

$ kubectl get pods --watch
NAME                                    READY   STATUS              RESTARTS   AGE
democron-sitemapgen-27440182--1-mcldv   0/1     Pending             0          0s
democron-sitemapgen-27440182--1-mcldv   0/1     Pending             0          0s
democron-sitemapgen-27440182--1-mcldv   0/1     ContainerCreating   0          1s
democron-sitemapgen-27440182--1-mcldv   1/1     Running             0          12s
democron-sitemapgen-27440182--1-mcldv   1/1     DeadlineExceeded    0          40s
democron-sitemapgen-27440182--1-t874q   0/1     Pending             0          0s
democron-sitemapgen-27440182--1-t874q   0/1     Pending             0          0s
democron-sitemapgen-27440182--1-t874q   0/1     ContainerCreating   0          1s
democron-sitemapgen-27440182--1-t874q   1/1     Running             0          12s
democron-sitemapgen-27440182--1-mcldv   0/1     Error               0          77s
democron-sitemapgen-27440182--1-t874q   1/1     DeadlineExceeded    0          40s
democron-sitemapgen-27440182--1-cjbzw   0/1     Pending             0          0s
democron-sitemapgen-27440182--1-cjbzw   0/1     Pending             0          0s
democron-sitemapgen-27440182--1-cjbzw   0/1     ContainerCreating   0          0s
democron-sitemapgen-27440182--1-cjbzw   1/1     Running             0          12s
(...)

But if we try to the same on a Deployment like this:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-deploy
  labels:
    demo: test
spec:
  replicas: 1
  selector:
    matchLabels:
      demo: test
  template:
    metadata:
      labels:
        demo: test
    spec:
      activeDeadlineSeconds: 10
      containers:
      - args:
        - sleep
        - 24h
        image: alpine
        name: test

It won't allow us to have it on the Pod template:

$ kubectl apply -f test.yaml 
The Deployment "test-deploy" is invalid: spec.template.spec.activeDeadlineSeconds: Forbidden: activeDeadlineSeconds in ReplicaSet is not Supported

A deployment is intended for workloads that are supposed to be running perpetually, so the activeDeadlineSeconds doesn't make sense for that use case. If we want to be able to refresh the Pods on a Deployment (or a StatefulSet) we can use the bestby controller. With it we can use a label to defined how often Pods need to be refreshed


Posted on 07/03/2022