This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 9235bd777fb Add runtime_class_name to KubernetesPodOperator (#63952)
9235bd777fb is described below
commit 9235bd777fb4025b0a441311387a3fa0b3118b71
Author: kbpk <[email protected]>
AuthorDate: Fri Mar 20 12:47:54 2026 +0100
Add runtime_class_name to KubernetesPodOperator (#63952)
* add RuntimeClassName to k8s.PodSpec
* Add tests for runtime_class_name in KubernetesPodOperator
---
.../airflow/providers/cncf/kubernetes/operators/pod.py | 4 ++++
.../tests/unit/cncf/kubernetes/operators/test_pod.py | 15 +++++++++++++++
2 files changed, 19 insertions(+)
diff --git
a/providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/operators/pod.py
b/providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/operators/pod.py
index edb213cc566..e1609a187e8 100644
---
a/providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/operators/pod.py
+++
b/providers/cncf/kubernetes/src/airflow/providers/cncf/kubernetes/operators/pod.py
@@ -185,6 +185,7 @@ class KubernetesPodOperator(BaseOperator):
:param affinity: affinity scheduling rules for the launched pod.
:param config_file: The path to the Kubernetes config file. (templated)
If not specified, default value is ``~/.kube/config``
+ :param runtime_class_name: The name of the RuntimeClass to use for all
containers in the pod.
:param node_selector: A dict containing a group of scheduling rules.
(templated)
:param image_pull_secrets: Any image pull secrets to be given to the pod.
If more than one secret is required, provide a
@@ -324,6 +325,7 @@ class KubernetesPodOperator(BaseOperator):
container_resources: k8s.V1ResourceRequirements | None = None,
affinity: k8s.V1Affinity | None = None,
config_file: str | None = None,
+ runtime_class_name: str | None = None,
node_selector: dict | None = None,
image_pull_secrets: list[k8s.V1LocalObjectReference] | None = None,
service_account_name: str | None = None,
@@ -405,6 +407,7 @@ class KubernetesPodOperator(BaseOperator):
self.init_container_logs = init_container_logs
self.container_logs = container_logs or self.base_container_name
self.image_pull_policy = image_pull_policy
+ self.runtime_class_name = runtime_class_name
self.node_selector = node_selector or {}
self.annotations = annotations or {}
self.affinity = convert_affinity(affinity) if affinity else {}
@@ -1352,6 +1355,7 @@ class KubernetesPodOperator(BaseOperator):
annotations=self.annotations,
),
spec=k8s.V1PodSpec(
+ runtime_class_name=self.runtime_class_name,
node_selector=self.node_selector,
affinity=self.affinity,
tolerations=self.tolerations,
diff --git
a/providers/cncf/kubernetes/tests/unit/cncf/kubernetes/operators/test_pod.py
b/providers/cncf/kubernetes/tests/unit/cncf/kubernetes/operators/test_pod.py
index a9f76dfa5b4..bc9742688ac 100644
--- a/providers/cncf/kubernetes/tests/unit/cncf/kubernetes/operators/test_pod.py
+++ b/providers/cncf/kubernetes/tests/unit/cncf/kubernetes/operators/test_pod.py
@@ -940,6 +940,21 @@ class TestKubernetesPodOperator:
pod = k.build_pod_request_obj(create_context(k))
assert pod.spec.containers[0].termination_message_policy == "File"
+ def test_runtime_class_name_correctly_set(self):
+ k = KubernetesPodOperator(
+ task_id="task",
+ runtime_class_name="gvisor",
+ )
+ pod = k.build_pod_request_obj(create_context(k))
+ assert pod.spec.runtime_class_name == "gvisor"
+
+ def test_runtime_class_name_default_value_correctly_set(self):
+ k = KubernetesPodOperator(
+ task_id="task",
+ )
+ pod = k.build_pod_request_obj(create_context(k))
+ assert pod.spec.runtime_class_name is None
+
def test_termination_grace_period_correctly_set(self):
k = KubernetesPodOperator(
task_id="task",