[SIMPL-30451] Assess the tightly coupled path against the sandbox

T2, T3, T5 and T8 are confirmed from the live dagster-instance ConfigMap and from dagster-role. None of the T checks could be executed: the tightly coupled path needs this code location registered on the platform Dagster, and unlike the pipes transport it cannot run from a standalone pod, because every step pod connects to the metadata database itself and so they must share instance storage rather than a local SQLite file.

C6 fails on that cluster and explains why no run has ever executed there. The launcher sends run pods to namespace dagster while its instance_config_map, postgres_password_secret and dagster-shared-pvc all live in dataprovider01; those references do not cross namespaces. dataprovider01 holds no pods labelled dagster/run-id and the daemon log shows no launch activity. C6 now tells the reader to check the launcher's namespace-local dependencies, not just the namespace.

Changelog: changed
This commit is contained in:
ILay
2026-08-31 19:57:38 +02:00
parent 96caa3f81b
commit 18cc46d132

View File

@@ -9,9 +9,10 @@ location image.
> **L4L10 were cleared on sandbox-cat-dat on 2026-08-31.** Checks L1L3 and L11,
> which exercise the payload contract, the message-parsing path and image-level
> isolation, are verified locally. What remains unverified on a cluster is the
> **tightly coupled** Kubernetes path — the T rows and the Kubernetes rows of
> section 4.3 — which uses `k8s_job_executor` rather than the pipes client.
> isolation, are verified locally. The **tightly coupled** Kubernetes path has
> been assessed against the same cluster but not executed — T2, T3, T5 and T8
> are confirmed from the live instance configuration and C6 fails there. See
> [section 2.1](#21-sandbox-state-2026-08-31).
---
@@ -23,8 +24,8 @@ location image.
| C2 | Jobs are registered | Dagster UI → **Jobs** | The jobs listed in the guide's section 5.5 appear under the code location |
| C3 | Image tag matches the intended release | `kubectl -n dagster get deploy -l dagster/code-location=distributed-execution -o jsonpath='{.items[*].spec.template.spec.containers[*].image}'` | Tag equals the version in `pipeline.variables.sh`; never `latest` |
| C4 | Image architecture matches the nodes | `docker manifest inspect <image>` | Includes `linux/amd64`; a manifest with only `linux/arm64` produces `no match for platform` at pull time |
| C5 | Run launcher type is as intended | `kubectl -n dagster get cm dagster-instance -o yaml` | `run_launcher` block shows `K8sRunLauncher` and the expected `job_namespace` |
| C6 | Target namespace exists and is schedulable | `kubectl get ns <namespace>` and `kubectl -n <namespace> get resourcequota` | Namespace is `Active`; remaining quota exceeds the job's aggregate requests |
| C5 | Run launcher type is as intended | `kubectl -n <namespace> get cm dagster-instance -o yaml` | `run_launcher` block shows `K8sRunLauncher` and the expected `job_namespace` |
| C6 | Target namespace exists and is schedulable | `kubectl get ns <namespace>` and `kubectl -n <namespace> get resourcequota` | Namespace is `Active`; remaining quota exceeds the job's aggregate requests. Also confirm the launcher's `instance_config_map`, `postgres_password_secret` and any PVC volumes exist **in that same namespace** — these references do not cross namespaces, and on sandbox-cat-dat they do not match `job_namespace` (see section 2.1) |
## 2. Tightly coupled checks
@@ -39,6 +40,43 @@ location image.
| T7 | Step pod egress is permitted | Same run | Steps do not hang in `STARTING`; run logs contain no connection timeouts to port 5432 |
| T8 | Failure surfaces as a pod failure | Force a step failure in a scratch namespace | `failPodOnRunFailure: true` is set, and the step pod reports `Failed` rather than `Completed` |
### 2.1 Sandbox state, 2026-08-31
The T checks were assessed against sandbox-cat-dat by reading the live
`dagster-instance` ConfigMap in `dataprovider01`. None of them could be *executed*:
the tightly coupled Kubernetes path needs this code location registered on the
platform Dagster, which is blocked on the control plane skew, and unlike the
pipes transport it cannot be exercised from a standalone pod — every step pod
connects to the metadata database on its own, so they must share instance
storage rather than a local SQLite file.
What the configuration shows:
| # | Finding |
|---|---|
| C5 | `run_launcher` is `K8sRunLauncher` with `job_namespace: dagster` |
| T2 | Vault injection is configured — `pod_template_spec_metadata` carries the banzaicloud annotations with role `sandbox-cat-dat-role` |
| T3 | `S3_ENDPOINT_URL` is `https://s3.sandbox-cat-dat.simpl-europe.eu`, with access keys injected from Vault |
| T5 | Passes. `dagster-role`, bound to `dagster-svc-account`, grants `batch/jobs` with create, delete, get, list, patch, update and watch |
| T8 | `fail_pod_on_run_failure: true` is set |
**C6 fails, and it is the reason nothing has ever run here.** The launcher sends
run pods to namespace `dagster`, but every namespace-local dependency it names —
`instance_config_map: dagster-instance`, `postgres_password_secret:
dagster-postgresql-secret`, and the `dagster-shared-pvc` volume — exists in
`dataprovider01`. A ConfigMap, Secret or PVC reference resolves only within the
pod's own namespace, so a run pod placed in `dagster` would reference three
objects that are not there. Consistent with that, `dataprovider01` holds no pods
labelled `dagster/run-id` and the daemon log shows no launch activity.
One caveat on the evidence: project-scoped access means `kubectl get ns dagster`
returns `Forbidden` rather than `NotFound`, so whether that namespace exists is
unconfirmed. It does not change the conclusion — the dependencies are in the
wrong namespace either way.
This is a platform configuration defect, not a defect in this service. It is
exactly what C6 exists to catch.
## 3. Loosely coupled checks
| # | Check | How to verify | Expected evidence |