Incident Library

IL-0468 UC Berkeley · 2017-03-20kubernetesgcp

New JupyterHub student pods stuck Pending on MaxVolumeCount after a memory limit cut with node size unchanged

On 18 March 2017 at 16:30 the memory limit of each student server on UC Berkeley's JupyterHub on Google Container Engine was cut from 2G to 1G to use resources better. The nodes kept their size of 26G RAM, and many of them were cordoned and slowly decommissioned over the following days. As a result, the nodes reached the limit on how many disks Kubernetes would place on one node, and from some time early on 20 March new student pods stayed Pending with the scheduler reason MaxVolumeCount. Google Compute Engine itself handles more than 16 disks per node, which the team had checked, but Kubernetes did not (kubernetes/kubernetes issue 24317).

At 13:03 the team copied the instance template that Google Container Engine uses, changed the copy to spawn smaller n1-highmem-2 nodes instead of n1-highmem-4, switched the managed instance group to the new template and set it to grow by 30 nodes of about 12 students each. This left students whose servers worked undisturbed. `populate.bash` was run so student pods would start on time on the new nodes, and at 13:04 the simple autoscaler was stopped in case the mixed state of the nodes confused it. By 13:11 the new nodes were online and pods left Pending.

Because those pods started after JupyterHub's 5-minute timeout, JupyterHub lost track of them and users got 'redirected too many times'; admins stopped and started affected user pods from the control panel as users reported it. At 14:23 the hub and proxy pods were restarted, which fixed most users' state, though some requests still failed with a 599 timeout. Admins kept restarting individual users' pods by hand over the following days.

Severity
–
Scope
Some new student servers on the JupyterHub could not start and returned 500 errors from early on 20 March 2017 until about 13:00, followed by 'redirected too many times' errors, some 599 timeouts and manual restarts over the following days
Users affected
Students starting new servers on the JupyterHub
Region
–
Time to detect
–
Time to resolve
–

Symptoms

On 20 March 2017, from some time early in the day until about 13:00, some new student servers on UC Berkeley's JupyterHub stayed in Pending forever and the students got 500 errors that kept them from logging in.

At 12:44 the 500 errors were judged widespread rather than isolated. At 12:53 `kubectl describe pod` on an affected student's pod showed it Pending with "pod failed to fit in any node fit failure on node (XX): MaxVolumeCount", and all new student servers were Pending the same way. A search led to kubernetes/kubernetes issue 24317: Google Compute Engine can handle more than 16 disks per node, which the team had checked before deploying, but Kubernetes itself still could not.

After new nodes came online at 13:11 and the pods left Pending, students hit the error 'redirected too many times'. The pods had started later than the 5 minutes JupyterHub waits for a pod before giving up, so JupyterHub did not know they existed and its state no longer matched the cluster. After the hub and proxy pods were restarted at 14:23, some requests still failed with a 599 timeout, less often than in an earlier proxy incident.

Symptom Pods PendingHigh error rate

Root cause

Trigger
On 18 March at 16:30 the RAM per student was reduced from 2G to 1G to save resources while the nodes kept the same size of 26G RAM, and as a result the nodes hit the Google Cloud the limit on the number of disks per node.

Detection

New student servers reported a 500 error that kept students from logging in. At 12:44 this was judged widespread, and at 12:53 `kubectl describe pod` showed the pods Pending on MaxVolumeCount.

Remediation

Action items

Lessons

–

Sources

References

Related cases

Check your cluster for this

kubegap audits a Kubernetes cluster for conditions like the ones in this case, Container memory limit, Cloud block storage, Node pool among them, read-only, from Claude Code or Codex. Its checks cite public reports like this one.

For AI tools and scripts

The API needs no key. The MCP server offers search_incidents, get_incident, list_incidents, get_topic and vocab; both are explained on API and MCP.