IL-0233 Nebius · 2025-03-13kubernetesnetworking
A VPC control plane release broke IP alias routes in Nebius eu-west1, and Managed Kubernetes pods lost connectivity
Pods of Nebius Managed Services for Kubernetes depend on the IP alias (prefix delegation) mechanism of virtual machine network interfaces. A host component of the VPC control plane sends, receives and processes BGP messages and announces and withdraws routes. A bug in that component, in production since a much earlier release and unknown to the developers, made it partly ignore route distinguishers, so some IP alias announcements that should have been kept apart were merged into one, and one withdrawal could cancel two different announcements. The release on 13 March changed route distinguisher values for a new feature, and only the update messages of Managed Kubernetes pods changed. A sequence of two announcements and one withdrawal then left the data plane with no active route, and packets for those IP aliases were dropped.
The team noticed the problem at 15:13 UTC and started a rollback at 15:30 UTC, but rolling back produced the same sequence of update messages with the route distinguishers reversed, so it did not help. At 16:41 UTC the team found that restarting the host VPC component on one node fixed that node and began restarting it on every affected node one at a time. The root cause was found at 17:36 UTC; once the team was sure the restart alone fixed the problem, it restarted the component on the remaining nodes in parallel from 17:57 UTC, and the impact was fully mitigated at 18:11 UTC. The bug needed two conditions to show: an IP alias had to exist when the release changed route distinguishers, and the node with the virtual machine sending to that IP alias had to be updated before the node with the receiving virtual machine. The permanent e2e test virtual machines on the testing installation met only the first condition, and none of them ran on canary nodes.
- Severity
- –
- Scope
- Practically every pod of Managed Services for Kubernetes in eu-west1 lost connectivity for at least some time between 13:36 and 18:11 UTC
- Users affected
- Clients running Managed Services for Kubernetes in eu-west1
- Region
- eu-west1
- Time to detect
- 1h 37m
- Time to resolve
- 4h 35m
Symptoms
On 13 March 2025 practically every pod of Nebius Managed Services for Kubernetes in the eu-west1 region lost network connectivity for at least some time between 13:36 and 18:11 UTC. Packets for the affected IP alias routes were not processed by the data plane. The eu-north1 region was not affected.
The Nebius team became aware of the problem at 15:13 UTC, about an hour and a half after the canary deployment of a VPC release started. Rolling the release back at 15:30 UTC did not help, which was clear by 16:00 UTC. At 16:20 UTC the team tied the problem to IP aliases without yet understanding it, and at 16:41 UTC found that restarting the VPC host component on a problematic node fixed that node. Two technical metrics, the number of routes and the number of drops, reacted to the problem, but alerting on technical metrics deviating from their normal values was insufficient.
Symptom Network unreachable
Root cause
Root cause Software defect
- Trigger
- A release of a VPC control plane component in eu-west1, deployed to canaries from 13:36 UTC and to all other nodes from 14:35 UTC, changed route distinguisher values for a new feature. The change made a long-standing bug in the handling of route announcements take effect for the update messages of Managed Kubernetes pods.
Detection
–
Remediation
- Restarted the host VPC component on the affected nodes one node at a time
- Restarted the host VPC component on the remaining nodes in parallel once the restart was known to fix the problem
Action items
- Fix the bug in the VPC host component itself
- Add an alert on a diverging number of routes
- Add an alert on the number of drops in the data plane
- Develop a way to reset endpoints without restarting the host VPC component
- Move the VPC's persistent e2e test virtual machines to canary hosts
- Add persistent e2e tests for Managed Services for Kubernetes
- Run e2e tests more often
- Add a deployment stage in which non-critical internal services receive updates first
Lessons
The failure needed both an existing IP alias at release time and a particular order of node updates, and neither the testing installation nor the canaries met both, so neither caught it. Missing alerts on technical metrics that deviate from normal, here the number of routes and the number of drops, made the response much slower.
Sources
Related cases
IL-0347About 25% of Scaleway FR-PAR-1 hypervisors lost VPC connectivity when both VPC BGP route reflectors got stuckScaleway · 2024same root cause · shared BGP routing, Network control plane (SDN)
IL-0222Google Cloud US regions had heavy packet loss and some went unreachable after the network control plane was descheduledGoogle Cloud · 2019same root cause · shared BGP routing, Network control plane (SDN)
IL-0529New Google Cloud VMs and other instances came up without network connectivity in all zones after VPC controllers stoppedGoogle Cloud · 2024same root cause · shared Network control plane (SDN)
IL-0342DigitalOcean's AMS3, LON1 and SFO2 data centers lost Internet connectivity in repeated waves as edge routers failedDigitalOcean · 2023same root cause · shared BGP routing
IL-0359Queries to Gandi LiveDNS timed out when two crashed anycast DNS nodes kept announcing all three name server addressesGandi · 2020same root cause · shared BGP routing
IL-0396New or live-migrated GCE instances, VPN tunnels and network load balancers were unreachable on public IPs for over 2hGoogle Cloud · 2017same root cause · shared Network control plane (SDN)
Check your cluster for this
For AI tools and scripts
- This case as JSON: https://incidentlib-api.benchlet.com/cases/IL-0233
- The cases most like it: https://incidentlib-api.benchlet.com/cases/IL-0233/similar
- MCP server (Streamable HTTP, no key):
https://incidentlib-mcp.benchlet.com/mcp
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.