Repository navigation
Roadmap: dhcpcd 11 removes process-per-interface — can our model survive the cutover? #246
Replies: 2 comments
Status check, 2026-08-01: dhcpcd 11 has gone quiet — the risk has recededRe-checked upstream against the open questions above. Short version: nothing What upstream actually looks like today
The The upstream thread's own trajectory points the same way: the last several Effect on this roadmap
One upstream change that is worth our attention
This is a read-before-bump item, not a v11 item: review it when we next DispositionDefer the spike. Re-check upstream at each base-image bump — that is the
Neither is close. Leaving this thread open as the standing record. |
Closed: obsolete since v2.0.0The question this thread asked, whether our process-per-interface model survives dhcpcd 11, no longer applies. Since v2.0.0 (2026-09-11) the plugin runs its own DHCP client library, dhcp-golib, in-process: one Go client per container interface for IPv4 and IPv6, with the DUID and IAID pinned per endpoint by the plugin itself. There is no dhcpcd in the 2.x image, so neither the dhcpcd 11 manager model nor the dhcpcd 10.x sysctl writes on read-only /proc/sys can reach us. The 1.x line, which still ships dhcpcd 10.3.2, is maintenance only and ends at v1.9.0; it gets no base image bump that could pull in dhcpcd 11. Roadmap for the 2.x line: Discussion #906. |
Uh oh!
There was an error while loading. Please reload this page.
TL;DR
We depend on running one
dhcpcdprocess per container interface. dhcpcd 11 removes that model in favour of a single long-lived manager daemon for all interfaces. We're safe today (we pindhcpcd10.x), and the cutover is entirely on our schedule — but we should figure out, deliberately and ahead of time, whether our design can survive on dhcpcd 11, and if so how. This thread collects everything we know, a candidate roadmap, a potential solution, and the one spike that would settle it.Background — why we use dhcpcd at all
The plugin gives each container a real IP from the LAN's DHCP server.
dhcpcdis the client that performs that DHCP/DHCPv6 exchange on the wire, in observe-only mode (--noconfigure): it negotiates the lease and reports it back, and the plugin applies the address to the container via netlink.We migrated from busybox
udhcpc/udhcpc6todhcpcdbecause busybox's DHCPv6 client derives its IAID fromrand()with no override. That meant the one-shot acquisition client and the persistent renewal client drew different IAIDs → the server allocated two different IPv6 addresses → the address the container actually used was never renewed (a latent address-collision bug).dhcpcdlets us pinduid+iaidper interface so both clients share one identity association and one renewable address. busybox simply cannot do this, and the alternatives (odhcp6c, ISC dhclient) were worse, so dhcpcd was the right tool for the requirement.How we use dhcpcd today (the dependency)
Our architecture is one independent
dhcpcdprocess per container interface, per family:duid/iaid;"Spawn an isolated dhcpcd bound to exactly one interface, scoped to one netns" is the design — it's how we get per-container identity and isolation.
The problem — dhcpcd 11
dhcpcd 11 removes the process-per-interface model. The replacement is a single manager daemon that owns all interfaces and protocols, "started as a service in the same way as apache, postfix or dnsmasq." That is the opposite of our one-process-per-interface assumption.
What we know about dhcpcd 11 (from the maintainer's discussion)
Source: NetworkConfiguration/dhcpcd discussion #271
dhcpcd.confstays unchanged — so our per-interfaceduid/iaidconfig is likely still expressible (maintainer's wording).--noconfigure(observe-only) survives — explicitly preserved. This is the mode our whole mediator model depends on, so it's the key green light.manager_onlybranch); no announced GA date. The CLI surface is being reduced and is not final.Who controls the cutover / timeline
We pin the exact package (
dhcpcd=10.3.2-r0), guarded by the weekly apk-pin check. Therefore:Potential solution / candidate roadmap
Shift from "one process per interface" to "one dhcpcd-11 manager per container (per network namespace)." This works with dhcpcd 11's grain:
dhcpcd.conf(duid/iaidunchanged).--noconfigurestill gives us observe-only.Open risks & the spike we need
The design above hinges on unknowns that a small spike would settle before we commit:
duid/iaidpinning still produces one binding per container when expressed indhcpcd.confunder the single-daemon model.--noconfigureunder dhcpcd 11 still leaves all link configuration to us (it's documented as preserved, but it's also undocumented/test-equivalent today).manager_onlybranch but cannot finalize until it stabilizes.Proposed spike: stand up the
manager_onlybranch in a throwaway Alpine container, create a veth in a dedicated network namespace, and try to drive a single dhcpcd-11 manager — scoped to that netns, observe-only, with a pinnedduid/iaid— through an acquire + renew, reading results via the hook. Success criterion: one process, one netns, one pinned identity, one renewable lease, link untouched. That single experiment answers risks 1–4.Adjacent (orthogonal) note
Separately, dhcpcd's habit of writing kernel sysctls on interface setup (
promote_secondaries, IPv6autoconf/accept_ra) fails on hosts where/proc/sysis mounted read-only — which breaks DHCP entirely there. That's a dhcpcd 10.x bug we should fix now, independent of the v11 question, but it's the same underlying theme: dhcpcd is an opinionated interface-manager and we use it as a passive mediator. Tracked separately.What we want to clarify here
All reactions