Skip to content

API Reference

Packages

validation.scale-sentry.ek.co/v1beta1

Package v1beta1 contains API Schema definitions for the validation group.

Resource Types

CABundleSource

CABundleSource references a PEM bundle living in a Kubernetes object. Only ConfigMapRef is supported today; Secret backing is a future ticket.

Appears in: - TLSConfig

Field Description Default Validation
configMapRef ConfigMapKeyRef ConfigMapRef selects a key in a ConfigMap in the same namespace as
the ScaleValidation.

ConfigMapKeyRef

ConfigMapKeyRef identifies a single key in a ConfigMap.

Appears in: - CABundleSource

Field Description Default Validation
name string Name of the ConfigMap.
key string Key within the ConfigMap data block holding the PEM bundle.

CrossVersionObjectReference

CrossVersionObjectReference contains enough information to identify the target resource being validated.

Appears in: - ScaleValidationSpec

Field Description Default Validation
apiVersion string API version of the referent.
kind string Kind of the referent (e.g. Deployment).
name string Name of the referent.

DiagnosticAlert

DiagnosticAlert represents a single finding from the analysis engine.

Appears in: - ScaleValidationStatus

Field Description Default Validation
type string Type categorises the alert (e.g. "ProbeLeakage", "CPUThrottling").
severity Severity Severity is one of Info, Warning, or Critical. Enum: [Info Warning Critical]
message string Message is a human-readable description of the finding.
recommendation string Recommendation is the suggested remediation. Optional: {}

DisruptionConfig

DisruptionConfig controls chaos injection during the validation run.

Appears in: - ScaleValidationSpec

Field Description Default Validation
injectPodDeletion boolean InjectPodDeletion enables terminating a healthy replica during peak load. false
minReplicasForChaos integer MinReplicasForChaos is the minimum replica count before chaos is allowed.
Prevents disruption from causing total unavailability.
2 Minimum: 2
triggerDelay Duration TriggerDelay is the duration to wait after load starts before injecting chaos. Optional: {}

GRPCConfig

GRPCConfig carries gRPC-specific knobs for the loadgen Health/Check probe. Scoped intentionally narrow: the goal is to exercise h2 framing, gRPC trailers, and server-side request handling at the rate the load profile dictates, not to drive arbitrary RPC methods. Reflection-based method discovery and unary-RPC invocation against arbitrary user services are deferred to a future ticket.

Appears in: - TargetConfig

Field Description Default Validation
service string Service is the upstream service name passed to the Health/Check
probe (grpc.health.v1.HealthCheckRequest.service). Empty probes
overall server health. Use a non-empty value when the target
publishes multiple per-service health entries.
Optional: {}

LoadConfig

LoadConfig defines the synthetic traffic profile.

Appears in: - ScaleValidationSpec

Field Description Default Validation
baseRps integer BaseRPS is the starting requests-per-second before dynamic scaling.
concurrencyFactor integer ConcurrencyFactor does nothing. It was specified as a per-core
multiplier folded into the target rate, but no release ever
implemented it: the controller has always passed BaseRPS to the
load generator unchanged. It stays served, and optional, so
manifests written against the old required field keep validating.
Deprecated: use Concurrency to size the in-flight worker pool.
Scheduled for removal in v0.7.0.
Optional: {}
concurrency integer Concurrency fixes the load generator's worker-pool size, the
ceiling on requests in flight at once. Unset (or 0) derives it
from the peak arrival rate, capped at 256, which is correct for
targets that answer quickly.
Raise it when the target is slow enough that the derived pool
cannot keep the schedule: a backend answering in 500ms at 1000 RPS
needs ~500 requests in flight, and a 256-worker pool would throttle
arrivals into a closed loop, understating the latency a real
open-loop client would see.
Minimum: 0
Optional: {}
warmupDuration Duration WarmupDuration runs traffic against the target before the
measurement window opens. Requests are sent (so TCP/TLS handshakes
settle, JIT runs, caches warm) but their latencies and counters
are excluded from the SLA verdict. Default 0 (no warmup).
Optional: {}
profile LoadProfile Profile selects the arrival-rate shape for the measurement
window. Default Constant (today's behaviour). Poisson is the
recommended choice for SLA-accurate verdicts because user
traffic is open-loop.
Optional: {}

LoadPattern

Underlying type: string

LoadPattern is the shape of the generated request rate over time.

Validation: - Enum: [Constant Poisson Ramp Step Spike]

Appears in: - LoadProfile

Field Description
Constant
Poisson
Ramp
Step
Spike

LoadProfile

LoadProfile selects the arrival shape for the measurement window. Pattern-specific knobs apply only to their named pattern.

Appears in: - LoadConfig

Field Description Default Validation
pattern LoadPattern Pattern is the arrival shape. Constant Enum: [Constant Poisson Ramp Step Spike]
endRps integer EndRPS is the terminal rate for Ramp. Required when Pattern=Ramp. Optional: {}
rampDuration Duration RampDuration is the wall-clock window over which Ramp interpolates
from BaseRPS to EndRPS. Required when Pattern=Ramp.
Optional: {}
stepRps integer StepRPS is the rate increment per StepDuration interval. Required
when Pattern=Step.
Optional: {}
stepDuration Duration StepDuration is the wall-clock interval between Step climbs.
Required when Pattern=Step.
Optional: {}
spikes SpikeWindow array Spikes is the ordered list of spike windows to stitch into the
measurement phase. Required when Pattern=Spike.
Optional: {}

NetworkPath

Underlying type: string

NetworkPath selects where traffic enters, which is what isolates an in-cluster scaling problem from an edge one.

Validation: - Enum: [ClusterIP Ingress Gateway]

Appears in: - TargetConfig

Field Description
ClusterIP
Ingress
Gateway

Phase

Underlying type: string

Phase is the lifecycle state of a validation run. Pending and Running are transient; Succeeded, Failed and Error are terminal; Terminating is the deletion path.

Validation: - Enum: [Pending Running Succeeded Failed Error Terminating]

Appears in: - RunSummary - ScaleValidationStatus

Field Description
Pending
Running
Succeeded
Failed
Error
Terminating

Protocol

Underlying type: string

Protocol is the wire protocol the load generator speaks.

Validation: - Enum: [HTTP1 HTTP2 GRPC]

Appears in: - TargetConfig

Field Description
HTTP1
HTTP2
GRPC

RunSummary

RunSummary is a compact record of one terminal run, kept in ScaleValidationStatus.History so trend ("did this get worse over the last N releases") is visible from kubectl get -o json alone, without requiring a Prometheus scrape of scale_sentry_runs_total. Deliberately excludes Diagnostics: that field can grow arbitrarily large per run, which is fine for a single current-status snapshot but would make a History slice's size unbounded.

Appears in: - ScaleValidationStatus

Field Description Default Validation
finishedAt Time FinishedAt is when this run reached a terminal phase.
phase Phase Phase is the terminal phase this run reached (Succeeded or Failed). Enum: [Pending Running Succeeded Failed Error Terminating]
slaStatus Verdict SLAStatus mirrors the top-level status.slaStatus at run completion. Enum: [Pass Fail Unknown]
trafficIntegrity Verdict TrafficIntegrity mirrors the top-level status.trafficIntegrity at run completion. Enum: [Pass Fail Unknown]
failureRateBasisPoints integer FailureRateBasisPoints mirrors the top-level
status.failureRateBasisPoints at run completion.

ScaleValidation

ScaleValidation is the Schema for the scalevalidations API.

Field Description Default Validation
apiVersion string validation.scale-sentry.ek.co/v1beta1
kind string ScaleValidation
spec ScaleValidationSpec
status ScaleValidationStatus

ScaleValidationSpec

ScaleValidationSpec defines the desired state of a ScaleValidation run.

Appears in: - ScaleValidation

Field Description Default Validation
targetRef CrossVersionObjectReference TargetRef points to the workload to validate (e.g. a Deployment).
sla Duration SLA is the maximum allowed duration for HPA scale-up and pod readiness.
target TargetConfig Target configures the HTTP endpoint and network routing for load traffic.
load LoadConfig Load defines the synthetic traffic profile parameters.
disruption DisruptionConfig Disruption configures optional chaos injection during the validation. Optional: {}
schedule string Schedule is an optional cron expression. When set, the validation
re-runs on that schedule instead of running exactly once, and each
verdict is appended to status.history so a trend is visible from
kubectl get -o json alone. Standard five-field cron syntax plus
the usual descriptors (@hourly, @daily, @every 1h30m).
Runs never overlap: the schedule is evaluated only once a run has
reached a terminal phase, so a run that overruns its interval
delays the next one rather than racing it.
Optional: {}
suspend boolean Suspend stops future runs, both scheduled ones and the run a spec
edit would otherwise trigger. Setting it is itself a spec edit, so
it has to outrank that, or suspending would start the very run it
is meant to prevent. A run already in flight is left alone to
finish, and the last verdict stays on status, so suspending is safe
mid-run and reversible.
false Optional: {}

ScaleValidationStatus

ScaleValidationStatus defines the observed state of a ScaleValidation run.

Appears in: - ScaleValidation

Field Description Default Validation
phase Phase Phase represents the current lifecycle state. Enum: [Pending Running Succeeded Failed Error Terminating]
scaleUpDuration Duration ScaleUpDuration is the measured time from HPA trigger to all replicas ready. Optional: {}
slaStatus Verdict SLAStatus indicates whether the scaling met the configured SLA. Enum: [Pass Fail Unknown]
trafficIntegrity Verdict TrafficIntegrity indicates whether any requests were dropped. Enum: [Pass Fail Unknown]
totalRequests integer TotalRequests is the total number of HTTP requests sent during the run.
failedRequests integer FailedRequests is the number of HTTP requests that returned errors.
failureRateBasisPoints integer FailureRateBasisPoints is the ratio of failed to total requests in
basis points: 1 bp is 0.01%, so 66 is 0.66% and the 1% traffic
threshold is 100. An integer because the Kubernetes API convention
rejects floats, which do not round-trip reliably across clients.
diagnostics DiagnosticAlert array Diagnostics contains the list of analysis findings. Optional: {}
lastRunTime Time LastRunTime is the timestamp of the most recent validation execution. Optional: {}
history RunSummary array History holds the most recent terminal runs, newest first, bounded to
RunHistoryLimit entries. Lets a single kubectl get -o json answer
"did this get worse over the last N releases" without a metrics stack.
MaxItems: 10
Optional: {}
nextRunTime Time NextRunTime is when the next scheduled run is due. Empty for a
one-shot validation, and cleared while spec.suspend is true so
kubectl get never advertises a run that will not happen.
Optional: {}
observedGeneration integer ObservedGeneration is the metadata.generation the last terminal
result was produced from. When it lags metadata.generation the spec
has been edited since, and the controller starts a fresh run rather
than leaving a result that describes a spec the object no longer
carries.
Optional: {}
conditions Condition array Conditions follow the standard Kubernetes conditions pattern. Optional: {}

Severity

Underlying type: string

Severity bands a DiagnosticAlert. Critical means the run could not produce a trustworthy verdict; Warning means it did, with a caveat.

Validation: - Enum: [Info Warning Critical]

Appears in: - DiagnosticAlert

Field Description
Info
Warning
Critical

SpikeWindow

SpikeWindow describes a single rate-elevated slice inside a Spike measurement phase. At is measured from the start of the measurement phase (post-warmup). Spikes are inserted between Constant base slices at BaseRPS, so the resulting phase list is constant-spike-constant-...

Appears in: - LoadProfile

Field Description Default Validation
at Duration At is the offset from measurement-phase start at which the spike
begins.
duration Duration Duration is the wall-clock length of the spike.
rps integer RPS is the rate held during the spike. Must be > BaseRPS or the
"spike" would actually be a dip.

TLSConfig

TLSConfig configures TLS verification for the loadgen client. InsecureSkipVerify and CABundle are mutually exclusive; setting both is rejected by CRD validation.

Appears in: - TargetConfig

Field Description Default Validation
insecureSkipVerify boolean InsecureSkipVerify disables certificate verification entirely.
Use only for dev / CI clusters; production runs should pin a CA.
false Optional: {}
caBundle CABundleSource CABundle points to a ConfigMap key containing one or more
PEM-encoded certificates trusted by the loadgen client.
Optional: {}

TargetConfig

TargetConfig describes the HTTP endpoint and network path to test.

Appears in: - ScaleValidationSpec

Field Description Default Validation
mode TargetMode Mode determines how the load test target is resolved. Enum: [ServiceDefault AutoDiscoverProbe CustomPath]
customPath string CustomPath is the explicit HTTP path to target. Used when mode is CustomPath. Optional: {}
port integer Port is the target port number.
networkPath NetworkPath NetworkPath determines the routing pathway for load traffic.
ClusterIP sends traffic directly to the Service inside the cluster.
Ingress sends traffic through a classic Ingress controller (legacy
path, prefer Gateway for new deployments). Gateway sends traffic
through a Gateway API edge (Envoy Gateway and friends). Only one
pathway runs per validation to isolate variables.
ClusterIP Enum: [ClusterIP Ingress Gateway]
host string Host overrides the URL host the loadgen Job hits. Empty (default)
resolves to "..svc.cluster.local",
which is correct for ClusterIP runs against a Service that shares
the workload name. Set this to point load through an edge: e.g.
the Envoy Gateway address for a Gateway run, or the Ingress LB
hostname for the legacy Ingress path.
Optional: {}
protocol Protocol Protocol selects the wire protocol the loadgen speaks to the
target. HTTP1 uses fasthttp (default, backwards-compatible).
HTTP2 uses net/http + http2.Transport: ALPN-negotiated h2 for
https URLs, prior-knowledge h2c for http URLs. GRPC uses grpc-go
to invoke the standard grpc.health.v1.Health/Check probe; combine
with the optional GRPC block to scope the probe to a specific
upstream service.
HTTP1 Enum: [HTTP1 HTTP2 GRPC]
Optional: {}
grpc GRPCConfig GRPC carries gRPC-specific knobs. Only consulted when Protocol=GRPC;
ignored otherwise. Empty (or unset) means probe overall server
health on the resolved Service host:port.
Optional: {}
tls TLSConfig TLS configures HTTPS verification for the loadgen client. Only
applies when the resolved target URL uses the https scheme.
Optional: {}

TargetMode

Underlying type: string

TargetMode selects how the load generator resolves an endpoint.

Validation: - Enum: [ServiceDefault AutoDiscoverProbe CustomPath]

Appears in: - TargetConfig

Field Description
ServiceDefault
AutoDiscoverProbe
CustomPath

Verdict

Underlying type: string

Verdict is a pass/fail judgement. Unknown means the run could not measure the thing, which is deliberately not the same as failing it.

Validation: - Enum: [Pass Fail Unknown]

Appears in: - RunSummary - ScaleValidationStatus

Field Description
Pass
Fail
Unknown