Skip to content

docs: write the pack documentation - #33

Merged
jbouder merged 4 commits into
mainfrom
docs/pack-content
Aug 24, 2026
Merged

docs: write the pack documentation#33
jbouder merged 4 commits into
mainfrom
docs/pack-content

Conversation

@jbouder

@jbouder jbouder commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Fills the docs scaffold from #32 with real content, structured the way apps-pack does it.

Pages

Getting Started

Page Covers
Introduction the two access paths, what gets deployed, why the chart renders its own Services
Getting started install, verify, deploy something, uninstall
Deploying on Nebari the two NebariApps, Argo CD, and what the ignoreDifferences rules cost
Connecting from Jupyter ray:// vs HTTP, version matching, NetworkPolicy, what doesn't survive a roll
Local development what dev/ builds and the four things it can't exercise

Guides

Page Covers
Deploying models declarative vs notebook, building the image, proxy_location, health
Scaling and GPUs replicas, GPUs end to end, tolerations, and the probe overrides
Organization CA bundle the injection, the Argo CD footgun, the httpx gap
Troubleshooting the failures this pack actually produces

Reference

Page Covers
Configuration every value, with the asymmetries called out
Architecture the README's mermaid diagram plus the reasoning behind the Service design

The through-line

Several of this pack's sharpest edges are invisible from kubectl, so the docs consistently pair each with the command that confirms it:

  • An unset nebariapp.hostname silently skips the serve NebariApp. Its template is guarded on serve.enabled and a non-empty hostname, so nothing renders and nothing errors. The dashboard one uses required and fails loudly — that asymmetry is documented in three places.
  • probe: {} does not suppress a probe. Helm's deep merge keeps existing keys, so the chart's raylet-only override stays. null (~) is the answer. Worth spelling out because the wrong answer reintroduces the Worker readiness probe fails on fresh cluster: requires Ray Serve EveryNode proxies + at least one deployed app #7 symptom.
  • Argo CD's /spec/rayClusterConfig ignore drops the CA injection while reporting fully synced. The README covers this well; it now has a callout on the CA page, a cross-reference from Deploying on Nebari, and a "check printenv SSL_CERT_FILE, not the sync status" instruction.

Two README details worth a look

nebariapp.serve.enabled — the README's configuration table says the default is true; values.yaml sets false. The docs follow values.yaml, and the recommendation elsewhere in the README (keep the serve endpoint internal) agrees with false, so the table looks like the stale side. Not changed here.

GPU claiming has a fourth step. Requesting nvidia.com/gpu, setting runtimeClassName, and getting the auto-injected toleration gets a GPU attached to the pod — the Serve deployment still needs ray_actor_options.num_gpus or the replica runs on CPU next to an idle GPU. Scaling and GPUs walks all four steps with the verification commands.

Verification

npm test               10 passed
npm run build          12 pages, mermaid rendered inline, pagefind index built
check-links.sh         LINKS_OK at BASE=/ and BASE=/rayserve-pack/

🤖 Generated with Claude Code

