See also

For more information on how the KubernetesExecutor works, take a look at the guide: Kubernetes Executor

Module Contents

class airflow.executors.kubernetes_executor.KubeConfig[source]

Configuration for Kubernetes

core_section = core[source]
kubernetes_section = kubernetes[source]
_get_security_context_val(self, scontext)[source]
class airflow.executors.kubernetes_executor.KubernetesJobWatcher(namespace, watcher_queue, resource_version, worker_uuid, kube_config)[source]

Bases: multiprocessing.Process, airflow.utils.log.logging_mixin.LoggingMixin

Watches for Kubernetes jobs


Performs watching

_run(self, kube_client, resource_version, worker_uuid, kube_config)[source]
process_error(self, event)[source]

Process error response

process_status(self, pod_id, namespace, status, labels, resource_version, event)[source]

Process status response

class airflow.executors.kubernetes_executor.AirflowKubernetesScheduler(kube_config, task_queue, result_queue, kube_client, worker_uuid)[source]

Bases: airflow.utils.log.logging_mixin.LoggingMixin

Airflow Scheduler for Kubernetes

run_next(self, next_job)[source]

The run_next command will check the task_queue for any un-run jobs. It will then create a unique job-id, launch that job in the cluster, and store relevant info in the current_jobs map so we can track the job’s status

delete_pod(self, pod_id, namespace)[source]

Deletes POD


The sync function checks the status of all currently running kubernetes jobs. If a job is completed, it’s status is placed in the result queue to be sent back to the scheduler.


process_watcher_task(self, task)[source]

Process the task by watcher.

static _strip_unsafe_kubernetes_special_chars(string)[source]

Kubernetes only supports lowercase alphanumeric characters and “-” and “.” in the pod name However, there are special rules about how “-” and “.” can be used so let’s only keep alphanumeric chars see here for detail:


string – The requested Pod name


str Pod name stripped of any unsafe characters

static _make_safe_pod_id(safe_dag_id, safe_task_id, safe_uuid)[source]

Kubernetes pod names must be <= 253 chars and must pass the following regex for validation ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$

  • safe_dag_id – a dag_id with only alphanumeric characters

  • safe_task_id – a task_id with only alphanumeric characters

  • safe_uuid – a uuid


str valid Pod name of appropriate length

static _create_pod_id(dag_id, task_id)[source]
static _label_safe_datestring_to_datetime(string)[source]

Kubernetes doesn’t permit “:” in labels. ISO datetime format uses “:” but not “_”, let’s replace “:” with “_”


string – str


datetime.datetime object

static _datetime_to_label_safe_datestring(datetime_obj)[source]

Kubernetes doesn’t like “:” in labels, since ISO datetime format uses “:” but not “_” let’s replace “:” with “_”


datetime_obj – datetime.datetime object


ISO-like string representing the datetime

_labels_to_key(self, labels)[source]

Termninates the watcher.

class airflow.executors.kubernetes_executor.KubernetesExecutor[source]

Bases: airflow.executors.base_executor.BaseExecutor, airflow.utils.log.logging_mixin.LoggingMixin

Executor for Kubernetes

clear_not_launched_queued_tasks(self, session=None)[source]

If the airflow scheduler restarts with pending “Queued” tasks, the tasks may or may not have been launched Thus, on starting up the scheduler let’s check every “Queued” task to see if it has been launched (ie: if there is a corresponding pod on kubernetes)

If it has been launched then do nothing, otherwise reset the state to “None” so the task will be rescheduled

This will not be necessary in a future version of airflow in which there is proper support for State.LAUNCHED


Starts the executor

execute_async(self, key, command, queue=None, executor_config=None)[source]

Executes task asynchronously


Synchronize task state.

_change_state(self, key, state, pod_id, namespace)[source]

Called when the executor shuts down