airom k8s enumerates the container images referenced by Kubernetes workloads, then scans each unique image.
Offline manifest mode
Enumerate images from rendered manifests
.yaml/.yml file (multi-document streams included), extracts the container images from workload specs, dedupes them, and sorts them. Rendered YAML and helm template output both work.
1
Render your manifests
Helm, for example
2
Enumerate and scan
Which workloads are read
Pod, Deployment, StatefulSet, DaemonSet, ReplicaSet, Job, CronJob. Any other kind is skipped.
Within a workload, every container position is read: containers, initContainers, and ephemeralContainers. CronJob’s nested job template is handled.
Enumeration output
=== image <ref> === header.
A file that cannot be read, or a document that fails to parse, degrades to an Unknown and the walk continues — one bad manifest never kills the run.
The catch: image refs must be resolvable locally
Manifest enumeration gives you image references (ollama/ollama:latest). Scanning those references requires resolving the image — and, as documented in /scanning/container-images, live registry and daemon pulls are not wired up in this build.
The dependable workflow today is two steps:
1. Enumerate what your cluster runs
2. Scan each image from a saved archive
Flags
string
Directory of manifest YAML to enumerate workload images from. Required today — without it,
k8s reports that live-cluster scanning is unavailable.string
Restrict to one namespace. Accepted and parsed, but it applies to live-cluster enumeration, which is not wired up. In manifest mode it does not filter — every workload document in the directory is read regardless of its namespace.
bool
default:"false"
All namespaces. Same status as
--namespace: accepted, but with no effect in manifest mode, which already reads every document in the directory.bool
default:"false"
Scan images concurrently. Accepted and parsed, but not yet honored — images are scanned serially today, whether or not you pass it.
[context] positional selects a kube context. It is accepted, but it only means something in live-cluster mode, which is not wired up.
--parallel (the global worker-count flag) is unaffected by any of this. It controls detector workers within a single image scan and works normally.CI gating across images
--fail-on is evaluated per image. The gate trips if any scanned image matches the policy, and the run then exits with --exit-code (default 1).
Fail if any workload image ships a hosted LLM reference
k8s --manifests gate as evidence that your workload images are clean.
See /reference/cli for the full --fail-on grammar and exit-code contract.