Evidence Packs¶
Use this index to standardize what you capture before remediation. Every row pairs a falsification lab with the matching playbook so operators preserve the same evidence set that supports the troubleshooting hypothesis.
Evidence Pack Matrix¶
| Failure class | Preserve before remediation | CLI commands | KQL queries | Healthy-signal baseline | PII masking guidance | Lab | Playbook |
|---|---|---|---|---|---|---|---|
| Image pull failure | Pod events, image reference, namespace secrets, node egress clues | kubectl get pods --namespace workload --output widekubectl describe pod <pod-name> --namespace workloadkubectl get events --namespace workload --sort-by=.lastTimestamp | KubeEvents | where TimeGenerated > ago(30m) | where Namespace == "workload" and Reason in ("Failed", "BackOff") | project TimeGenerated, Name, Reason, MessageKubePodInventory | where TimeGenerated > ago(30m) | where Namespace == "workload" | project TimeGenerated, Name, ContainerStatusReason, ContainerID, Image | Fixed image reference starts pods and clears pull-backoff reason | Mask real registry names only when they reveal tenant or customer identity; never publish tokens, pull secrets, subscription IDs, tenant IDs, or email addresses | Fault Lab 01 | Image Pull Failure |
| CrashLoopBackOff | Previous container logs, exit code, restart count, probe config | kubectl get pods --namespace workloadkubectl logs <pod-name> --namespace workload --previouskubectl describe pod <pod-name> --namespace workload | KubePodInventory | where TimeGenerated > ago(30m) | where Namespace == "workload" | project TimeGenerated, Name, PodStatus, ContainerRestartCount, ContainerStatusReasonKubeEvents | where TimeGenerated > ago(30m) | where Namespace == "workload" and Reason in ("BackOff", "Killing", "Unhealthy") | project TimeGenerated, Name, Reason, Message | Pod restart count stays flat and readiness remains true after the fix | Mask stack traces only when they expose secrets, internal hostnames, or customer data; keep exit codes and reasons intact | Fault Lab 02 | CrashLoop |
| Pending pod from oversized requests | Scheduler events, requested resources, node allocatable, autoscaler state | kubectl describe pod <pod-name> --namespace workloadkubectl get nodes --output widekubectl describe node <node-name> | KubeEvents | where TimeGenerated > ago(30m) | where Namespace == "workload" and Reason == "FailedScheduling" | project TimeGenerated, Name, MessagePerf | where TimeGenerated > ago(30m) | where ObjectName == "K8SNode" and CounterName in ("cpuCapacityNanoCores", "memoryCapacityBytes") | project TimeGenerated, Computer, CounterName, CounterValue | Scheduler places the pod without FailedScheduling once requests are right-sized | Mask node names if they embed customer naming conventions; keep resource values and scheduler text | Fault Lab 03 | Pending Pods |
| Ingress misconfiguration | Ingress spec, service, endpoints, controller events, hostname mapping | kubectl get ingress --namespace workload --output widekubectl describe ingress <ingress-name> --namespace workloadkubectl get service,endpoints --namespace workload | KubeEvents | where TimeGenerated > ago(30m) | where Namespace == "workload" and ObjectKind == "Ingress" | project TimeGenerated, Name, Reason, MessageKubePodInventory | where TimeGenerated > ago(30m) | where Namespace == "workload" | project TimeGenerated, Name, PodStatus, PodIP | Pods and endpoints stay healthy while ingress routes successfully after the fix | Mask public IPs, DNS names, TLS secret names, and any hostname tied to a real environment; keep port numbers and path rules | Fault Lab 04 | Ingress Failure |
| Node pressure and scheduling boundary | Scheduler events, node readiness, labels, taints, allocatable snapshot | kubectl describe pod <pod-name> --namespace workloadkubectl get nodes --show-labelskubectl describe node <node-name> | KubeEvents | where TimeGenerated > ago(30m) | where Namespace == "workload" and Reason == "FailedScheduling" | project TimeGenerated, Name, MessagePerf | where TimeGenerated > ago(30m) | where ObjectName == "K8SNode" and CounterName in ("memoryRssBytes", "cpuUsageNanoCores") | project TimeGenerated, Computer, CounterName, CounterValue | Nodes remain Ready and the pod schedules after removing the bad placement rule | Mask VMSS instance IDs, node resource IDs, subscription IDs, and tenant-linked labels; keep taint keys and scheduler messages | Fault Lab 05 | Node Not Ready |
Usage Notes¶
- Preserve evidence before scaling, restarting, or reapplying manifests.
- Prefer
kubectl describe,kubectl get events, and read-only KQL queries before remediation. - If you export JSON or screenshots, sanitize subscription IDs as
<subscription-id>, tenant IDs as<tenant-id>, object IDs as<object-id>, and emails asuser@example.com. - Do not attach fabricated output to the repo. Store real run artifacts in the matching
labs/<slug>/evidence/directory only after execution.