Skip to content
Opensource internals
  • Posts

Apiserver

Double the Page Size: How etcd LIST Escapes the Selector Death Spiral

Oct 22, 2026 14 min read Jay Hubbert

etcd does not understand label selectors, so the apiserver etcd store doubles its page size on each iteration (capped at maxLimit=10000) when a selector drops too many objects.

KubernetesInternalsApiserver

Read more →

I'm Behind: The Three-Second Grace Period Before the Watch Cache Gives Up

Oct 22, 2026 14 min read Jay Hubbert

The watch cache waits up to 3 seconds on a sync.Cond for a resource version it has not seen, then returns a TooLargeResourceVersion error with a 1-second Retry-After.

KubernetesInternalsApiserver

Read more →

Bookmarks in a Bucket: How the Watch Cache Notifies 100k Watchers That It Is Alive

Oct 22, 2026 14 min read Jay Hubbert

Watch cache bookmarks are bucketed by whole second and popped in bulk so one timer serves 100k watchers; a state machine starves a watcher schedule until its resourceVersion lands.

KubernetesInternalsApiserver

Read more →

Serialize Once, Deliver to a Thousand Watchers: The cachingObject

Oct 22, 2026 14 min read Jay Hubbert

cachingObject memoizes the serialized bytes of a watch event per content type and only deep-copies on the first real mutation, so one encode serves every watcher.

KubernetesInternalsApiserver

Read more →

© 2026 Jay Hubbert · Built with Hugo 0.168.0

RSS ·