Diagnose Airflow runtime startup failures¶
This runbook helps operators diagnose strict runtime and separate-hook startup without exposing container credentials. Start from the task's base-container log and collect run-volume diagnostics while the containers are still running. See strict delivery for init-fetch failures.
Live logs are unavailable before runtime starts¶
DPONE_KPO_LOG_STREAM_DEGRADED means Kubernetes rejected the base-container
log stream with a retryable response, including the structured HTTP 400
PodInitializing startup response. The task switches to pod-status polling at
its configured base-container interval. It reads fresh status immediately and
on every poll; a running workload continues without live logs.
If a one-shot init container terminates unsuccessfully and the pod cannot retry
it, the task reports DPONE_KPO_INIT_CONTAINER_FAILED exit_code=7 (synthetic
example). If the pod is terminal while the base has no termination status, it
reports DPONE_KPO_POD_TERMINATED. Both stop polling immediately and refresh
the pod status used by cleanup. These dpone diagnostic messages omit pod/container names,
termination messages, environment values and API response bodies.
Inspect the retained pod's init status and platform diagnostics using your normal restricted access. Correct the init configuration or image, then retry through Airflow. Increasing execution timeout does not repair a failed init. Normal Kubernetes init retries and restartable init sidecars remain supported; base exit-code handling, XCom, task retries and pod retention policy still belong to the Kubernetes provider.
Upgrade requires the matching updated worker packages; no DAG ID, manifest,
retry, or timeout changes are required. Maintainers can run the synthetic
regressions with uv run pytest tests/test_kpo_fallback_completion.py
tests/test_kpo_live_base_container_logs.py -q. Installed-provider lifecycle
tests require the corresponding Airflow/Kubernetes provider environment; these
unit tests do not certify live cluster behavior.
Service files and publication¶
Both runtime and separate hooks use /var/lib/dpone/run on the provider-owned
writable emptyDir. The verified workload and fetched artifacts stay mounted
read-only. A non-root image can write the run volume without changing its
workload files. The child still uses the verified workload directory as its
working directory; a custom hook must place its own writable outputs elsewhere.
| File | Meaning |
|---|---|
runtime-evidence.json |
Captured child stdout; hooks may emit text rather than JSON |
runtime-stderr.log |
Captured child stderr, also streamed to the Airflow log |
runtime-summary.json |
Local outcome summary, including hooks without XCom |
runtime-startup-error.json |
Safe OS-failure diagnostic when the run volume can be written |
Runtime, including dbt, enables KPO XCom and publishes the summary to
/airflow/xcom/return.json. KPO supplies the writable XCom volume and sidecar.
Separate pre-hooks disable publication and perform no required access to
/airflow/xcom. VerifiedPackCommand.publish_xcom defaults to true for existing
Python callers; the verified launcher sets it from the execution kind.
SQL hooks with canonical connection_ref use the same pinned binding set,
connection registry and credential-runtime context as the main workload. The
verified launcher supplies that context automatically. If a separate hook reports
DPONE_RUNTIME_CONNECTION_CONTEXT_REQUIRED after successful init-fetch, check
that the pinned runtime image includes the hook context-handoff fix, then rebuild
and activate the deployment with the matching packages.
For external ClickHouse publication, also verify that the Pod receives an
absolute DPONE_EXTERNAL_ARTIFACT_STORE path backed by durable storage shared
across eligible retry workers. Typed external-publication failures are expected
in runtime-stderr.log; an empty stdout is intentional and is not missing
success evidence.
Ordinary runtime retains the XCom outcome-gate exit policy. dbt and hooks retain
the real child exit code; failed hooks block downstream all_success runtime
tasks and do not gain automatic retries. An OS failure in preparation, capture
or publication returns nonzero. Kubernetes/Airflow task status and local
artifacts remain necessary for a failed task; Airflow only collects XCom from
successful KPO tasks.
Read the failure¶
The DPONE_RUNTIME_PACK_EXEC_FAILED diagnostic includes a stable stage,
exception class, numeric errno and a logical service-path role. It omits raw
arguments, environment, exception messages and exception filenames. The log is
the primary fallback when permissions or a full disk prevent artifact writes.
A secondary artifact failure must not hide the original failure.
| errno | Typical cause | Recovery |
|---|---|---|
13 (EACCES) |
Run/XCom path or executable is inaccessible | Inspect admitted mounts, image UID and filesystem permissions for the reported role |
2 (ENOENT) |
Working directory or executable is missing | Verify the pinned image entry point and verified workload contents |
28 (ENOSPC) |
Run volume or underlying node storage is full | Inspect actual filesystem capacity and node ephemeral-storage pressure; free or increase capacity |
30 (EROFS) |
A required output path is mounted read-only | Restore the provider-owned writable service mount |
Use the stage to distinguish directory preparation, output-file opening, process start, stderr capture, local summary and XCom publication. A start marker records an attempted launch, not proof that the child started. If a child ran before the error, inspect its evidence and hook side effects before manual retry. Resource declarations and actual disk availability are separate checks; see workload resources.
Retry uses a new task Pod in normal strict delivery. Direct Python callers that reuse a run directory must not run two commands concurrently in it; the wrapper invalidates previous attempt summaries before execution. Run-volume files are ephemeral: kubelet can remove them after all containers stop, even when the Pod object is retained. Configure platform collection during execution; retaining a completed Pod alone does not guarantee that its service files remain available.
dpone airflow runtime-pack-exec is the provider's internal entry point. Running
it without the injected verified plan fails with exit 2 and
DPONE_INIT_FETCH_PLAN_INVALID; it is not a command to repair a failed Pod.
Restore the configuration/image and rebuild through the documented deployment
path. Return to the provider overview.
Unknown dbt target outcome¶
When dpone dbt execute-pack reports COMMIT_UNKNOWN, the target mutation may
have committed. The CLI reports an unknown outcome, not a safe rejection before
execution. Preserve the attempt evidence and retained resources; do not retry
automatically. Ask the platform owner to reconcile the target against the
original execution evidence before admitting another attempt. Exit code 1,
the COMMIT_UNKNOWN code and the existing recovery guidance remain unchanged.