This is an automated email from the ASF dual-hosted git repository.

Miretpl 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 53f6786a9ec Add startup probe for Kerberos worker sidecars (#71221)
53f6786a9ec is described below

commit 53f6786a9eca4b7a516c33148fc43c765af58106
Author: Aaron Chen <[email protected]>
AuthorDate: Sun Aug 16 03:31:14 2026 +0900

    Add startup probe for Kerberos worker sidecars (#71221)
    
    * Add startup probe for Kerberos worker sidecars
    
    * Reject invalid Kerberos startup probe settings
---
 chart/files/pod-template-file.kubernetes-helm-yaml |  9 +++
 chart/templates/workers/worker-deployment.yaml     |  9 +++
 .../airflow_aux/test_pod_template_file.py          | 70 ++++++++++++++++++++-
 chart/tests/helm_tests/security/test_kerberos.py   | 71 ++++++++++++++++++++-
 chart/values.schema.json                           | 72 ++++++++++++++++++++++
 chart/values.yaml                                  | 18 ++++++
 6 files changed, 247 insertions(+), 2 deletions(-)

diff --git a/chart/files/pod-template-file.kubernetes-helm-yaml 
b/chart/files/pod-template-file.kubernetes-helm-yaml
index 76d7316ac15..e9ffea6e0fb 100644
--- a/chart/files/pod-template-file.kubernetes-helm-yaml
+++ b/chart/files/pod-template-file.kubernetes-helm-yaml
@@ -175,6 +175,15 @@ spec:
       {{- end }}
       args: ["kerberos"]
       resources: {{- toYaml 
.Values.workers.kubernetes.kerberosSidecar.resources | nindent 8 }}
+      {{- if .Values.workers.kubernetes.kerberosSidecar.startupProbe.enabled }}
+      startupProbe:
+        exec:
+          command: ["klist", "-s"]
+        timeoutSeconds: {{ 
.Values.workers.kubernetes.kerberosSidecar.startupProbe.timeoutSeconds }}
+        initialDelaySeconds: {{ 
.Values.workers.kubernetes.kerberosSidecar.startupProbe.initialDelaySeconds }}
+        periodSeconds: {{ 
.Values.workers.kubernetes.kerberosSidecar.startupProbe.periodSeconds }}
+        failureThreshold: {{ 
.Values.workers.kubernetes.kerberosSidecar.startupProbe.failureThreshold }}
+      {{- end }}
       volumeMounts:
         - name: logs
           mountPath: {{ template "airflow_logs" . }}
diff --git a/chart/templates/workers/worker-deployment.yaml 
b/chart/templates/workers/worker-deployment.yaml
index 536e73a216a..ea893150c3d 100644
--- a/chart/templates/workers/worker-deployment.yaml
+++ b/chart/templates/workers/worker-deployment.yaml
@@ -403,6 +403,15 @@ spec:
           {{- end }}
           args: ["kerberos"]
           resources: {{- toYaml 
.Values.workers.celery.kerberosSidecar.resources | nindent 12 }}
+          {{- if .Values.workers.celery.kerberosSidecar.startupProbe.enabled }}
+          startupProbe:
+            exec:
+              command: ["klist", "-s"]
+            timeoutSeconds: {{ 
.Values.workers.celery.kerberosSidecar.startupProbe.timeoutSeconds }}
+            initialDelaySeconds: {{ 
.Values.workers.celery.kerberosSidecar.startupProbe.initialDelaySeconds }}
+            periodSeconds: {{ 
.Values.workers.celery.kerberosSidecar.startupProbe.periodSeconds }}
+            failureThreshold: {{ 
.Values.workers.celery.kerberosSidecar.startupProbe.failureThreshold }}
+          {{- end }}
           volumeMounts:
             - name: logs
               mountPath: {{ template "airflow_logs" . }}
diff --git a/chart/tests/helm_tests/airflow_aux/test_pod_template_file.py 
b/chart/tests/helm_tests/airflow_aux/test_pod_template_file.py
index 42a776b5fb6..8958fa1e17c 100644
--- a/chart/tests/helm_tests/airflow_aux/test_pod_template_file.py
+++ b/chart/tests/helm_tests/airflow_aux/test_pod_template_file.py
@@ -22,7 +22,7 @@ from shutil import copyfile, copytree
 
 import jmespath
 import pytest
-from chart_utils.helm_template_generator import render_chart
+from chart_utils.helm_template_generator import HelmFailedError, render_chart
 
 
 @pytest.fixture(scope="class")
@@ -1343,6 +1343,74 @@ class TestPodTemplateFile:
             "allowPrivilegeEscalation": False
         }
 
+    @pytest.mark.parametrize(
+        ("override", "expected"),
+        [
+            (
+                {},
+                {
+                    "exec": {"command": ["klist", "-s"]},
+                    "timeoutSeconds": 5,
+                    "initialDelaySeconds": 0,
+                    "periodSeconds": 10,
+                    "failureThreshold": 6,
+                },
+            ),
+            (
+                {
+                    "timeoutSeconds": 11,
+                    "initialDelaySeconds": 12,
+                    "periodSeconds": 13,
+                    "failureThreshold": 14,
+                },
+                {
+                    "exec": {"command": ["klist", "-s"]},
+                    "timeoutSeconds": 11,
+                    "initialDelaySeconds": 12,
+                    "periodSeconds": 13,
+                    "failureThreshold": 14,
+                },
+            ),
+            ({"enabled": False}, None),
+        ],
+        ids=["default", "custom", "disabled"],
+    )
+    def test_kerberos_sidecar_startup_probe(self, override, expected):
+        docs = render_chart(
+            values={
+                "workers": {"kubernetes": {"kerberosSidecar": {"enabled": 
True, "startupProbe": override}}}
+            },
+            show_only=["templates/pod-template-file.yaml"],
+            chart_dir=self.temp_chart_dir,
+        )
+
+        assert (
+            jmespath.search("spec.containers[?name=='worker-kerberos'] | 
[0].startupProbe", docs[0])
+            == expected
+        )
+
+    @pytest.mark.parametrize(
+        "override",
+        [
+            {"timeoutSeconds": 0},
+            {"initialDelaySeconds": -1},
+            {"periodSeconds": 0},
+            {"failureThreshold": 0},
+        ],
+        ids=["timeout", "initial-delay", "period", "failure-threshold"],
+    )
+    def test_kerberos_sidecar_startup_probe_rejects_invalid_values(self, 
override):
+        with pytest.raises(HelmFailedError):
+            render_chart(
+                values={
+                    "workers": {
+                        "kubernetes": {"kerberosSidecar": {"enabled": True, 
"startupProbe": override}}
+                    }
+                },
+                show_only=["templates/pod-template-file.yaml"],
+                chart_dir=self.temp_chart_dir,
+            )
+
     def test_kerberos_init_container_default(self):
         docs = render_chart(
             show_only=["templates/pod-template-file.yaml"],
diff --git a/chart/tests/helm_tests/security/test_kerberos.py 
b/chart/tests/helm_tests/security/test_kerberos.py
index ad8bca57193..f8c1a79fbb2 100644
--- a/chart/tests/helm_tests/security/test_kerberos.py
+++ b/chart/tests/helm_tests/security/test_kerberos.py
@@ -19,7 +19,8 @@ from __future__ import annotations
 import json
 
 import jmespath
-from chart_utils.helm_template_generator import render_chart
+import pytest
+from chart_utils.helm_template_generator import HelmFailedError, render_chart
 
 
 class TestKerberos:
@@ -153,3 +154,71 @@ class TestKerberos:
         )
 
         assert len(docs) == 0
+
+    @pytest.mark.parametrize(
+        ("override", "expected"),
+        [
+            (
+                {},
+                {
+                    "exec": {"command": ["klist", "-s"]},
+                    "timeoutSeconds": 5,
+                    "initialDelaySeconds": 0,
+                    "periodSeconds": 10,
+                    "failureThreshold": 6,
+                },
+            ),
+            (
+                {
+                    "timeoutSeconds": 11,
+                    "initialDelaySeconds": 12,
+                    "periodSeconds": 13,
+                    "failureThreshold": 14,
+                },
+                {
+                    "exec": {"command": ["klist", "-s"]},
+                    "timeoutSeconds": 11,
+                    "initialDelaySeconds": 12,
+                    "periodSeconds": 13,
+                    "failureThreshold": 14,
+                },
+            ),
+            ({"enabled": False}, None),
+        ],
+        ids=["default", "custom", "disabled"],
+    )
+    def test_kerberos_sidecar_startup_probe(self, override, expected):
+        docs = render_chart(
+            values={
+                "executor": "CeleryExecutor",
+                "workers": {"celery": {"kerberosSidecar": {"enabled": True, 
"startupProbe": override}}},
+            },
+            show_only=["templates/workers/worker-deployment.yaml"],
+        )
+
+        assert (
+            jmespath.search(
+                "spec.template.spec.containers[?name=='worker-kerberos'] | 
[0].startupProbe", docs[0]
+            )
+            == expected
+        )
+
+    @pytest.mark.parametrize(
+        "override",
+        [
+            {"timeoutSeconds": 0},
+            {"initialDelaySeconds": -1},
+            {"periodSeconds": 0},
+            {"failureThreshold": 0},
+        ],
+        ids=["timeout", "initial-delay", "period", "failure-threshold"],
+    )
+    def test_kerberos_sidecar_startup_probe_rejects_invalid_values(self, 
override):
+        with pytest.raises(HelmFailedError):
+            render_chart(
+                values={
+                    "executor": "CeleryExecutor",
+                    "workers": {"celery": {"kerberosSidecar": {"enabled": 
True, "startupProbe": override}}},
+                },
+                show_only=["templates/workers/worker-deployment.yaml"],
+            )
diff --git a/chart/values.schema.json b/chart/values.schema.json
index 63d12f58b20..8ff8f46f264 100644
--- a/chart/values.schema.json
+++ b/chart/values.schema.json
@@ -2111,6 +2111,42 @@
                                     "type": "boolean",
                                     "default": false
                                 },
+                                "startupProbe": {
+                                    "description": "Startup probe for the 
Kerberos worker sidecar (runs `klist -s`).",
+                                    "type": "object",
+                                    "additionalProperties": false,
+                                    "properties": {
+                                        "enabled": {
+                                            "description": "Enable the 
Kerberos sidecar startup probe. Disable for custom images without `klist`.",
+                                            "type": "boolean",
+                                            "default": true
+                                        },
+                                        "timeoutSeconds": {
+                                            "description": "Number of seconds 
after which the probe times out.",
+                                            "type": "integer",
+                                            "default": 5,
+                                            "minimum": 1
+                                        },
+                                        "initialDelaySeconds": {
+                                            "description": "Number of seconds 
after the container has started before the startup probe is initiated.",
+                                            "type": "integer",
+                                            "default": 0,
+                                            "minimum": 0
+                                        },
+                                        "periodSeconds": {
+                                            "description": "How often (in 
seconds) to perform the probe.",
+                                            "type": "integer",
+                                            "default": 10,
+                                            "minimum": 1
+                                        },
+                                        "failureThreshold": {
+                                            "description": "Number of 
consecutive failures required for the startup probe to fail.",
+                                            "type": "integer",
+                                            "default": 6,
+                                            "minimum": 1
+                                        }
+                                    }
+                                },
                                 "resources": {
                                     "description": "Resources on kerberos 
sidecar.",
                                     "type": "object",
@@ -2859,6 +2895,42 @@
                                     "type": "boolean",
                                     "default": false
                                 },
