OCI NLB Reserved IP Incident: May 5, 2026
This page is a troubleshooting retrospective for the first reserved-IP outage on Lumie's OCI app ingress NLB. The original incident note restored service by switching away from the reserved-IP path. The current Terraform contract in the repo shows that the durable fix was later captured as a provider-side private_ip_id association guard, not as a permanent OCI-only workaround.
Source paths
todo/incidents/trouble/oci-nlb-reserved-ip-incident-2026-05-05.mdlumie-infra/provision/terraform/nlb_0214.tflumie-infra/provision/terraform/outputs.tf
What failed on May 5
The outage started immediately after the app NLB backend pool was changed during the worker-1 removal work in tenancy 0214.
| Check | Result | What it ruled out |
|---|---|---|
External TCP/443 to the NLB reserved public IP | timed out | Public edge path was broken |
| OCI NLB lifecycle and backend health | ACTIVE, backends OK | Control plane and private-side health checks were still green |
| Requests to the NLB internal IP from inside the VCN | succeeded | The NLB object and backend pool still worked privately |
| Requests directly to worker public IPs | succeeded | Traefik and workloads were still serving |
That combination matters: backends were healthy and the private-side path still worked, but the reserved public IP stopped delivering ingress.
What the repo now treats as the lasting fix
The immediate recovery on May 5 was to move traffic off the broken reserved-IP path, first by pointing Cloudflare at a worker public IP and then by rebuilding the NLB with an ephemeral public IP. The later checked-in Terraform contract explains why that A/B test worked:
resource "oci_core_public_ip" "nlb_public_ip_0214" {
lifetime = "RESERVED"
lifecycle {
ignore_changes = [private_ip_id]
}
}
Source: lumie-infra/provision/terraform/nlb_0214.tf
The inline comments in that file say the NLB's reserved public IP must ignore private_ip_id because OCI assigns that field to the NLB's floating private IP, and later Terraform runs can otherwise clear the association and leave TCP/443 black-holed while backend health still looks normal.
Contract drift from the original incident note
The original May 5 note framed the root cause as an OCI reserved-IP data-plane glitch that would need OCI Support. The current repo no longer treats that as the source-of-truth explanation:
nlb_0214.tfrecords a verified May 24, 2026 fix for Terraform-managed reserved IPs.- The same lifecycle guard is also present on the dedicated Teleport NLB in
nlb_teleport_0213.tf. - The fuller root-cause writeup is captured in OCI NLB Reserved IP Incident: May 24, 2026.
This page therefore preserves the May 5 failure signature and recovery path, but not the original "OCI-only glitch" conclusion as the lasting contract.
Lessons that survived
- Treat "backends healthy, public ingress timing out" as an edge-association problem until proven otherwise.
- A reserved-IP versus ephemeral-IP A/B test is a fast way to separate backend problems from public-IP attachment problems.
- Keep a documented bypass path for Cloudflare-to-origin cutover so service can be restored before the root cause is fully confirmed.
Verification
cd lumie-infra/provision/terraform
rg -n "ignore_changes = \\[private_ip_id\\]" nlb_0214.tf
terraform output nlb_public_ip
terraform output nlb_id
Success means the repo still carries the reserved-IP lifecycle guard on the app NLB, and the applied Terraform state still exposes the public IP and NLB OCID operators use during live verification.
Related pages
- OCI NLB Reserved IP Incident: May 24, 2026
- Terraform infrastructure reference