Incident Library

IL-0473 Jenkins project · 2023-07-07kubernetesazurenetworking

Jenkins infrastructure went fully down after a pod IP range fix deleted every AKS node pool and could not recreate them

The Jenkins infrastructure team runs most public jenkins.io services on a public Kubernetes cluster in Azure. On 7 July 2023, after a successful upgrade of that cluster to 1.25 under help desk ticket 3582, services in the cluster could no longer reach the LDAP service, because the pods' originating IP was in a different range than before and IP restrictions blocked it. At 10:55 UTC the team deployed a fix, Azure PR 431, to give the pods a proper set of IP ranges. The change removed all node pools, the virtual machines that ran the containers, and failed to re-create them, which took down every service in the cluster from 11:05 UTC.

The node pools could not be re-created because of an address overlap the team had not known about. The cluster had been created with the 10.244.0.0/16 virtual network and a 10.245.0.0/24 subnet, but 10.244.0.0/24 is the default pod CIDR in Azure when the kubenet network is used to support IPv6 instead of the default CNI. The team had assumed the two ranges could communicate and deployed an invalid setup. From 11:16 to 13:16 UTC the team built the cluster again from scratch with a fixed network setup, and once a custom pod CIDR in a separate range was set, everything worked. Deleting the original cluster had also removed its node resource group and the public IPs in it, so the services came back on new IP addresses and DNS records. At 15:17 UTC a pull request recorded the manual rebuild, including the IP setup, in code, and at 15:25 UTC all services were back to normal.

Severity
–
Scope
Complete downtime of accounts.jenkins.io, fallback.get.jenkins.io, get.jenkins.io, incrementals.jenkins.io, javadoc.jenkins.io, plugin-health.jenkins.io, plugin-site-issues.jenkins.io, plugins.origin.jenkins.io, plugins.jenkins.io, rating.jenkins.io, repo.azure.jenkins.io, reports.jenkins.io, stories.jenkins.io, uplink.jenkins.io, weekly.ci.jenkins.io and www.origin.jenkins.io, and of the internal ldap.jenkins.io and the previews of *.jenkins.io pull requests on infra.ci.jenkins.io; partial or complete disruption of ci.jenkins.io, infra.ci.jenkins.io, issues.jenkins.io, plugins.jenkins.io, repo.jenkins-ci.org and www.jenkins.io; the public IPs of these services changed
Users affected
Jenkins users and contributors, including users behind corporate firewalls with an allow-list
Region
–
Time to detect
–
Time to resolve
4h 20m

Symptoms

On 7 July 2023 from 11:05 to 15:25 UTC many public Jenkins infrastructure services were completely down, including get.jenkins.io, plugins.jenkins.io, accounts.jenkins.io, javadoc.jenkins.io and incrementals.jenkins.io, while ci.jenkins.io, issues.jenkins.io, repo.jenkins-ci.org and www.jenkins.io were partly or completely disrupted.

It started at 10:30 UTC, after a successful upgrade of the public Kubernetes cluster in Azure to 1.25: services inside the cluster, such as accounts.jenkins.io, could not reach the LDAP service. The pods' originating IP was now in a different range than before, and IP restrictions blocked the requests.

The fix deployed at 10:55 UTC to set a proper set of pod IP ranges removed all the node pools and failed to re-create them, so every service in the cluster went down. The re-creation failed because the cluster's virtual network, 10.244.0.0/16, overlapped 10.244.0.0/24, the default pod CIDR in Azure when kubenet is used.

When the original cluster was deleted, its public IP addresses were removed with it, so the services came back on new addresses, 20.7.178.24 and 2603:1030:408:5::15a, and users behind corporate networks had to update their DNS, proxy and firewall settings.

Symptom Network unreachableResources deletedCluster or node provisioning stallService outage

Root cause

Trigger
After the upgrade to Kubernetes 1.25 changed the range of the pods' originating IP and LDAP access was blocked, a fix (Azure PR 431) deployed at 10:55 UTC to set a proper set of pod IP ranges removed all node pools of the cluster.

Detection

After the upgrade, at 10:30 UTC, the team noticed that services inside the cluster, such as accounts.jenkins.io, could not reach the LDAP service.

Remediation

Action items

Lessons

The team said that changing one node pool at a time would have shown the problem after the first pool and avoided a full outage, and that the public IPs should change as little as possible because users behind corporate firewalls with allow-lists depend on them. The team also noted that it could rebuild, in under 4 hours, the cluster that hosts almost all public services.

Sources

Related cases

Check your cluster for this

kubegap audits a Kubernetes cluster for conditions like the ones in this case, Node pool, CNI plugin, Cloud load balancer 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.