You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
eks-recon: harden node-subnet, PDB, and per-namespace workload facts (#184)
Skill (skills/eks-recon) + DevOps Agent twin (devops-agent/eks-recon):
- networking §2a: add node_subnets AZ-resolution fact (EC2 kubelet nodes
only; Fargate/hybrid contribute none by design). Handle the 3-segment
Fargate providerID; mark node_subnets unconfirmed (never count: 0) when
the node list is obtained but EC2 resolution fails.
- workloads §8: record PDB status.disruptionsAllowed and
spec.unhealthyPodEvictionPolicy; max_unavailable is int|string.
- workloads summary/by_namespace: per-namespace hpas/pdbs counts;
kube-*-scoped deployments/services are int|null (null, not false-0).
- Twin mirrors the parent facts via Coverage enumeration (no MCP, per the
DevOps Agent runtime constraints).
Website doc copies regenerated via misc/update-pages.sh.
Known limitation (#182): the MCP path documents list_k8s_resources for
spec/status fields, which that tool summarizes out. CLI path unaffected;
fixed separately.
# INCLUDE kube-* (their listings apply no namespace filter). A namespace row exists wherever ANY
467
+
# column has a count, so rows may be partial. For a scoped-out column emit `null`, NOT 0 (schema
468
+
# header rule: null = fact not detected/collected) — e.g. a kube-system row shows `null` for
469
+
# deployments and services (column scoped out, not "zero found"; kube-system always runs CoreDNS
470
+
# Deployments + kube-dns Services) but real counts for statefulsets/ingresses/hpas/pdbs.
455
471
by_namespace:
456
472
- namespace: string
457
-
deployments: int
473
+
deployments: int|null # null for kube-* rows: §1 scopes kube-* out, so not counted here (never 0)
458
474
statefulsets: int
459
-
services: int
475
+
services: int|null # null for kube-* rows: §5 scopes kube-* out, so not counted here (never 0)
460
476
ingresses: int
477
+
hpas: int # per-namespace HPA count (rolled up from the hpas.list below)
478
+
pdbs: int # per-namespace PDB count (rolled up from the pdbs.list below)
461
479
462
480
deployments:
463
481
count: int
@@ -545,8 +563,11 @@ workloads:
545
563
list:
546
564
- namespace: string
547
565
name: string
548
-
min_available: string # spec.minAvailable (one of min/max set, other null)
549
-
max_unavailable: string # spec.maxUnavailable
566
+
min_available: int|string # spec.minAvailable — plain int or "N%" string (K8s IntOrString); at most one is set (both may be null for a selector-only PDB)
567
+
max_unavailable: int|string # spec.maxUnavailable — plain int or "N%" string (K8s IntOrString)
568
+
disruptions_allowed: int # status.disruptionsAllowed — voluntary evictions the Eviction API currently permits for
569
+
# covered pods; 0 rejects eviction of covered healthy pods (also 0 when it selects no pods); null if status unpopulated
570
+
unhealthy_pod_eviction_policy: string # spec.unhealthyPodEvictionPolicy — emit verbatim; null when unset (API defaults behavior to IfHealthyBudget)
0 commit comments