Skip to content

ClusterReadiness

The ClusterReadiness custom resource, as the agent's embedded CRD manifest defines it. The chart installs the same manifest from deploy/chart/crds/. To turn the verdict into a policy that pushes back, see Acting on readiness.

API version upgradescope.basit.engineer/v1alpha1
Kind ClusterReadiness
Scope Cluster
Plural / singular clusterreadinesses / clusterreadiness
Short names ucr
Categories upgradescope

v1alpha1

Served: true. Storage version: true.

kubectl get columns

Column Type JSONPath Description
Target string .status.targets[0].target —
Score integer .status.targets[0].score —
Ready string .status.targets[0].verdict Verdict for the first target — ready, blocked, or unknown (required checks not assessed). With several targets, the AllTargetsReady condition covers all of them.
Blockers integer .status.targets[0].blockers Blocker count of the first target only. With several targets, the AllTargetsReady condition names any target that is blocked.
LastEvaluated date .status.lastEvaluated When the agent last wrote this status. Older than about two intervals means the agent is not ticking.
Age date .metadata.creationTimestamp —

Fields

Field Type Description Validation
spec object — —
spec.targets array Kubernetes minor versions to evaluate against, e.g. "1.36". Empty means the agent targets the next minor above the observed server version. At most 8, because each target adds a row to status; an agent given more evaluates the first 8 and lists the rest in status.notAssessed. at most 8 items
spec.targets[] string — pattern ^[0-9]+\.[0-9]+$; max length 8
spec.ignore array Accepted findings, applied by the agent every tick with the same rules as the CLI's .upgradescope.yaml. Suppressed findings do not count toward score and verdict; status counts them per target. —
spec.ignore[] object — —
spec.ignore[].key string Finding key, e.g. eol-addon/ingress-nginx. Set key or category, not both. —
spec.ignore[].category string Finding category, e.g. removed-api. —
spec.ignore[].namespace string Glob. Only objects in a matching namespace; a finding without objects (an add-on) matches when all its namespaces match. —
spec.ignore[].name string Glob. Only objects with a matching name. —
spec.ignore[].file string Glob on manifest paths. Never matches live objects; kept for the CLI's rule schema. —
spec.ignore[].reason string Why the finding is accepted. Required. required; min length 1
spec.ignore[].expires string Last day (UTC) the rule applies, YYYY-MM-DD. After it the rule is ignored and status.notAssessed says so. pattern ^[0-9]{4}-[0-9]{2}-[0-9]{2}$
status object — —
status.observedServerVersion string — —
status.kbVersion string — —
status.lastEvaluated string — format date-time
status.agentVersion string — —
status.addOnEvidenceAgeSeconds integer How old, in seconds, the pod evidence the add-ons were detected from was when the agent reused its last full pod pass instead of listing every pod again (--pod-pass-every, --pod-pass-max-age); an add-on installed or upgraded since is reported as it was then. Absent when every pod was read for this status. The pods in kube-system, Helm releases and IngressClasses are read on every evaluation whatever this says. format int64; minimum 1
status.supportPhase string Where the cluster's Kubernetes minor stands in its managed provider's (EKS, GKE, AKS) support calendar - standard, ending (standard support ends within 90 days), extended (past standard support, before the provider's extended window ends; where that window is opt-in, as on GKE and AKS, it applies to the cluster only if extendedSupportCondition holds, which the agent cannot see) or ended. Absent when the provider is not one of the three or its dates for the minor are not in the knowledge base. The same for every target. one of standard, ending, extended, ended
status.extendedSupportFrom string The day (UTC, YYYY-MM-DD) standard support for the cluster's minor ends and extended support begins. Set with supportPhase. pattern ^[0-9]{4}-[0-9]{2}-[0-9]{2}$
status.extendedSupportEnds string The day (UTC, YYYY-MM-DD) the provider's extended support for the cluster's minor ends and it stops supporting the minor. Absent when the provider offered no extended support for the minor. Where extended support is opt-in (GKE, AKS) it is the provider's window, not the cluster's (see extendedSupportCondition). pattern ^[0-9]{4}-[0-9]{2}-[0-9]{2}$
status.annualCostDelta string What extended support adds per cluster per year at the provider's published list price, (extended - standard) x 8760 cluster-hours, as a decimal string in currency. A list price as of priceAsOf, not the bill. Set only for a provider whose price the knowledge base cites, while the minor can still be in extended support. pattern ^[0-9]+\.[0-9]{2}$
status.currency string The currency of annualCostDelta. one of USD
status.priceAsOf string The day (YYYY-MM-DD) the list price behind annualCostDelta was read from the provider's pricing page. pattern ^[0-9]{4}-[0-9]{2}-[0-9]{2}$
status.annualCostNote string The provider's caveat on whom annualCostDelta is charged to, for example that GKE charges it only to clusters on the Extended release channel. Set with annualCostDelta when the knowledge base records one; show it beside the figure. —
status.extendedSupportCondition string Where the provider's extended support is opt-in (GKE, AKS), the configuration under which it applies to the cluster, as a clause completing "only if ...", for example "Long Term Support is enabled". The agent cannot see the cluster's configuration, so supportPhase extended means the provider's window, not that the cluster is enrolled in it. Absent for providers where extended support is the default (EKS) and when the provider offered none for the minor. —
status.observedGeneration integer The metadata.generation (spec version) the status was evaluated for. format int64; minimum 0
status.conditions array Standard conditions. Ready summarizes the first target's verdict: True (ready), False (reason Blocked), or Unknown (reason NotAssessed: a required check was not assessed, or no target was evaluated). AllTargetsReady covers every target: False (reason Blocked) when any target is blocked, Unknown (reason NotAssessed) when none is blocked but any is not assessed or no target was evaluated, True only when all are ready. —
status.conditions[] object — —
status.conditions[].type string — required; max length 316
status.conditions[].status string — required; one of True, False, Unknown
status.conditions[].observedGeneration integer — format int64; minimum 0
status.conditions[].lastTransitionTime string — required; format date-time
status.conditions[].reason string — required; pattern ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$; min length 1; max length 1024
status.conditions[].message string — required; max length 32768
status.notAssessed array — —
status.notAssessed[] string — —
status.targets array — —
status.targets[] object — —
status.targets[].target string — required
status.targets[].score integer — required
status.targets[].ready boolean True only when verdict is "ready". Kept for v0.1 readers; prefer verdict. required
status.targets[].verdict string ready (no blockers, all required checks assessed), blocked (at least one blocker), or unknown (no blockers found, but a required check was not assessed; see notAssessed). one of ready, blocked, unknown
status.targets[].blockers integer — required
status.targets[].warnings integer — required
status.targets[].infos integer — required
status.targets[].suppressed integer Findings accepted by spec.ignore or upgradescope.basit.engineer/ignore annotations; not in blockers, warnings or infos. —
status.targets[].byCategory map of integer — —
status.targets[].topFindings array — at most 20 items
status.targets[].topFindings[] object — —
status.targets[].topFindings[].category string — required
status.targets[].topFindings[].severity string — required
status.targets[].topFindings[].title string — required
status.targets[].topFindings[].remediation string — —