1# -- Global configuration
3 # -- Override the image registry for all images in the chart
4 # Useful for air-gapped clusters that mirror images to an internal registry
6 # -- Override image pull secrets globally
8 # -- Kubernetes cluster DNS domain
9 clusterDomain: "cluster.local"
10# -- Enable production guard rails: template rendering fails if insecure
11# chart defaults (e.g. the default database password) would reach the
12# cluster. Enabled in values-prod.yaml; leave false for dev/kind.
14# -- Number of Kates API pods. Must be 1; values.schema.json refuses more.
15# The Kates API keeps each run's workers, the concurrent-run limit, the
16# disruption lease and the live event streams in its own memory, and a pod
17# that starts marks every RUNNING run in the database FAILED. A second pod
18# fails the runs the first is executing, and the two can each run a
19# disruption plan against the same cluster.
21# -- Container image configuration
24 repository: cgr.dev/chainguard-private/kates
25 # -- Image tag. Must be the release that carries the non-blocking health
26 # endpoints the probe defaults below depend on (>= 1.22.0).
27 tag: 1.25.0-r1@sha256:e8f15af9db3f30d2dee1890f0fc4ba2581dca9475507ed19d449fe588113c642
28 # -- Image pull policy
29 pullPolicy: IfNotPresent
30# -- Secrets for pulling images from private registries
32# -- Override the chart name
34# -- Override the full release name
36# -- DNS policy for pods (ClusterFirst, Default, None, ClusterFirstWithHostNet)
38# -- Custom DNS configuration (nameservers, searches, options)
40# -- Service account configuration
42 # -- Create a ServiceAccount
44 # -- ServiceAccount name (auto-generated if empty)
46 # -- Extra annotations for the ServiceAccount
48 # -- Automount the service account token
50# -- RBAC configuration
52 # -- Create ClusterRole and ClusterRoleBinding
54 # -- Grant the writes the direct Kubernetes chaos backend makes itself
55 # (KATES_CHAOS_PROVIDER=kubernetes, or hybrid without Litmus): NetworkPolicies,
56 # StatefulSet scaling, and pod ephemeral containers. Litmus runs its
57 # experiments as litmus-admin and needs none of this.
59 # -- Namespaces where the INTEGRATION_CDC test may read its database's
60 # password: a Role in each grants get on the Secret `postgresql` (key
61 # postgres-password), the only Secret the Kates API reads. The test uses the
62 # PostgreSQL behind the first Service labelled
63 # app.kubernetes.io/name=postgresql in any namespace, or in `database` when
64 # there is none. `kates deploy --with-kafka-connect` installs it there and
65 # sets this to that namespace. Each one must exist before the install.
66 # Empty grants nothing, and an INTEGRATION_CDC run then fails at DB_SETUP.
67 cdcSecretNamespaces: []
68 # -- Extra RBAC rules (e.g. for Litmus Chaos integration)
70# -- Extra annotations to add to pods
72# -- Extra labels to add to pods
74# -- Kubernetes Service configuration
78 # -- HTTP service port
80 # -- NodePort value (only when type=NodePort)
82 # -- Application protocol hint for service mesh
84 # -- Extra annotations for the Service
86# -- gRPC port configuration
88 # -- gRPC container/service port
90 # -- gRPC NodePort value (only when type=NodePort)
92# -- Ingress configuration
96 # -- Ingress class name (e.g. nginx)
98 # -- Extra Ingress annotations
100 # -- cert-manager integration
102 # -- Enable cert-manager annotations
104 # -- Issuer or ClusterIssuer name
106 # -- Issuer kind (ClusterIssuer or Issuer)
107 issuerKind: ClusterIssuer
114 # -- TLS configuration
116 # -- gRPC Ingress (separate Ingress resource for gRPC traffic)
118 # -- Enable gRPC Ingress
120 # -- gRPC Ingress hostname
121 host: grpc.kates.local
122 # -- Extra gRPC Ingress annotations
124 # -- gRPC TLS configuration
126# -- Resource requests and limits for the KATES container
134# -- Flyway schema migration behaviour
136 # -- Repair the schema history on startup before migrating.
138 # DEVELOPMENT ONLY. It fixes "Migration checksum mismatch", which happens when
139 # an unreleased migration is edited after a local database already applied it.
140 # On a real database that mismatch means the file and the schema genuinely
141 # disagree, and silently rewriting the history hides it — so this stays off by
142 # default and is enabled in the local overlays.
144# -- Container args, replacing the image's CMD. Empty means "use the image's
145# own default". The native image sets its heap percentage through CMD, since a
146# native binary ignores JAVA_TOOL_OPTIONS; override it here rather than
147# rebuilding the image.
149# -- JVM configuration
151# JVM IMAGE ONLY. A GraalVM native image does not read JAVA_TOOL_OPTIONS, so
152# everything here is silently ignored when running a `-native` tag — see
153# values-native.yaml, which empties it for that reason.
155 # -- JVM options passed via JAVA_TOOL_OPTIONS (ignored by the native image)
156 options: "-Xms512m -Xmx2560m -XX:+UseZGC -XX:+ZGenerational"
157# -- Pod-level security context (PSS restricted compliant)
158# NOTE: runAsUser and fsGroup are intentionally unset so that platforms
159# like OpenShift can assign random UIDs via their Security Context Constraints.
160# Set them explicitly in your environment values file if needed.
167# -- Container-level security context (PSS restricted compliant)
168containerSecurityContext:
169 allowPrivilegeEscalation: false
170 readOnlyRootFilesystem: true
175# -- Grace period for pod termination (seconds)
176terminationGracePeriodSeconds: 60
177# -- Deployment update strategy. Must be Recreate; values.schema.json refuses
178# RollingUpdate, which starts the new pod while the old one still runs (see
179# replicaCount). Recreate stops the old pod first, so every upgrade has a gap:
180# the API is unreachable until the new pod is Ready, a minute or two on the
181# JVM image, and a run still going when the old pod stops ends FAILED, as on
182# any restart. Upgrade between runs.
185# -- Horizontal Pod Autoscaler configuration. enabled must stay false;
186# values.schema.json refuses true. Kates runs one replica (see replicaCount),
187# and the CPU a native benchmark burns is what would make an autoscaler add a
188# second pod in the middle of a run.
190 # -- Enable HPA (must be false)
192 # -- Minimum replicas
194 # -- Maximum replicas
196 # -- Target CPU utilization percentage
197 targetCPUUtilizationPercentage: 80
198 # -- Target memory utilization percentage (empty to disable)
199 targetMemoryUtilizationPercentage: ""
200 # -- Custom metrics for HPA
202 # -- Scale behavior policies
205 stabilizationWindowSeconds: 300
211 stabilizationWindowSeconds: 30
216# -- Pod Disruption Budget configuration. With one pod, a budget either allows
217# its eviction or blocks every node drain: set maxUnavailable, and leave
222 # -- Minimum available pods. Must stay empty; values.schema.json refuses a
223 # value: any minimum leaves the one pod unevictable, and a drain never ends
225 # -- Maximum unavailable pods
227 # -- Unhealthy pod eviction policy
228 unhealthyPodEvictionPolicy: IfHealthy
229# -- Priority class name for pod scheduling
231# -- Topology spread constraints for pod scheduling
232topologySpreadConstraints: []
233# -- Node selector for pod scheduling
235# -- Tolerations for pod scheduling
237# -- Affinity rules (includes default pod anti-affinity for HA)
240 preferredDuringSchedulingIgnoredDuringExecution:
245 - key: app.kubernetes.io/name
249 topologyKey: kubernetes.io/hostname
250# -- Extra environment variables for the KATES container
252# -- Extra init containers (e.g. for Vault secret fetching, schema migration)
253extraInitContainers: []
256# -- Extra volume mounts
258# -- API key authentication
260 # -- Enable API key authentication
262 # -- API key value (auto-generated 32-char key if empty)
264 # -- Use an existing Secret instead of creating one
266 # -- Key in the existing Secret
268# -- Health probe configuration
270# Every probe points at a MicroProfile health endpoint, never at a business
271# endpoint. `/api/health` looks like the obvious readiness URL but calls
272# ClusterHealthService.isReachable() — an uncached AdminClient round-trip with a
273# 5s blocking get — on every request. Since a probe's timeoutSeconds defaults to
274# 1s, a cluster whose Kafka is still coming up fails EVERY readiness probe and
275# the pod never goes Ready, even though the app is fine. `/q/health/ready` reads
276# the periodically-refreshed KafkaReachabilityCache instead and never blocks on a
279 # -- Startup probe (gates readiness/liveness probes)
281 path: /q/health/started
282 # 60 x 2s = 120s of JVM boot budget. 30 (60s) is not enough on a
283 # CPU-constrained node: the kubelet kills the container mid-boot and the
284 # restart loop reads as "kates takes forever to start".
290 path: /q/health/ready
291 initialDelaySeconds: 5
298 initialDelaySeconds: 15
302# -- Container lifecycle hooks
304 # -- Seconds to sleep in preStop hook (allows LB drain)
305 preStopSleepSeconds: 5
306# -- Init container configuration
308 # -- Busybox image for wait-for-postgres init container
310 image: cgr.dev/chainguard-private/netcat:1.238-r1@sha256:93d88a74ea2dff4aaab591b925fab3ef6583da37ba6aadc99854b8fb024bb5d4
311 pullPolicy: IfNotPresent
312# -- Kafka connection configuration
314 # -- Kafka bootstrap servers
315 bootstrapServers: "krafter-kafka-bootstrap.kafka.svc:9092"
316 # -- Namespace where CDC integration test KafkaTopic CRs are managed (empty = auto-detect)
318 # -- Client rack ID for rack-aware consumption
320 # -- Security protocol
322 protocol: SASL_PLAINTEXT
323 # -- SASL authentication
328 mechanism: SCRAM-SHA-512
330 username: kates-backend
331 # -- K8s Secret name containing the SASL password
332 secretName: kates-backend
333 # -- Key in the Secret containing the SASL password
335 # -- OAuthBearer configuration (when mechanism=OAUTHBEARER)
340 clientSecretKey: client-secret
341 # -- SSL/TLS configuration
345 # -- Truststore configuration
350 # -- Keystore configuration
355# -- Trogdor coordinator configuration
357 # -- Trogdor coordinator URL
358 coordinatorUrl: "http://trogdor-coordinator.kafka.svc:8889"
359 # -- Trogdor agents that run tasks (KATES_TROGDOR_AGENT_NODES): node names
360 # from the coordinator's platform config, comma-separated; a run's tasks take
361 # them in turn. node0 is the name in the trogdor.conf Kafka ships. A name the
362 # coordinator does not know fails the task with "Unknown node names".
364# -- Prometheus the backend queries for a disruption's Kafka metrics
366 # -- Prometheus base URL (KATES_PROMETHEUS_URL). The default is the Service
367 # kube-prometheus-stack creates for charts/monitoring installed as release
368 # `monitoring` in namespace `monitoring`, which is what `kates deploy` does
369 # (it sets this for the namespace it uses). `make monitoring` installs that
370 # release in namespace `kafka`: set
371 # http://monitoring-kube-prometheus-prometheus.kafka.svc:9090 there, and
372 # networkPolicy.prometheus.namespace to kafka. Unreachable, a disruption's
373 # Prometheus metrics are missing and its SLA verdict lists them unevaluated.
374 url: "http://monitoring-kube-prometheus-prometheus.monitoring.svc:9090"
375# -- Benchmark engine configuration
377 # -- Default benchmark backend (native or trogdor)
378 defaultBackend: "native"
379# -- Fault tolerance timeout configuration (ms)
382 # -- Timeout for all TopicService operations
384 clusterHealthService:
385 # -- Default timeout for cluster health operations
386 defaultTimeoutMs: "35000"
387 # -- Timeout for reachability check
388 reachableTimeoutMs: "10000"
389 # -- Timeout for full health check
390 healthCheckTimeoutMs: "60000"
391 consumerGroupService:
392 # -- Timeout for consumer group operations
394# -- NetworkPolicy configuration
396 # -- Enable NetworkPolicy
401 - namespaceSelector: {}
406 - namespaceSelector: {}
410 # -- Kafka egress configuration
414 # -- Prometheus egress configuration: the namespace prometheus.url points
415 # into. The policy used to allow `monitoring` whatever this said.
417 namespace: monitoring
419 # -- Extra egress rules
421# -- Observability and monitoring
423 # -- Prometheus ServiceMonitor
425 # -- Enable ServiceMonitor
427 # -- Target namespace for the ServiceMonitor
433 # -- Extra labels for ServiceMonitor
435 # -- Metric relabeling rules
436 metricRelabelings: []
437 # -- Relabeling rules
439 # -- PrometheusRule for alerting
441 # -- Enable PrometheusRule
443 # -- Target namespace for the PrometheusRule
450 expr: up{job="{{ include \"kates.fullname\" . }}"} == 0
455 summary: "KATES instance is down"
456 description: "KATES pod {{ $labels.pod }} has been down for more than 5 minutes."
457 - alert: KatesHighErrorRate
458 expr: rate(http_server_requests_seconds_count{job="{{ include \"kates.fullname\" . }}", status=~"5.."}[5m]) > 0.1
463 summary: "KATES high error rate"
464 description: "KATES is returning more than 10% 5xx responses."
465 # -- GONE in 0.9.0: the "KATES — Overview" board (dashboards/kates-overview/)
466 # is delivered by charts/monitoring with every other board in dashboards/
467 # (its `dashboards.enabled`), scoped to a release by its `$job` template
468 # variable. A release that still sets any `metrics.grafanaDashboard.*` key
469 # is REFUSED with the new location named (this chart has no values schema,
470 # so without the refusal the key would be accepted and silently ignored).
471# -- Bundled PostgreSQL configuration.
472# A self-contained single-instance StatefulSet on the official `postgres`
473# image (no Bitnami). For production HA, set enabled=false and point
474# externalDatabase at a managed cluster (CloudNativePG recommended).
476 # -- Deploy bundled PostgreSQL
478 # -- PostgreSQL image (official library image; Alpine variants also work)
480 repository: cgr.dev/chainguard-private/postgres
481 tag: 16.15-r5@sha256:ddf4e62be22609f378f65d646789e772bf470899f1d16acb151c14632900a4fb
482 # -- Database authentication
486 # -- Database username
488 # -- Database password (ignored if existingSecret is set)
490 # -- Use an existing Secret for DB credentials
492 # -- Key in the existing Secret
493 passwordKey: "password"
494 # -- Node selector for the embedded PostgreSQL pod (dev/test only)
496 # -- Tolerations for the embedded PostgreSQL pod
498 # -- Affinity rules for the embedded PostgreSQL pod
500 # -- PVC storage configuration
504 # -- Storage class (empty for default)
506 # -- PostgreSQL resource requests and limits
514 # -- PostgreSQL pod security context
519 # -- PostgreSQL container security context
520 containerSecurityContext:
521 allowPrivilegeEscalation: false
525 # -- JDBC connection pool settings
527 # -- Maximum pool size
529 # -- Minimum pool size
531# -- External database configuration (when postgresql.enabled=false).
532# Recommended for production HA: run a CloudNativePG `Cluster` (official
533# postgres images, streaming replication, backups) and point host/port at its
534# `-rw` service, e.g. host: kates-db-rw.database.svc — no Bitnami involved.
536 # -- Enable external database
544 # -- Database username
546 # -- Database password (ignored if existingSecret is set)
548 # -- Use an existing Secret for DB credentials
550 # -- Key in the existing Secret
551 passwordKey: "password"
552# -- Default benchmark parameters (fallback for all test types)
554 replicationFactor: "3"
556 minInsyncReplicas: "2"
560 compressionType: "lz4"
562 numRecords: "1000000"
567# -- Per-test-type parameter overrides
569 # -- LOAD: baseline throughput test
574 numRecords: "1000000"
577 # -- STRESS: high-concurrency, large batches
582 numRecords: "5000000"
585 # -- SPIKE: burst traffic, low-latency
590 compressionType: "none"
591 numRecords: "2000000"
593 # -- ENDURANCE: long-running, rate-limited
595 numRecords: "10000000"
597 durationMs: "3600000"
598 # -- VOLUME: large records, high batch size
604 numRecords: "2000000"
605 # -- CAPACITY: max parallelism
610 numRecords: "10000000"
611 durationMs: "1200000"
613 # -- ROUNDTRIP: latency-focused
617 compressionType: "none"
620# -- PostgreSQL backup CronJob
622 # -- Enable backup CronJob
624 # -- Cron schedule expression
625 schedule: "0 2 * * *"
626 # -- PostgreSQL image for pg_dump
627 image: cgr.dev/chainguard-private/postgres:16.15-r5@sha256:ddf4e62be22609f378f65d646789e772bf470899f1d16acb151c14632900a4fb
628 # -- Days to retain backups
630 # -- Backup persistence
636 # -- Backup job resources
644# -- Pre-upgrade Flyway migration Job
646 # -- Enable migration Job (runs as pre-upgrade Helm hook)
648 # -- Override image (defaults to KATES app image)
649 image: cgr.dev/chainguard-private/kates:1.25.0-r1@sha256:e8f15af9db3f30d2dee1890f0fc4ba2581dca9475507ed19d449fe588113c642
650 # -- Custom command (overrides default Flyway migration)
652 # -- Maximum retry attempts
654 # -- Maximum Job duration (seconds)
655 activeDeadlineSeconds: 600
656 # -- Migration job resources
664# -- Stale test run cleanup CronJob
666 # -- Enable cleanup CronJob
668 # -- Cron schedule expression
669 schedule: "0 4 * * 0"
670 # -- Delete completed test runs older than N days
672 # -- Curl image for API calls
673 image: cgr.dev/chainguard-private/min-toolkit-debug:latest@sha256:07e451e70f5ebb1f4c19d423fb6c5e3168ffeda21df578aceb4f2b93145f274d
674# -- Kyverno pod security policies (requires Kyverno controller in cluster)
676 # -- Enable Kyverno ClusterPolicy for the kates namespace
678 # -- Policy action: Audit (observe only) or Enforce (block non-compliant)
680 # -- Enable mutation rules to auto-inject security contexts
682 # -- Enable image registry restriction
683 restrictRegistries: false
684 # -- Allowed image registries (when restrictRegistries is true)
691 # -- GONE in 0.9.0: the Kyverno board (dashboards/kyverno-security/) is
692 # delivered by charts/monitoring with every other board in dashboards/ (its
693 # `dashboards.enabled`) — one Kyverno per cluster, one board, and it belongs
694 # where the rest of the cluster's boards live. `grafanaDashboard` (both the
695 # bool and the map shape) and `grafanaDashboardNamespace` are REFUSED if
696 # set, with the new location named.
697 # -- Cosign image signature verification
699 # -- Enable image signature verification via Cosign
701 # -- Image patterns requiring valid signatures
703 - "ghcr.io/bmscomp/*"
704 # -- Cosign public key (PEM format) — set via --set-file or Secrets
706 # -- Auto-generate default-deny NetworkPolicies for new namespaces
707 networkPolicyGeneration:
709 # -- Namespaces to exclude from default-deny generation
721 # -- PolicyExceptions for dev/test namespaces
723 # -- Enable PolicyException resources
725 # -- Dev namespaces where policies are relaxed
729 # -- Policies to create exceptions for
731 - kates-pod-security-standards
732 # -- Rules to exempt in dev namespaces
734 - validate-readonly-rootfs
735 - require-resource-limits
736 - disallow-latest-tag
737# -- Monitoring integration
739 # -- Enable telemetry export (Jaeger)