kubestronaut-sim/CHANGELOG.md
vumas3r cf4f5be7ae fix: stop browsers running a cached noVNC against the desktop's own
The desktop failed to start in a browser that had cached noVNC 1.6
from the Debian desktop image: its vnc.html, which has no clipboard
Clear button, ran the Ubuntu image's 1.3 ui.js, which wires one up
and threw "Cannot read properties of null". websockify sends only
Last-Modified, so browsers cache noVNC on a guess, and it answers a
revalidation with 304 when the file on disk is older than the copy.

Serve noVNC through websockify-no-store, which adds Cache-Control:
no-store to every response, and from /novnc/ rather than /, so no
browser holds a stale copy at the paths the desktop now uses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 16:45:03 -06:00

192 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Changelog
Notable changes to kubestronaut-sim, newest first. A version is the `VERSION` string in `ksim`
(year.month.day.n); `./ksim help` and the top bar of the web page show the one you are running.
Every entry names the commit it came in.
## Unreleased
### Fixed
- The desktop could fail as it started - "noVNC encountered an error: Cannot read properties of
null (reading 'addEventListener')" - in a browser that had cached the Debian desktop's noVNC
1.6: its page ran the Ubuntu image's 1.3 `ui.js`. websockify now sends `Cache-Control:
no-store`, and noVNC moved to `/novnc/`, past what browsers hold at the old paths. Rebuild the
desktop (`./ksim build`) and restart `./ksim web`.
## 2026.10.19.1 — 2026-10-21
Merged into `main` from `feat/lessons`. Everything below came in `0e5f768`, except the CKS Q103
fix (`f54395f`).
### Changed
- **CKA and CKS run Kubernetes v1.37** (CKAD already did). CKA follows the real exam; CKS runs
ahead of it - the Linux Foundation still listed v1.35 for CKS on 2026-10-19. The CKA curriculum
is unchanged (`CKA_Curriculum_v1.37.pdf` is the v1.35 document). Tasks and notes that named
1.35/1.36 now name 1.37 and 1.38, and the etcd ones etcd 3.7.
- CKS Q37 and Q39 hold their worker back on **v1.36** - the v1.37 repository has nothing older
than the cluster's 1.37.0 - so upgrading it is a minor upgrade: the repository line first.
- **Exam hosts and the desktop are Ubuntu 24.04**, not Debian. The host image is kind's node
rebuilt on `ubuntu:24.04`: kind's packages and systemd setup, and its containerd, runc, crictl,
CNI plugins and preloaded images copied from the pinned kind image. The desktop gets Firefox ESR
from Mozilla's APT repository (Ubuntu's own `firefox` is a snap).
- **Every host has Kubernetes as held apt packages** from pkgs.k8s.io, with the repository line of
its minor, as an exam node has - before, only CKS hosts did. The `kubeadm upgrade` wrapper moved
into the common image. Hosts also gained man pages, `hexdump` (bsdextrautils) and `xxd`.
- A task or lesson may name a Kubernetes minor (`"k8s"`) or host flavour (`"image"`) of its own;
`./ksim build` builds what any of them names. v1.36 is pinned for the upgrade task and lesson.
- `./ksim build --vm` builds VM disks only for the tracks that have VM tasks.
### Added
- **CKA lessons for all 27 objectives** (`cka/lessons_storage.py`, `_tshoot`, `_work`, `_arch`,
`_net`; 135 steps). Besides each competency, they cover what a full CKA course teaches under it
- checked against the outline of KubeDojo's CKA course, written from scratch: projected volumes,
volume expansion, snapshots and restores, eviction thresholds, debug containers, kube-proxy's
chains, encryption at rest, in-place resize,
PodDisruptionBudgets, QoS classes, ServiceAccount tokens, a real upgrade from v1.36 to v1.37 after
an etcd backup and restore, an HA join, EndpointSlices, an operator. `./ksim lesson audit`: 135
of 135 steps proven.
- **CKA tasks 132-145** (`cka/bank_course.py`) on the same topics: a real cluster upgrade to
v1.37.1, a drain under a PodDisruptionBudget, a container without a shell, ServiceAccount tokens
and automounting, a projected volume, QoS classes, in-place resize, eviction thresholds,
kube-proxy's chains, a Service backed by a hand-written EndpointSlice, encryption at rest,
required anti-affinity (and the rollout it blocks), a StatefulSet canary by partition, an
operator whose RBAC lacks `backups/status`, and (146-147) growing a claim in use, snapshot,
restore and clone on `csi-hostpath-sc`. CKA now has 147 tasks, 112 of them in the pool.
- `ensure_csi_hostpath` for setups: the CSI hostpath driver (v1.18.0) with external-snapshotter's
CRDs and controller, its `csi-hostpath-snapclass`, and StorageClass `csi-hostpath-sc` with
`allowVolumeExpansion: true` - the class the real CKA's storage tasks use.
- **Lessons**: guided labs, one per curriculum objective, on a host of their own and with no
clock. A lesson is an introduction, steps you do in the desktop's terminal (each with a
**Check step** button, a hint and **Show me the commands**), and a wrap-up that sends you to the
objective's timed drill. Steps count in order. A lesson writes nothing to the history or the
scores; one whose every step was checked is marked done on its objective.
- The pilot covers CKAD's Application Deployment domain: 2.1 blue/green and canary, 2.2
rolling updates and rollbacks, 2.3 Helm, 2.4 Kustomize (`ckad/lessons.py`).
- Browser: a lesson screen in the exam screen's frame (Introduction, Step N of M, Wrap-up), a
**Lesson** button and a `lesson ✓` mark on objectives, **Lesson first** on the path card, a
*Take a lesson* session in the Start exam dialog, and a summary page after a lesson.
- Terminal: `./ksim lesson [OBJ]`, `./ksim lesson step | check | hint | show [N]`, `./ksim end`.
- `./ksim lesson audit [OBJ..]` proves lessons on real clusters: every step must fail its check,
be done by its own commands as `candidate`, then pass. CKAD 2.1–2.4: 24 of 24 steps proven.
- Engine: lessons are sessions of mode `lesson` (hosts `ckad9201`.., ids 9000 + objective),
`POST /api/lesson/check`, done stamps under `lessons` in `study-<track>.json`, and `step()`
in `sim/bank.py` for writing them.
- Tasks and lessons render fenced code blocks (kept as written, a click copies them) and
paragraphs of `- ` lines as lists.
### Fixed
- CKA Q4 and Q49: their solutions wait for the new CRD to be `Established` before creating an
object of its kind (on v1.37 it lost that race: "no matches for kind").
- CKS Q4 gave 3 of its 12 points untouched: its token check took any Pod of the Deployment, and
an untouched Deployment's Pods run as `default`, with a token mounted. It now takes a Pod that
runs as `<deployment>-sa`.
- CKS Q103 failed to seed once, six hosts at a time: a minute passed without a Falco alert naming
the Pod. Its setup now tries a new Pod - a container Falco's container plugin looks up afresh -
before it gives up.
- Building a host image for a kind image not pulled yet: podman's pull progress was read as the
etcd image's name.
- A solution or lesson step that prints binary data (an etcd value) no longer stops the audit.
## 2026.10.15.3 — 2026-10-15
### Added
- **Browser UI in the style of [CK-X](https://github.com/sailor-sh/CK-X)** (`bab85d1`), itself
modelled on the Linux Foundation exam UI. Written from scratch, with nothing loaded from the
network.
- **Landing page.** The track switch sits in the top bar. **Start exam** opens a dialog to pick
the session: the next step on the path, an objective, a domain, the next domain, the whole bank,
tasks of your choice, a simulator set or a full exam, with or without hard mode. The full exam
warns while a domain has not been drilled yet. Below the dialog button come the path, a card per
domain, and every objective with its notes and skip links. While a session is prepared, an
overlay shows the clusters' progress and log; it comes back if the page is reloaded meanwhile.
- **Exam screen.** A dark top bar holds the clock and three menus: *Exam Interface* (fullscreen,
panel sizes, reconnect the desktop), *Exam Controls* (submit, pause, restart the clock,
terminate the session) and *Exam Information* (exam instructions, Kubernetes docs, history).
The light question panel has `< Question N of M >`, with flags and grades marked. Each task is
headed *Solve this question on instance: `ssh host`*, and ends with **Flag for review**,
**Satisfied with answer →** and, in drills, **Check this task**. The remote desktop sits beside
it, with reconnect and fullscreen buttons and a divider you can drag.
- **Results page.** Points, pass or fail, bars per domain, every task's checks and reference
solution, *View answers*, *Drill what I missed*, *Review tasks* and *History*.
- A session started in the browser opens a "Ready to begin" dialog, and its **Start** puts the
full time on the clock.
- **Terminate session** and **Delete the hosts** (`bab85d1`), backed by `POST /api/terminate`. An
open session ends ungraded and nothing is recorded, as with `./ksim abort`; a finished session
only loses its hosts. Either way, only that session's hosts are deleted. The session payload now
says whether a session was aborted.
- **Dark mode** (`db2575b`): ◐ Auto (your system's setting, the default), ☀ Light or ☾ Dark. The
switch is in the landing page's top bar, the *Exam Interface* menu and on the results page. The
browser keeps the choice and applies it before the page draws. This came without a version bump.
### Changed
- The landing page, exam screen and results page replace the lobby overlay, the number rail with
its task pane, and the old results overlay. The browser remembers hard mode and the width of the
question panel.
## 2026.10.15.2 — 2026-10-15
### Added
- **`./ksim restart` and a Restart clock button** (`c244bd9`). The session's full time goes back on
the clock and starts running; the hosts, the work on them, results, flags and notes stay. Like
pause, it is recorded nowhere: the attempt's time used counts from the restart. A submitted
session refuses it. The button is backed by `POST /api/restart`.
## 2026.10.15.1 — 2026-10-15
### Removed
- **Study mode** (`c266eeb`): there are no more untimed sessions with the reference solutions open
from the start, and `./ksim study` is gone. Every session runs against the clock.
### Changed
- The path is objective drills against the clock, then a mock, then the fixed simulator sets. An
objective is done when every task passed on its latest timed attempt; the "studied" stage and its
`~` mark are gone. `./ksim next` always drills, and the lobby's "Study mode" became "Drill an
objective".
- `study-<track>.json` keeps your focus, the domains you marked known and when each objective was
done. Results of old study sessions stay in it, read by nothing.
### Added
Work from 2026-10-13, first committed here:
- **`./ksim skip` / `unskip`**, and the lobby's "I know this — skip it" links. They mark a domain or
an objective as known, so the path, the drill with no argument and `drill all` leave it out. A
mock still draws from every domain.
- **`DOMAIN:N`** picks N tasks of a domain spread over its objectives: `./ksim drill OBS:3`, or
`./ksim next OBS:3` to add them to the next step.
- A command with neither `--track` nor `KSIM_TRACK` is for the track whose session is under way.
`./ksim show` says where a task's host resolves.
### Fixed
- CKAD Q60: its check now says which file holds which run's output.
## 2026.10.12.1 — 2026-10-13
The first release (`f3d0e53`), grown out of `cka-sim`.
- **One host per task.** Each task gets a kind (kubeadm) cluster in rootless podman, with real etcd,
a static-pod control plane and a systemd kubelet. You reach it with `ssh <host>` from a remote
desktop in the browser (XFCE, a terminal, Firefox limited to the documentation the exam allows).
- **CKS hosts** carry kube-bench, trivy, kubesec, kube-linter, bom, cosign, istioctl, gVisor and
Kubernetes from apt packages. The Falco and AppArmor tasks run on QEMU/KVM Ubuntu VMs.
- **A pull-through image cache** (`ksim-registry`) keeps sessions under Docker Hub's pull limit.
- **Task banks:** CKA 131, CKAD 105 and CKS 110 tasks, with at least 17 pool tasks in every domain.
Each track comes with its curriculum, study notes, reference solutions and scripted solutions.
- Drills, full mocks with hard mode, the fixed simulator sets (CKA C and D, CKAD A), a curriculum
path with study mode, attempt history and weak spots.
- `./ksim coverage` and `./ksim audit`. All 346 tasks pass the audit: each seeds cleanly, scores
nothing untouched and reaches full marks with its scripted solution.
The repository's initial commit (`3d7605c`) holds the licence and a stub README.