Fills the Astro + Starlight scaffold with real content, following the
structure apps-pack uses.

  Getting Started
    getting-started       install, why the chart renders its own
                          Services, first deployment
    deployment            the two NebariApps, why ignoreDifferences is
                          needed, and what the broad rayClusterConfig
                          ignore costs
    jupyter               ray:// vs HTTP, version matching, the
                          NetworkPolicy, and what does not survive a
                          cluster roll
    local-development     what dev/ builds, and the four things it
                          cannot exercise

  Guides
    serve-applications    declarative vs notebook deployment, building
                          the image, proxy_location, checking health
    scaling               replicas, GPUs end to end (resource, runtime
                          class, auto-injected toleration, and the
                          ray_actor_options step people miss), and the
                          probe overrides behind issue #7
    ca-bundle             the injection, the four env vars and why
                          GIT_SSL_CAINFO is separate, the ConfigMap
                          rationale, the Argo CD footgun (#17), and the
                          httpx gap
    troubleshooting       the failures this pack actually produces

  Reference
    configuration         every value, with the asymmetries called out
    architecture          the mermaid diagram from the README, plus why
                          serve-svc targets only the head and what that
                          implies for worker readiness

The through-line is that several of this pack's sharpest edges are
invisible from kubectl: an unset nebariapp.hostname silently skips the
serve NebariApp, `probe: {}` does not suppress a probe because Helm's
deep merge keeps existing keys, and Argo CD's rayClusterConfig ignore
drops the CA injection while reporting fully synced. Each is documented
where someone would hit it, with the command that confirms it.

Adds an editLink baseUrl so every page carries an "Edit page" link.
@github-actions

Copy link
Copy Markdown

📄 Docs preview for docs/pack-content:
https://docs-pack-content.rayserve-pack.pages.dev

jbouder and others added 3 commits August 24, 2026 08:23
Accuracy review findings against the chart and live `helm template` renders.

Chart rename (#24) never reached the docs. The fullname helper yields
`rayserve-nebari-rayserve-pack`, so all 22 hardcoded names across six
pages were wrong — port-forwards, ray.init() addresses, kubectl targets,
and NebariApp names. Same bug in dev/Makefile.

There is no autoscaler. The chart does not set enableInTreeAutoscaling,
so minReplicas/maxReplicas are clamps, not a range something grows
within. Rewrote the scaling prose and the configuration table, and
dropped the maxReplicas: 8 headroom from the reference values file since
nothing would consume it.

minReplicas/maxReplicas do not default to replicas. values.yaml pins both
to 1, so the template's `default` never fires; KubeRay then clamps
desired replicas into [min, max] and `--set worker.replicas=3` yields one
worker. Documented as a caution.

make up did not deploy both NebariApps. It never set
nebariapp.serve.enabled=true, so with the chart default of false only the
dashboard rendered — and the `kubectl wait` on the serve NebariApp
targeted a resource that was never created, under its pre-rename name.
Set the flag and fixed both waits, which makes the page's description
true rather than documenting a broken command.

Also:
- gateway applies to both NebariApps, so the dashboard cannot be internal
  while the serve endpoint is public; the page claimed otherwise
- IgnoreExtraneous skips a resource that is live but not in the desired
  state; it does not make Argo CD tolerate resources KubeRay creates
- route_prefix is optional in Serve's config schema, defaulting to /
- image.tag is copied verbatim into rayVersion, so `2.43.0-custom` lands
  there as a version that does not exist; examples now tag `2.43.0`
- notebooks reach Serve over serve-svc, not head-svc (index diagram)
- helm template needs `helm dependency update chart` first
- canonicalized repo URLs past their rename redirects

Verified: npm test 10 passed; build 12 pages; check-links.sh LINKS_OK at
BASE=/ and BASE=/rayserve-pack/; every corrected example re-rendered
through helm template.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RHXnjMGsnSqmgxnx99Pqj6
Same root cause as the previous commit, outside docs/. The rename in #24
left pre-rename resource names in the CI workflows and the README.

test-integration.yaml has failed on main on every run since 94e8fba
(2026-07-22): both `kubectl wait --for=condition=Ready nebariapp/...`
steps target names the chart no longer produces, so the job dies before
it reaches the HTTPRoute and auth assertions. test.yaml port-forwards a
head-svc under the old name for the same reason.

Also correcting two README facts the docs review surfaced:
- nebariapp.serve.enabled documented as `true`; values.yaml sets `false`,
  and the recommendation elsewhere in the README agrees with `false`
- image.tag `2.43.0-custom` lands verbatim in the RayService's rayVersion

and canonicalizing repo URLs past their rename redirects.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RHXnjMGsnSqmgxnx99Pqj6
With the rename fixed, nebariapp-integration ran past the NebariApp waits
for the first time and exposed a second breakage in a step that had never
been reached.

The upgrade step repeats the install step's --set flags except the sizing
overrides, so it silently reverts head requests to 1 CPU / 2Gi and worker
replicas to 1. That is a rayClusterConfig change: KubeRay rolls the
cluster into pods a 2-CPU runner cannot schedule, generation 2 is never
observed, and `--wait --timeout 5m` fails with

  RayService generation is 2, but latest observed generation is 1

Auth is meant to be the only delta, so carry the sizing through. Verified
by rendering both steps' flags: the RayService is now byte-identical
between install and upgrade, so nothing rolls, while auth still renders
on both NebariApps for the SecurityPolicy assertion.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RHXnjMGsnSqmgxnx99Pqj6
@jbouder
jbouder merged commit 0bcbe63 into main Aug 24, 2026
4 checks passed
@jbouder
jbouder deleted the docs/pack-content branch August 24, 2026 12:58
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.

2 participants