Bird
Raised Fist0
Apache Airflowdevops~7 mins

Kubernetes executor for dynamic scaling in Apache Airflow - Commands & Configuration

Choose your learning style10 modes available
Introduction
Running many tasks in Airflow can slow down your system if all tasks run on one machine. The Kubernetes executor helps by creating a new small computer (pod) for each task. This way, tasks run separately and the system can grow or shrink automatically based on the number of tasks.
When you have many Airflow tasks that need to run at the same time without slowing each other down
When you want Airflow to automatically add or remove resources based on workload
When you want to isolate tasks so one task's failure does not affect others
When you want to run Airflow tasks in a cloud or container environment easily
When you want to save costs by only using resources when tasks are running
Config File - airflow.cfg
airflow.cfg
[core]
executor = KubernetesExecutor

[kubernetes]
namespace = airflow
worker_container_repository = apache/airflow
worker_container_tag = 2.7.1

[kubernetes_executor]
worker_pods_creation_batch_size = 5

[logging]
remote_logging = False

[scheduler]
job_heartbeat_sec = 5
scheduler_heartbeat_sec = 5

[webserver]
web_server_port = 8080

This configuration file sets Airflow to use the Kubernetes executor under the [core] section. The [kubernetes] section defines the Kubernetes namespace and the Airflow worker image to use for task pods. The [kubernetes_executor] section controls how many pods can be created at once. Other sections configure logging, scheduler, and webserver settings.

Commands
Create a Kubernetes namespace called 'airflow' to isolate Airflow resources from other applications.
Terminal
kubectl create namespace airflow
Expected OutputExpected
namespace/airflow created
Apply the example Kubernetes pod specification for Airflow workers to ensure pods run with correct settings.
Terminal
kubectl apply -f https://airflow.apache.org/docs/apache-airflow/stable/kubernetes.html#example-kubernetes-pod-spec
Expected OutputExpected
pod/airflow-worker created
Start the Airflow scheduler which will use the Kubernetes executor to launch task pods dynamically.
Terminal
airflow scheduler
Expected OutputExpected
[2024-06-01 12:00:00,000] {scheduler_job.py:125} INFO - Starting the scheduler [2024-06-01 12:00:05,000] {kubernetes_executor.py:200} INFO - KubernetesExecutor started
Check the status of Airflow worker pods running in the 'airflow' namespace to see dynamic scaling in action.
Terminal
kubectl get pods -n airflow
Expected OutputExpected
NAME READY STATUS RESTARTS AGE airflow-worker-abc123 1/1 Running 0 30s airflow-worker-def456 1/1 Running 0 25s
→
-n airflow - Specifies the namespace to look for pods
Key Concept

If you remember nothing else from this pattern, remember: Kubernetes executor lets Airflow create a new pod for each task, so tasks run separately and scale automatically.

Common Mistakes
Not creating the Kubernetes namespace before starting Airflow
Airflow tries to create pods in a namespace that does not exist, causing pod creation failures.
Always run 'kubectl create namespace airflow' before starting Airflow with Kubernetes executor.
Using the wrong Airflow worker image tag in the configuration
The worker pods may fail to start or behave unexpectedly if the image tag does not match the Airflow version.
Set 'worker_container_tag' in airflow.cfg to the exact Airflow version you are running, e.g., '2.7.1'.
Not checking pod status with 'kubectl get pods' to verify dynamic scaling
You may think tasks are running but pods could be stuck or failing without visible errors.
Regularly run 'kubectl get pods -n airflow' to monitor pod creation and status.
Summary
Set Airflow executor to KubernetesExecutor in airflow.cfg to enable dynamic task pod creation.
Create a Kubernetes namespace to isolate Airflow pods and resources.
Start the Airflow scheduler to launch tasks as separate pods that scale automatically.
Use 'kubectl get pods -n airflow' to monitor running task pods and verify scaling.

Practice

(1/5)
1. What is the main benefit of using the Kubernetes executor in Airflow?
easy
A. It disables task retries to save resources.
B. It stores all task logs in a local file system.
C. It schedules tasks only on a single fixed server.
D. It runs each task in its own pod, allowing dynamic scaling.

Solution

  1. Step 1: Understand Kubernetes executor behavior

    The Kubernetes executor runs each Airflow task in a separate pod, which allows tasks to run independently and scale dynamically.
  2. Step 2: Compare options with executor features

    Options B, C, and D describe behaviors not related to Kubernetes executor's main feature of dynamic pod creation and scaling.
  3. Final Answer:

    It runs each task in its own pod, allowing dynamic scaling. -> Option D
  4. Quick Check:

    Kubernetes executor = dynamic pod scaling [OK]
