Skip to content

Private service routes can fail silently after a roll or on IPv4 #986

Open

Description

@ecv

Private service routes from #851 have follow-ups that did not block the review. Each can leave a service unreachable with no error, or keep access longer than intended.

  1. A router binary that rolls before the agent on a node cannot program service routes until the agent reloads.
  2. Some services stay unreachable with no error and no metric, because a missing next hop falls back to the old behavior.
  3. A pod with any default route on another link loses its VPC default route.
  4. Persistent access has no limit on who may set it.

Done when each is fixed, or documented with its roll order or trust boundary. The detail is in the first comment.

Related to #851

Activity

  1. added
    tech-debtInternal quality/maintenance: unwind shortcuts, config drift, overdue upgrades, fork/dep hygiene
    on Oct 22, 2026
  2. ecv commented on Oct 22, 2026

    @ecv
    ContributorAuthor

    Detail, as of #851 at d67c997:

    1. serviceroutemap.OpenPinned now fails hard if service_peer_table is not pinned, and the pin exists only after the new usid program loads. Document the roll order, or treat a missing pin as the old fallback. Nothing tests the missing-pin case.
    2. attachmentNextHop returns nil on a family mismatch or a missing PodSubnet, and SetPeer(nil) falls back to dest_addr. IPv4 virtual services and attachments with several subnets stay unreachable, and the new alert counts only programming errors. Return an error or count a metric.
    3. In cni/netns.go, any default route on another link suppresses the VPC default, including blackhole, unreachable and ECMP defaults with LinkIndex 0. Require a unicast default with LinkIndex > 0.
    4. ServiceRouteAuthorization.persistent drops the node-side deadline backstop. Only RBAC on ServiceRoutePolicy limits who sets it. State that only the network control plane writes these.
    5. A router restart while the API is down likely leaves services gated off, since the policy-enabled gate is rebuilt from the API. TestPersistentPathSurvivesControllerOutageAndWithdraws covers only a running router.
    6. The alert's runbook_url anchor #galacticservicerouteprogrammingfailing does not exist in the infra galactic runbook.
  3. ecv commented on Oct 22, 2026

    @ecv
    ContributorAuthor

    From #851 at a28836b: when a pod's veth disappears, recoverableEntries returns empty entries, repairDesired closes the node's policy gate, and every service route on that node is off until the whole policy is rebuilt. Pod churn triggers this. Withdraw only the affected intent's entries. Separately, clearWithdrawnAdvertisement clears the attachment's node, interfaces and PodSubnet. A cache-lag NotFound after a fast delete and recreate makes that status flap until the next reconcile.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    tech-debtInternal quality/maintenance: unwind shortcuts, config drift, overdue upgrades, fork/dep hygiene

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions