Home / Assessment / Sample report
Sample report

A sample assessment report.

This is the kind of report you receive from the read-only assessment. It covers a fictional company, Northwind Logistics, with two clusters (staging and production) that run Flux. A census wrote it: a rule-based read of one repository. This is the code that reads a customer repository.

Summary

The census found 54 files that hold Kubernetes objects. An agent can analyse 48 of them (88.9%). The sections below cover the other files.

48 of 54
files an agent can analyse (88.9%). 20 more files only shape the render.
3
files that no Flux Kustomization covers
1
kind that no agent analyses (1 object). 2 more kinds are not classified yet.
6
findings from the rules
2
clusters: production, staging
repo-only
ownership mode. The census read no live cluster.

Flux roots

A root is a top-level directory that holds Flux objects or the files they apply. The table counts files per root. "Render inputs" are files that shape a kustomize build, such as kustomization.yaml. No agent analyses them as objects.

Flux rootFilesRender inputsAnalysableShared by clustersUnresolved
apps321029270
clusters60600
infrastructure13101390
manual30003

Each row below is one Flux Kustomization. The table shows which cluster reconciles it and how many files it applies. A shared file counts once for each Kustomization that applies it.

Cluster that reconcilesFlux KustomizationFiles it applies
productionflux-system/apps32
productionflux-system/flux-system3
productionflux-system/infra-configs2
productionflux-system/infra-controllers6
productionflux-system/infra-sources3
stagingflux-system/apps27
stagingflux-system/flux-system3
stagingflux-system/infra-configs2
stagingflux-system/infra-controllers6
stagingflux-system/infra-sources3

Placement and cluster attribution

Placement says where Flux applies a file. Here, every cluster reconciles itself, so placement is "local" or "shared". A file that both clusters apply counts once for each cluster. The rows can add up to more than the file total.

PlacementMeaningFiles
localapplied on the cluster that reconciles it15
multireconciled by more than one cluster (shared base)36
unresolved:uncovered_pathno Kustomization reaches the path3
Workload clusterFiles
production46
staging41

These directories run on both clusters. A change to a file here reaches staging and production.

DirectoryFiles that run on both clusters
apps/base/fleet-gateway5
apps/base/notifier4
apps/base/orders-api6
apps/base/route-planner7
apps/base/tracking-web5
infrastructure/controllers/base6
infrastructure/sources3

Findings

A finding is a problem that a rule detected. Each finding names its rule, the file and a short message. The report does not suggest a fix.

SeverityRulePathMessage
warnreach.flux.autogenerated_kustomizationclusters/productionFlux will recursively generate a Kustomization for this manifest directory
warnreach.flux.autogenerated_kustomizationclusters/stagingFlux will recursively generate a Kustomization for this manifest directory
warnreach.flux.substitution_undeclaredapps/production/fleet-gateway-env.yamlsubstitutions REGION, SENTRY_HOST not declared
inforeach.flux.uncovered_pathmanual/debug-pod.yamlpath is outside every declared reconciliation root
inforeach.flux.uncovered_pathmanual/legacy-cronjob.yamlpath is outside every declared reconciliation root
inforeach.flux.uncovered_pathmanual/old-ingress.yamlpath is outside every declared reconciliation root

What each finding type means

Flux builds a Kustomization for this directory

reach.flux.autogenerated_kustomization · 2 in this report. A Flux Kustomization points at this directory, but the directory has no kustomization.yaml. Flux then builds one and includes every YAML file in the directory. This is normal for a bootstrap directory. Check that every file there should deploy.

A variable has no declared value

reach.flux.substitution_undeclared · 1 in this report. The file uses a ${VARIABLE} that no Kustomization declares under postBuild.substitute. Flux cannot fill in a value it does not know, so the deployed value may be empty or wrong. Check where the value comes from.

No Flux Kustomization covers this file

reach.flux.uncovered_path · 3 in this report. No Flux Kustomization applies this file, so Flux does not deploy it. The file may be old, or someone may apply it by hand. Decide if it should stay.

Platform hints

The repository refers to Google GKE. The census reads the repository, not the cluster, so a hint is evidence, not proof. We confirm the platform with you.

PlatformPathObjectSignal
Google GKEapps/base/route-planner/service.yamlService route-plannerAnnotation: cloud.google.com/neg

Opportunities

19 maintenance opportunities, by type. Each rule reads plain manifests in the repository, without an AI model. The chart rule also reads public chart indexes. A rule does not check whether a change is safe, and it proposes no change. Objects that a Helm chart creates are not visible to these rules. Some rules say that something is missing. These rules stay silent if the census could not read every object, or if kustomize or Flux change labels at build time.

TypeCount
Deprecated API version3
Container without resource requests8
Single replica, no autoscaler1
Several replicas, no disruption budget3
Chart version differs between clusters1
ServiceMonitor that selects no Service1
Chart behind the newest version2

Deprecated API version (3)

The rule reads the apiVersion line only.

PathObjectWhat the file declares
apps/base/orders-api/hpa.yamlHorizontalPodAutoscaler orders-apiautoscaling/v2beta2 → autoscaling/v2
infrastructure/controllers/base/monitoring/helmrelease.yamlHelmRelease monitoringhelm.toolkit.fluxcd.io/v2beta2 → helm.toolkit.fluxcd.io/v2
manual/old-ingress.yamlIngress legacy-portalnetworking.k8s.io/v1beta1 → networking.k8s.io/v1

Container without resource requests (8)

Without requests the scheduler cannot place the pod by size. The right numbers need usage metrics, so the assessment does not suggest any.

PathObjectWhat the file declares
apps/base/billing-worker/deployment.yamlDeployment billing-workerContainers: billing-worker
apps/base/fleet-gateway/deployment.yamlDeployment fleet-gatewayContainers: fleet-gateway
apps/base/notifier/deployment.yamlDeployment notifierContainers: notifier
apps/base/orders-api/deployment.yamlDeployment orders-apiContainers: orders-api
apps/base/route-planner/deployment.yamlDeployment route-plannerContainers: route-planner
apps/base/tracking-web/deployment.yamlDeployment tracking-webContainers: tracking-web
manual/debug-pod.yamlPod netshootContainers: netshoot
manual/legacy-cronjob.yamlCronJob nightly-exportContainers: export

Single replica, no autoscaler (1)

One pod means a node drain or a crash stops the workload.

PathObjectWhat the file declares
apps/base/billing-worker/deployment.yamlDeployment billing-workerdeclares replicas: 1 and no HorizontalPodAutoscaler in this repository targets it

Several replicas, no disruption budget (3)

Without a PodDisruptionBudget a node drain can evict all replicas at the same time.

PathObjectWhat the file declares
apps/base/fleet-gateway/deployment.yamlDeployment fleet-gatewayruns at least 2 replicas and no PodDisruptionBudget in this repository selects its pods
apps/base/notifier/deployment.yamlDeployment notifierruns at least 2 replicas and no PodDisruptionBudget in this repository selects its pods
apps/base/orders-api/deployment.yamlDeployment orders-apiruns at least 2 replicas and no PodDisruptionBudget in this repository selects its pods

Chart version differs between clusters (1)

The same release gets a different chart version per cluster, after the overlay patches. Sometimes this is on purpose, for example staging first.

PathObjectWhat the file declares
infrastructure/controllers/base/ingress-nginx/helmrelease.yamlHelmRelease ingress-nginxPer cluster: production 4.11.3, staging 4.12.0

ServiceMonitor that selects no Service (1)

The label selector matches no Service label in the repository, so Prometheus may scrape nothing.

PathObjectWhat the file declares
apps/base/fleet-gateway/servicemonitor.yamlServiceMonitor fleet-gatewaySelector: app.kubernetes.io/name=fleet-gateway

Chart behind the newest version (2)

The pinned chart version is older than the newest stable version in the public chart index. The rule does not read the changelog.

PathObjectWhat the file declares
infrastructure/controllers/base/ingress-nginx/helmrelease.yamlHelmRelease ingress-nginx4.11.3 → 4.12.0 (newest in the repository index)
infrastructure/controllers/base/monitoring/helmrelease.yamlHelmRelease monitoring65.1.1 → 67.4.0 (newest in the repository index)

The census compared 3 pinned chart versions with a saved copy of each public chart index. 2 of them are behind. It checked every pinned chart.

Kinds that no agent analyses

The assistant has agents for many object kinds. For some kinds it has none. The report lists them. You then know which part of your repository the assistant only maps. The census places objects of these kinds on a cluster. No agent checks them.

KindObjectsWhy it is not analysed
gateway.networking.k8s.io/HTTPRoute1The census knows this kind, but no agent reads it.
autoscaling/HorizontalPodAutoscaler2The census does not know this kind yet.
Pod1The census does not know this kind yet.

Optional: a snapshot from your cluster

The report above reads only your repository. If you want, you can also run one read-only command per cluster and send us the file: kubectl get kustomizations.kustomize.toolkit.fluxcd.io -A -o json. Our script cluster-snapshot.sh runs it for you. It reads no Secret and changes nothing. The census then shows two more things. For this sample we used fictional snapshot files.

1. Ownership: did Flux apply what the repository declares?

For each object, the census looks for it in the Flux inventory of its cluster. An object that is not in the inventory was not applied by Flux, or was removed by hand. Unknown means the repository alone cannot say which object to look for.

ClusterIn the Flux inventoryNot in the inventoryUnknown
production4810
staging4400
ClusterPathObjectReason
productionapps/base/notifier/service.yamlService notifiernot_in_inventory

2. Failing reconciliations

ClusterFlux KustomizationReadyReasonMessage
stagingflux-system/appsFalseHealthCheckFailedtimeout waiting for: [Deployment/northwind/route-planner status: 'InProgress']

What this report does not include

The report is a map of your setup, not a list of fixes. These come later, in the dry run after onboarding:

Generated by scripts/assessment_sample_report.py from a fictional repository. The page changes only when the repository or the census code changes.

Tell us how your infrastructure is built.

A few questions, about four minutes. You see an honest fit as you answer. We never ask for passwords, tokens or hostnames.

Get started →