Hint: Kubernetes executor = one pod per task for scaling [OK]
Common Mistakes:
  • Thinking tasks run on a single server
  • Confusing executor with local logging
  • Assuming retries are disabled
2. Which configuration key is required to enable the Kubernetes executor in Airflow's airflow.cfg?
easy
A. executor = LocalExecutor
B. executor = CeleryExecutor
C. executor = KubernetesExecutor
D. executor = SequentialExecutor

Solution

  1. Step 1: Identify executor configuration key

    In airflow.cfg, the executor key sets which executor Airflow uses.
  2. Step 2: Match correct executor name for Kubernetes

    The correct value to enable Kubernetes executor is KubernetesExecutor. Other options are different executors.
  3. Final Answer:

    executor = KubernetesExecutor -> Option C
  4. Quick Check:

    Enable Kubernetes executor = executor = KubernetesExecutor [OK]
Hint: Set executor = KubernetesExecutor in airflow.cfg [OK]
Common Mistakes:
  • Using LocalExecutor or CeleryExecutor by mistake
  • Misspelling KubernetesExecutor
  • Changing unrelated config keys
3. Given this Airflow task using Kubernetes executor, what happens when the DAG runs?
from airflow import DAG
from airflow.operators.bash import BashOperator
from datetime import datetime
with DAG('example', start_date=datetime(2024,1,1)) as dag:
    task = BashOperator(task_id='print_date', bash_command='date')
medium
A. The task runs inside a new Kubernetes pod created dynamically.
B. The task runs on the Airflow scheduler machine only.
C. The task fails because BashOperator is not supported with Kubernetes executor.
D. The task runs on a fixed worker node without pod creation.

Solution

  1. Step 1: Understand task execution with Kubernetes executor

    When using Kubernetes executor, each task runs inside its own pod created dynamically in the Kubernetes cluster.
  2. Step 2: Analyze the given BashOperator task

    The BashOperator runs a simple shell command. With Kubernetes executor, this command runs inside a new pod, not on the scheduler or fixed node.
  3. Final Answer:

    The task runs inside a new Kubernetes pod created dynamically. -> Option A
  4. Quick Check:

    BashOperator + Kubernetes executor = dynamic pod run [OK]
Hint: Kubernetes executor runs each task in a new pod [OK]
Common Mistakes:
  • Assuming tasks run on scheduler machine
  • Thinking BashOperator is unsupported
  • Believing pods are not created dynamically
4. You configured Airflow with Kubernetes executor but tasks are not running and pods are not created. What is the most likely cause?
medium
A. The Kubernetes cluster credentials are missing or incorrect.
B. The DAG file has syntax errors unrelated to executor.
C. The Airflow scheduler is running with LocalExecutor.
D. The BashOperator command is invalid.

Solution

  1. Step 1: Check Kubernetes executor requirements

    Kubernetes executor needs valid cluster credentials to create pods dynamically.
  2. Step 2: Identify why pods are not created

    If no pods appear, missing or wrong Kubernetes credentials is the most common cause, blocking pod creation.
  3. Final Answer:

    The Kubernetes cluster credentials are missing or incorrect. -> Option A
  4. Quick Check:

    No pods + Kubernetes executor = check cluster credentials [OK]
Hint: No pods? Verify Kubernetes credentials first [OK]
Common Mistakes:
  • Blaming DAG syntax errors
  • Assuming scheduler executor type is unrelated
  • Thinking BashOperator command causes pod creation failure
5. You want to optimize Airflow with Kubernetes executor to handle many short tasks efficiently. Which approach helps reduce pod startup overhead?
hard
A. Increase task retries to avoid pod creation failures.
B. Use pod templates with pre-configured settings and enable pod reuse.
C. Disable Kubernetes executor and switch to SequentialExecutor.
D. Run all tasks in a single pod to save resources.

Solution

  1. Step 1: Understand pod startup overhead in Kubernetes executor

    Each pod creation takes time, so reducing overhead improves efficiency for many short tasks.
  2. Step 2: Identify optimization methods

    Using pod templates with pre-set configs and enabling pod reuse reduces startup time and resource use.
  3. Step 3: Evaluate other options

    Disabling Kubernetes executor or running all tasks in one pod loses scaling benefits. Increasing retries does not reduce pod startup time.
  4. Final Answer:

    Use pod templates with pre-configured settings and enable pod reuse. -> Option B
  5. Quick Check:

    Pod reuse + templates = faster task startup [OK]
Hint: Use pod templates and reuse to speed up pods [OK]
Common Mistakes:
  • Switching to SequentialExecutor loses scaling
  • Running all tasks in one pod breaks isolation
  • Increasing retries does not reduce pod startup
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard