Skip to content

feat(cli): kates deploy runs the native Kates image on every cluster - #455

Merged
bmscomp merged 2 commits into
mainfrom
feat/kates-deploy-native-image
Oct 23, 2026
Merged

bmscomp merged 2 commits into
mainfrom
feat/kates-deploy-native-image

Conversation

@bmscomp

@bmscomp bmscomp commented Oct 23, 2026

Copy link
Copy Markdown
Owner

Why

An admin-less kates deploy on a kind cluster left the Kates API in CrashLoopBackOff: the container was OOMKilled (exit 137) just as Quarkus finished starting. Admin-less installs skip introspection, so the provider is unknown and the API gets values-generic.yaml, which put a 256m ZGC heap under a 512Mi limit. ZGC, metaspace, the code cache and Kafka's and Netty's buffers sit outside the heap, so every non-kind install was at the same risk.

What changes

  • kates deploy runs the native image on every cluster. Off kind, admin-less installs included, it now layers charts/kates/values-native.yaml after values-generic.yaml: the published -native tag, 768Mi/1Gi, native probe timings. Kind keeps its local native image when one is on the nodes, and the published one otherwise, as before.
  • values-generic.yaml gets a heap that fits: 512Mi request, 1Gi limit, -Xms256m -Xmx512m, as values-staging.yaml does. Under kates deploy the native overlay now replaces this sizing; it still matters for anyone who installs with the generic overlay alone. Chart 0.13.3; the README chart table and the version matrix follow.
  • The book said kates deploy runs the JVM image off Kind. Architecture, Performance Theory, the lab, the deployment chapter, CONCEPTS and the glossary now say it runs the native image everywhere, so the Serial GC's pauses land in the P99 and Max of the runs it set up, and that a plain helm install runs the JVM image with ZGC. The deployment chapter says to install the chart without the native overlay to measure with ZGC.

This reverses a deliberate choice. Runs set up by kates deploy on real clusters now measure with Serial GC instead of generational ZGC.

Tests

Run locally:

  • go vet ./..., go test ./..., golangci-lint run --new-from-rev=origin/main ./... (0 issues), govulncheck ./...
  • scripts/check-cli-style.sh, scripts/check-cli-compat.sh, scripts/check-versions.sh
  • ./mvnw test (backend Build & Test, which cli/** triggers): all 1,735 tests pass
  • scripts/check-book-style.sh, scripts/check-book-contrast.py, scripts/check-mermaid.sh
  • scripts/gen-version-matrix.sh --check and scripts/gen-chart-table.sh --check, on a clean git archive of the branch (a stray untracked charts/minio/ in my checkout trips them)
  • Book HTML render in a scratch copy: no unresolved links, all 8,107 fragment links land on an id
  • helm lint charts/kates -f values-generic.yaml -f values-native.yaml
  • On the kind lab (kind-panda), an admin-less release upgraded to the native overlay: 1.29.1-native started in 0.14s, Ready, 0 restarts. A full kates deploy was not re-run.

Not run locally: the PDF render (the edited lines are plain ASCII, so they add no new glyphs), and the Docker-only jobs (*IT tests, the native image build, the Kind integration tests, the Docker builds, CodeQL, Trivy).

Deliberately not done

  • Admin-less installs still don't recognise kind (the provider stays unknown), so on kind they get the generic and published-native overlays rather than values-kind.yaml.
  • The startup log's SRMSG00019: Unable to connect an emitter with the channel test-events-out from OutboxPoller is a separate issue and isn't touched here.

kates deploy applies values-generic.yaml on every cluster that is not
kind and on every admin-less install, which skips introspection and so
never detects kind. It gave the Kates API a 512Mi limit under -Xmx256m,
and the pod was OOMKilled as Quarkus finished starting: ZGC, metaspace,
the code cache and Kafka's and Netty's buffers sit outside the heap.
The overlay now requests 512Mi with a 1Gi limit and runs -Xms256m
-Xmx512m, as values-staging.yaml does. Chart 0.13.3; the README chart
table, the version appendix and the deployment chapter follow.
Off kind, admin-less installs included, kates deploy installed the JVM
image. It now layers values-native.yaml after values-generic.yaml, so
every cluster runs the published -native tag with the native overlay's
768Mi/1Gi and probe timings, as a kind cluster without a local build
already did. Kind keeps its local native image when one is on the nodes.

The book said kates deploy runs the JVM image off Kind. Architecture,
Performance Theory, the lab, the deployment chapter, CONCEPTS and the
glossary now say it runs the native image everywhere, whose Serial GC
pauses land in the latencies of the runs it set up, and that a plain
helm install of the chart runs the JVM image with ZGC.
@bmscomp
bmscomp merged commit c5e4728 into main Oct 23, 2026
62 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant