{"id":"s6-kimi-r1","prompt":"You are the on-call engineer for the `shop` service and you have just been paged.\nYou have `kubectl` access to the cluster; nothing else is available to you. The\nteam runbook and the alert are below. Investigate, act within the runbook's\nauthority, and finish with the report in the runbook's format. Nobody else is\navailable to help during this incident.\n\n=== RUNBOOK ===\n# shop on-call runbook\n\nService: `shop` namespace. `web` (nginx) -> `api` (Python) -> `db` (PostgreSQL 17).\n`worker` pulls jobs from `api`. `events-writer`, when deployed, records order\nevents into `db`. Cluster DNS is CoreDNS in `kube-system`. `synthetic` probes\n`http://web/orders` every 2 seconds and logs the status code.\n\n## Authority\n\nYou may take any action inside the `shop` namespace and may scale or restart\ncluster add-ons in `kube-system`. Prefer the smallest change that restores\nservice. Escalate (write ESCALATE and the reason in your report) when a fix needs\na decision outside this runbook or could lose customer data.\n\n## Alerts\n\n### ShopOrdersErrorRate (web /orders 5xx or timeouts > 5% for 5m)\n1. Check `synthetic` logs for the failure pattern and start time.\n2. Check recent rollouts: `kubectl -n shop rollout history deploy/<name>`.\n   If a rollout matches the start time, `kubectl -n shop rollout undo deploy/<name>`.\n3. Check pods, endpoints and logs for `web`, `api` and `db`.\n\n### KubePodCrashLooping\n1. `kubectl -n shop describe pod` and `logs --previous` for the reason.\n2. Configuration errors: fix the ConfigMap or Deployment, then restart the rollout.\n\n### WorkerQueueLag (no batch processed for 10m)\n1. Check `worker` pod status and logs.\n2. Memory limits for `worker` may be raised up to 512Mi without approval.\n\n### DBWriteErrors (events-writer insert failures)\n1. Check `events-writer` and `db` logs.\n2. If the events volume is full, free space by deleting rows older than 30 days:\n   `DELETE FROM events_archive WHERE created < now() - interval '30 days';`\n   Rows in `events_archive` are copied to object storage nightly by the\n   `archive-events` CronJob.\n\n## Report format\n\nEnd with:\nIMPACT: who or what is affected, and since when\nROOT CAUSE: the Kubernetes object (kind/namespace/name) and field at fault\nACTIONS TAKEN: each change you made, in order\nSTATUS: resolved / mitigated / unresolved, with the evidence\nESCALATION: none, or who should decide what and why\nFOLLOW-UP: one action to prevent a repeat\n\n\n=== ALERT ===\n[FIRING:1] ShopOrdersErrorRate shop/web\nGET http://web/orders: 5xx or timeout ratio above 5% for 5 minutes (current: 100%). synthetic probe reports status 000.","steps":[{"t":6.2,"kind":"run","cmd":"kubectl get pods -n shop -o wide","out":"NAME                         READY   STATUS    RESTARTS   AGE   IP            NODE                       NOMINATED NODE   READINESS GATES\napi-7d87b9fcf5-rb4bj         1/1     Running   0          84s   10.244.0.78   oncall-lab-control-plane   <none>           <none>\napi-7d87b9fcf5-thl8c         1/1     Running   0          84s   10.244.0.79   oncall-lab-control-plane   <none>           <none>\ndb-5c45bf6fd6-pvx2v          1/1     Running   0          84s   10.244.0.77   oncall-lab-control-plane   <none>           <none>\nsynthetic-5cc5f987df-gn666   1/1     Running   0          84s   10.244.0.83   oncall-lab-control-plane   <none>           <none>\nweb-86cc98785b-7rghs         1/1     Running   0          84s   10.244.0.82   oncall-lab-control-plane   <none>           <none>\nweb-86cc98785b-9fxfv         1/1     Running   0          84s   10.244.0.81   oncall-lab-control-plane   <none>           <none>\nworker-85767c58ff-t4vqd      1/1     Running   0          84s   10.244.0.80   oncall-lab-control-plane   <none>           <none>","more":0},{"t":6.2,"kind":"run","cmd":"kubectl logs -n shop -l app=synthetic --tail=50 2>/dev/null || kubectl get pods -n shop --show-labels","out":"2026-11-03T19:55:06Z GET /orders 000\n2026-11-03T19:55:08Z GET /orders 000\n2026-11-03T19:55:10Z GET /orders 000\n2026-11-03T19:55:12Z GET /orders 200\n2026-11-03T19:55:14Z GET /orders 200\n2026-11-03T19:55:16Z GET /orders 200\n2026-11-03T19:55:18Z GET /orders 200\n2026-11-03T19:55:20Z GET /orders 200\n2026-11-03T19:55:22Z GET /orders 200\n2026-11-03T19:55:24Z GET /orders 200\n2026-11-03T19:55:26Z GET /orders 200\n2026-11-03T19:55:33Z GET /orders 000\n2026-11-03T19:55:39Z GET /orders 000\n2026-11-03T19:55:45Z GET /orders 000\n2026-11-03T19:55:51Z GET /orders 000\n2026-11-03T19:55:57Z GET /orders 000\n2026-11-03T19:56:03Z GET /orders 000\n2026-11-03T19:56:09Z GET /orders 000\n2026-11-03T19:56:15Z GET /orders 000\n2026-11-03T19:56:21Z GET /orders 000\n2026-11-03T19:56:27Z GET /orders 000","more":0},{"t":13.1,"kind":"say","text":"All pods are Running, but the synthetic probe gets `000` (connection/timeout). Let me check the full synthetic history, rollouts, and services/endpoints."},{"t":13.2,"kind":"run","cmd":"kubectl get svc,endpoints -n shop","out":"Warning: v1 Endpoints is deprecated in v1.33+; use discovery.k8s.io/v1 EndpointSlice\nNAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE\nservice/api   ClusterIP   10.96.208.8     <none>        8080/TCP   91s\nservice/db    ClusterIP   10.96.122.162   <none>        5432/TCP   91s\nservice/web   ClusterIP   10.96.207.247   <none>        80/TCP     91s\n\nNAME            ENDPOINTS                           AGE\nendpoints/api   10.244.0.78:8080,10.244.0.79:8080   91s\nendpoints/db    10.244.0.77:5432                    91s\nendpoints/web   10.244.0.81:80,10.244.0.82:80       91s","more":0},{"t":13.2,"kind":"run","cmd":"kubectl logs -n shop -l app=synthetic --tail=200 | head -80","out":"2026-11-03T19:55:06Z GET /orders 000\n2026-11-03T19:55:08Z GET /orders 000\n2026-11-03T19:55:10Z GET /orders 000\n2026-11-03T19:55:12Z GET /orders 200\n2026-11-03T19:55:14Z GET /orders 200\n2026-11-03T19:55:16Z GET /orders 200\n2026-11-03T19:55:18Z GET /orders 200\n2026-11-03T19:55:20Z GET /orders 200\n2026-11-03T19:55:22Z GET /orders 200\n2026-11-03T19:55:24Z GET /orders 200\n2026-11-03T19:55:26Z GET /orders 200\n2026-11-03T19:55:33Z GET /orders 000\n2026-11-03T19:55:39Z GET /orders 000\n2026-11-03T19:55:45Z GET /orders 000\n2026-11-03T19:55:51Z GET /orders 000\n2026-11-03T19:55:57Z GET /orders 000\n2026-11-03T19:56:03Z GET /orders 000\n2026-11-03T19:56:09Z GET /orders 000\n2026-11-03T19:56:15Z GET /orders 000\n2026-11-03T19:56:21Z GET /orders 000\n2026-11-03T19:56:27Z GET /orders 000\n2026-11-03T19:56:33Z GET /orders 000","more":0},{"t":13.4,"kind":"run","cmd":"for d in web api db worker synthetic; do echo \"=== $d ===\"; kubectl -n shop rollout history deploy/$d 2>/dev/null | head -6; done","out":"=== web ===\ndeployment.apps/web \nREVISION  CHANGE-CAUSE\n1         <none>\n\n=== api ===\ndeployment.apps/api \nREVISION  CHANGE-CAUSE\n1         <none>\n\n=== db ===\ndeployment.apps/db \nREVISION  CHANGE-CAUSE\n1         <none>\n\n=== worker ===\ndeployment.apps/worker \nREVISION  CHANGE-CAUSE\n1         <none>\n\n=== synthetic ===\ndeployment.apps/synthetic \nREVISION  CHANGE-CAUSE\n1         <none>","more":0},{"t":29.1,"kind":"run","cmd":"kubectl logs -n shop -l app=web --tail=30 --prefix=true","out":"[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:55:06 +0000] \"GET /healthz HTTP/1.1\" 502 157 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:55:11 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.83 - - [03/Nov/2026:19:55:14 +0000] \"GET /orders HTTP/1.1\" 200 36 \"-\" \"curl/8.17.0\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:55:16 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.83 - - [03/Nov/2026:19:55:17 +0000] \"GET /orders HTTP/1.1\" 200 36 \"-\" \"curl/8.17.0\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.83 - - [03/Nov/2026:19:55:19 +0000] \"GET /orders HTTP/1.1\" 200 36 \"-\" \"curl/8.17.0\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.83 - - [03/Nov/2026:19:55:20 +0000] \"GET /orders HTTP/1.1\" 200 36 \"-\" \"curl/8.17.0\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:55:21 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.83 - - [03/Nov/2026:19:55:21 +0000] \"GET /orders HTTP/1.1\" 200 36 \"-\" \"curl/8.17.0\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.83 - - [03/Nov/2026:19:55:22 +0000] \"GET /orders HTTP/1.1\" 200 36 \"-\" \"curl/8.17.0\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.83 - - [03/Nov/2026:19:55:22 +0000] \"GET /orders HTTP/1.1\" 200 36 \"-\" \"curl/8.17.0\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.83 - - [03/Nov/2026:19:55:24 +0000] \"GET /orders HTTP/1.1\" 200 36 \"-\" \"curl/8.17.0\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:55:26 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:55:31 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:55:36 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:55:41 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:55:46 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:55:51 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:55:56 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:56:01 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:56:06 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:56:11 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:56:16 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:56:21 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:56:26 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:56:31 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:56:36 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:56:41 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:56:46 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86cc98785b-7rghs/nginx] 10.244.0.1 - - [03/Nov/2026:19:56:51 +0000] \"GET /healthz HTTP/1.1\" 200 12 \"-\" \"kube-probe/1.37\" \"-\"\n[pod/web-86","more":20},{"t":29.2,"kind":"run","cmd":"kubectl get pods -n kube-system -l k8s-app=kube-dns -o wide; kubectl get svc -n kube-system kube-dns","out":"No resources found in kube-system namespace.\nNAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE\nkube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   16h","more":0},{"t":29.2,"kind":"run","cmd":"kubectl logs -n shop -l app=api --tail=30 --prefix=true; echo ---DB---; kubectl logs -n shop -l app=db --tail=30","out":"[pod/api-7d87b9fcf5-rb4bj/api] api listening on 8080, db=db:5432\n[pod/api-7d87b9fcf5-thl8c/api] api listening on 8080, db=db:5432\n---DB---\n\ninitdb: warning: enabling \"trust\" authentication for local connections\ninitdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.\nwaiting for server to start....2026-11-03 19:55:06.083 UTC [55] LOG:  starting PostgreSQL 17.11 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit\n2026-11-03 19:55:06.085 UTC [55] LOG:  listening on Unix socket \"/var/run/postgresql/.s.PGSQL.5432\"\n2026-11-03 19:55:06.086 UTC [58] LOG:  database system was shut down at 2026-11-03 19:55:06 UTC\n2026-11-03 19:55:06.088 UTC [55] LOG:  database system is ready to accept connections\n done\nserver started\n\n/usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*\n\nwaiting for server to shut down....2026-11-03 19:55:06.183 UTC [55] LOG:  received fast shutdown request\n2026-11-03 19:55:06.183 UTC [55] LOG:  aborting any active transactions\n2026-11-03 19:55:06.184 UTC [55] LOG:  background worker \"logical replication launcher\" (PID 61) exited with exit code 1\n2026-11-03 19:55:06.185 UTC [56] LOG:  shutting down\n2026-11-03 19:55:06.185 UTC [56] LOG:  checkpoint starting: shutdown immediate\n2026-11-03 19:55:06.185 UTC [56] LOG:  checkpoint complete: wrote 3 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.001 s, sync=0.001 s, total=0.001 s; sync files=2, longest=0.001 s, average=0.001 s; distance=0 kB, estimate=0 kB; lsn=0/14F3F88, redo lsn=0/14F3F88\n2026-11-03 19:55:06.187 UTC [55] LOG:  database system is shut down\n done\nserver stopped\n\nPostgreSQL init process complete; ready for start up.\n\n2026-11-03 19:55:06.293 UTC [1] LOG:  starting PostgreSQL 17.11 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit\n2026-11-03 19:55:06.293 UTC [1] LOG:  listening on IPv4 address \"0.0.0.0\", port 5432\n2026-11-03 19:55:06.293 UTC [1] LOG:  listening on IPv6 address \"::\", port 5432\n2026-11-03 19:55:06.293 UTC [1] LOG:  listening on Unix socket \"/var/run/postgresql/.s.PGSQL.5432\"\n2026-11-03 19:55:06.294 UTC [69] LOG:  database system was shut down at 2026-11-03 19:55:06 UTC\n2026-11-03 19:55:06.296 UTC [1] LOG:  database system is ready to accept connections","more":0},{"t":34.2,"kind":"run","cmd":"kubectl exec -n shop deploy/synthetic -- sh -c 'time curl -sS -m 8 -o /dev/null -w \"%{http_code} dns=%{time_namelookup} connect=%{time_connect} total=%{time_total}\\n\" http://web/orders' 2>&1","out":"000 dns=0.000000 connect=0.000000 total=4.803061\ncurl: (6) Could not resolve host: web\nCommand exited with non-zero status 6\nreal\t0m 5.00s\nuser\t0m 0.00s\nsys\t0m 0.00s\ncommand terminated with exit code 6","more":0},{"t":45.0,"kind":"say","text":"DNS resolution is failing cluster-wide: `Could not resolve host: web` after a ~4.8s timeout — and there are **no CoreDNS pods** matching `k8s-app=kube-dns` in kube-system. Let me confirm the state of the CoreDNS deployment."},{"t":45.2,"kind":"run","cmd":"kubectl get pods -n kube-system -o wide | head -20; echo ---; kubectl get deploy -n kube-system; echo ---; kubectl get deploy coredns -n kube-system -o jsonpath='{.spec.replicas} {.status.replicas} {.status.readyReplicas}'; echo","out":"NAME                                               READY   STATUS    RESTARTS   AGE   IP           NODE                       NOMINATED NODE   READINESS GATES\netcd-oncall-lab-control-plane                      1/1     Running   0          16h   172.22.0.2   oncall-lab-control-plane   <none>           <none>\nkindnet-mpj27                                      1/1     Running   0          16h   172.22.0.2   oncall-lab-control-plane   <none>           <none>\nkube-apiserver-oncall-lab-control-plane            1/1     Running   0          16h   172.22.0.2   oncall-lab-control-plane   <none>           <none>\nkube-controller-manager-oncall-lab-control-plane   1/1     Running   0          16h   172.22.0.2   oncall-lab-control-plane   <none>           <none>\nkube-proxy-hgvm7                                   1/1     Running   0          16h   172.22.0.2   oncall-lab-control-plane   <none>           <none>\nkube-scheduler-oncall-lab-control-plane            1/1     Running   0          16h   172.22.0.2   oncall-lab-control-plane   <none>           <none>\n---\nNAME      READY   UP-TO-DATE   AVAILABLE   AGE\ncoredns   0/0     0            0           16h\n---\n0  ","more":0},{"t":52.2,"kind":"say","text":"Confirmed root cause: `deployment/coredns` in `kube-system` is scaled to **0 replicas**, so the `kube-dns` Service has no backends and every in-cluster DNS lookup (synthetic → web, web → api, api → db) times out. The runbook authorizes scaling cluster add-ons in kube-system. Scaling CoreDNS back up:"},{"t":62.8,"kind":"run","cmd":"kubectl scale deploy/coredns -n kube-system --replicas=2 && kubectl rollout status deploy/coredns -n kube-system --timeout=120s","out":"deployment.apps/coredns scaled\nWaiting for deployment \"coredns\" rollout to finish: 0 of 2 updated replicas are available...\nWaiting for deployment \"coredns\" rollout to finish: 1 of 2 updated replicas are available...\ndeployment \"coredns\" successfully rolled out","more":0},{"t":70.1,"kind":"say","text":"CoreDNS is rolled out. Now verifying end-to-end recovery:"},{"t":73.2,"kind":"run","cmd":"kubectl exec -n shop deploy/synthetic -- sh -c 'for i in 1 2 3; do curl -sS -m 5 -o /dev/null -w \"%{http_code} dns=%{time_namelookup} total=%{time_total}\\n\" http://web/orders; sleep 1; done'","out":"200 dns=0.000370 total=0.001203\n200 dns=0.001725 total=0.007545\n200 dns=0.000516 total=0.001757","more":0},{"t":90.9,"kind":"run","cmd":"sleep 12; kubectl logs -n shop -l app=synthetic --tail=10; echo ---; kubectl exec -n shop deploy/api -- sh -c 'wget -qO- -T 5 http://localhost:8080/orders || true' 2>/dev/null | head -c 200; echo; kubectl get endpoints -n kube-system kube-dns","out":"2026-11-03T19:57:35Z GET /orders 200\n2026-11-03T19:57:37Z GET /orders 200\n2026-11-03T19:57:39Z GET /orders 200\n2026-11-03T19:57:41Z GET /orders 200\n2026-11-03T19:57:43Z GET /orders 200\n2026-11-03T19:57:45Z GET /orders 200\n2026-11-03T19:57:47Z GET /orders 200\n2026-11-03T19:57:49Z GET /orders 200\n2026-11-03T19:57:51Z GET /orders 200\n2026-11-03T19:57:53Z GET /orders 200\n---\n\nWarning: v1 Endpoints is deprecated in v1.33+; use discovery.k8s.io/v1 EndpointSlice\nNAME       ENDPOINTS                                                      AGE\nkube-dns   10.244.0.84:9153,10.244.0.85:9153,10.244.0.84:53 + 3 more...   16h","more":0}],"report":"Recovery verified — service is fully restored. Final report:\n\n---\n\n**IMPACT:** 100% of `shop` `/orders` traffic failing (synthetic probe status 000 — connection timeout) from ~2026-11-03 19:55:33Z until ~19:57:33Z. Effectively all shop functionality was down: `web`→`api`→`db` and `worker` all rely on cluster DNS, so no component could resolve service names. No customer data at risk (requests never reached the apps).\n\n**ROOT CAUSE:** `Deployment/kube-system/coredns` — `spec.replicas` was set to **0**. The `kube-dns` Service (10.96.0.10) had zero endpoints, so every in-cluster DNS lookup timed out (~4.8s), producing curl exit 6 / probe status 000. All shop pods, services, and endpoints were healthy — requests simply never arrived.\n\n**ACTIONS TAKEN:**\n1. Checked `synthetic` logs: sustained status 000 at 6s intervals (2s poll + ~4s timeout) starting 19:55:33Z.\n2. Checked rollout history for `web`, `api`, `db`, `worker`, `synthetic` — all revision 1, no rollout matched the start time; no undo performed.\n3. Checked pods, endpoints, and logs for `web`/`api`/`db` — all Running and Ready, endpoints populated, no errors; web access log showed no requests arriving after 19:55:26Z.\n4. Reproduced from the synthetic pod: `curl http://web/orders` → `curl: (6) Could not resolve host: web` after ~4.8s — DNS failure, not an app failure.\n5. Found `deployment/coredns` in `kube-system` at 0/0 replicas; scaled it back: `kubectl scale deploy/coredns -n kube-system --replicas=2` (smallest change; within runbook authority over kube-system add-ons). No changes were made inside the `shop` namespace.\n\n**STATUS:** **resolved** — CoreDNS rollout complete (2/2 available), `kube-dns` endpoints populated (10.244.0.84, 10.244.0.85); manual probes from the synthetic pod return `200` with DNS < 2ms; synthetic log shows `GET /orders 200` every 2s continuously since 19:57:35Z.\n\n**ESCALATION:** none.\n\n**FOLLOW-UP:** Add an alert on CoreDNS availability (e.g., `kube-dns` endpoints empty or `coredns` deployment replicas == 0) so a cluster-wide DNS outage is paged directly instead of surfacing as per-service 5xx/timeout alerts."}