+                                "startupProbe": {
+                                    "description": "Startup probe for the 
Kerberos worker sidecar (runs `klist -s`).",
+                                    "type": "object",
+                                    "additionalProperties": false,
+                                    "properties": {
+                                        "enabled": {
+                                            "description": "Enable the 
Kerberos sidecar startup probe. Disable for custom images without `klist`.",
+                                            "type": "boolean",
+                                            "default": true
+                                        },
+                                        "timeoutSeconds": {
+                                            "description": "Number of seconds 
after which the probe times out.",
+                                            "type": "integer",
+                                            "default": 5,
+                                            "minimum": 1
+                                        },
+                                        "initialDelaySeconds": {
+                                            "description": "Number of seconds 
after the container has started before the startup probe is initiated.",
+                                            "type": "integer",
+                                            "default": 0,
+                                            "minimum": 0
+                                        },
+                                        "periodSeconds": {
+                                            "description": "How often (in 
seconds) to perform the probe.",
+                                            "type": "integer",
+                                            "default": 10,
+                                            "minimum": 1
+                                        },
+                                        "failureThreshold": {
+                                            "description": "Number of 
consecutive failures required for the startup probe to fail.",
+                                            "type": "integer",
+                                            "default": 6,
+                                            "minimum": 1
+                                        }
+                                    }
+                                },
                                 "resources": {
                                     "description": "Resources on kerberos 
sidecar.",
                                     "type": "object",
diff --git a/chart/values.yaml b/chart/values.yaml
index 409dc691a70..c1ebe441a77 100644
--- a/chart/values.yaml
+++ b/chart/values.yaml
@@ -839,6 +839,15 @@ workers:
       # Container level lifecycle hooks
       containerLifecycleHooks: {}
 
+      # Startup probe for the kerberos sidecar: `klist -s` succeeds once the 
credential
+      # cache holds a valid, unexpired ticket. Disable for custom images 
without `klist`.
+      startupProbe:
+        enabled: true
+        timeoutSeconds: 5
+        initialDelaySeconds: 0
+        periodSeconds: 10
+        failureThreshold: 6
+
     # Kerberos init container configuration for Airflow Celery workers
     # If not set, the values from `workers.kerberosInitContainer` section will 
be used.
     kerberosInitContainer:
@@ -1086,6 +1095,15 @@ workers:
       # Container level lifecycle hooks
       containerLifecycleHooks: {}
 
+      # Startup probe for the kerberos sidecar: `klist -s` succeeds once the 
credential
+      # cache holds a valid, unexpired ticket. Disable for custom images 
without `klist`.
+      startupProbe:
+        enabled: true
+        timeoutSeconds: 5
+        initialDelaySeconds: 0
+        periodSeconds: 10
+        failureThreshold: 6
+
     # Kerberos init container configuration for pods created with 
pod-template-file
     # If not set, the values from `workers.kerberosInitContainer` section will 
be used.
     kerberosInitContainer:

Reply via email to