Build1 distinct publisher3 min readUpdated
An ngrok post ports more than 100,000 lines of Kubernetes Go to TypeScript to demonstrate restart loops and dropped requests. The instructive case is the one a correct probe does not prevent.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
The default that produces the outage is the absence of a probe, not the presence of a bad one. With nothing configured, Kubernetes treats a container as Ready the moment it starts, including the seconds it spends initialising before it listens on port 8080 [4]. The container is up, it is advertised as healthy, and requests arriving in that window fail [4]. Nothing malfunctioned. The kubelet did what it was told, and it was told nothing.
The cost lives in the restart curve. CrashLoopBackOff starts at 10 seconds and doubles with each crash up to a ceiling of 5 minutes [5]. Run the sequence: 10, 20, 40, 80, 160, then 320 clipped to 300, so the sixth backoff already sits at the cap and about 10 minutes of wall clock is gone [14]. After that the container gets 12 start attempts an hour [15]. If the caller behaves like the post's pod-b, one request every 2 seconds [10], each capped gap is 150 requests with nowhere to land [16]. That is the mechanism behind "restart loops that take hours to recover from" [1]: a doubling that outruns the person watching it.
The more useful demo is the one where the probe is correct and the requests still fail. Add an httpGet startup probe and the pod reports itself not ready until the first GET /startup returns a status in the 200-399 range [7][9]. The client in the demo keeps failing anyway, because it is pointed at pod-a's IP address directly, which never consults readiness [11]. Readiness gates endpoints, not packets. It cannot correct a caller that already knows the address, and in a real cluster that caller is an ingress controller, a load balancer, or another service holding a stale target [10].
The probe budget is the other misconfiguration with teeth: periodSeconds multiplied by failureThreshold, roughly 5 seconds in the post's example, after which the kubelet kills the container rather than waiting longer [7]. Set that budget below a container's honest startup time and slow becomes dead, and dead re-enters the backoff schedule above [18]. Each node runs its own kubelet making these decisions locally [8], so the failure is per-node and looks like flapping rather than a policy error.
On the tooling itself, the author reports porting more than 100,000 lines of Kubernetes Go to TypeScript so the simulated cluster runs in the browser, verifying demo behaviour against k3s, and finding a bug in Kubernetes in the process [2][3]. The bug is announced and deferred to a later section [17]. Until it is named, the supportable claim is the narrower one: the port tracks k3s closely enough that its author trusted a divergence rather than assuming his own translation was wrong. That earns it standing as a teaching rig. It is not yet evidence about upstream. Also worth noting for anyone reading the demos literally: the NotReady label is the author's shorthand, since the API exposes a Ready condition that is True, False, or Unknown [12], and the backoff was compressed from 10 seconds to 3 for the demo [5], which makes the visible loop kinder than the one in production.
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
The author says he verified the behaviour of the demos against k3s and found a bug in Kubernetes.
Even when pod-a is not ready, pod-b's requests still fail during startup because pod-b is configured to send requests directly to pod-a's IP address, bypassing the readiness mechanism.
The post announces the Kubernetes bug with 'More on that later' and does not identify or describe it in the section that sets up the probe demos.
The post states its aim is to show how probes make an application more resilient and prevent avoidable mistakes such as restart loops that take hours to recover from and dropping requests during rollouts.
Every interactive demo in the post uses webernetes, the author's partial port of Kubernetes to TypeScript containing more than 100,000 lines of ported Kubernetes Go code, which runs a simulated cluster in the browser.
With no probe configured, Kubernetes considers the container Ready as soon as it starts even though it is still doing startup work and not listening on port 8080, and requests sent during that period fail.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Specific and internally consistent, but single-source and simulation-based
The mechanism claims are unusually specific and self-consistent: named probe types, httpGet success range, failureThreshold semantics, kubelet ownership of probing, the Ready condition's real API values, and stated CrashLoopBackOff defaults that support clean arithmetic. Against that, the entire cluster is one vendor blog post with no independent corroboration; the demos run in a simulated browser cluster rather than a real kubelet; the claimed k3s verification is asserted without method or artifact; and the claimed Kubernetes bug is never identified, so it cannot be checked at all.
No adoption signal beyond the author's own disclosure
The supplied material contains no third-party usage, deployment, download, repository, or customer evidence. The single observation available is the author using his own webernetes port inside his own blog post, which is a self-disclosure, not adoption. Kubernetes probe usage in the wild is not quantified anywhere in the source, so no adoption value can be assigned without guessing.
Mildly overstated by an unnamed bug and simulated-cluster framing
Most of the post's substance is modest and demonstrated in place: probe fields, defaults, and a failure mode that probes genuinely do not fix. The overstatement is narrow but real - a headline-grade 'found a bug in Kubernetes' claim is teased and never delivered in the supplied text, the '100,000 lines of ported Go' figure invites the reader to treat a partial reimplementation as authoritative behaviour, and demo timings are deliberately non-default. That pushes perceived authority modestly ahead of what the single source establishes.
Vendor developer-education post promoting the author's own tooling
The publisher is a commercial networking and ingress vendor, and the piece is developer-education content on its own blog. The author also promotes his own project, webernetes, as the substrate for every demo, and the post's stand-in for client traffic is explicitly an ingress controller or load balancer - the category ngrok sells into. Offsetting this, the technical content is generic upstream Kubernetes behaviour with no product pitch, pricing, or call to action in the supplied text, so the incentive is reputational and audience-building rather than directly transactional.
Moderate on mechanics, low on the unverified extras
Confidence is reasonable for the probe mechanics and stated defaults, which are specific, self-consistent, and support derivable arithmetic. It is held down by structural thinness: one publisher, one item, no adoption measurement, a simulated rather than real cluster, and two assertions (k3s verification, an upstream bug) that the supplied material leaves entirely unsubstantiated.
build
Thirteen tasks green, then "give up (Recommended)" on the one that needed understanding1 distinct publisher
build
One alert, two causes, four green dashboards: the day the stack agreed and was wrong1 distinct publisher
build
A three-Pi HA control plane that ended up less reliable than the one node it replaced1 distinct publisher
build
A build step instead of a backend: 1,025 records, 8 locales, no runtime API1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
1 article · August 22, 2026