Skip to content

Implement side-by-side DNS for unbound and hickory #8677

@aarongable

Description

@aarongable

We intend to replace unbound with hickory, but stakeholders have expressed concerns about compatibility. To facilitate a fully safe and high-confidence deployment, it would be great to be able to run unbound and hickory side-by-side, with the hickory results considered non-authoritative and merely log any instances in which we get different results.

Proposed plan:

  • Add DNSProviderExperimental to vacfg.Common, mirroring the existing DNSProvider
  • In boulder-va/main.go, add a call to bdns.StartDynamicProvider(c.VA.DNSProviderExperimental, ...)
  • Add a serversExperimental field to bdns.imlp, and populate it with the server provider constructed above (via bdns.New)
  • In bnds.impl.exchangeOne, fire the same request to both servers and serversExperimental. In the main goroutine, only wait for the authoritative result. In a background goroutine, wait for both results and compare them.
  • Add some extra metrics to record whether the result was the same, and some (sampled?) logging to help debug.

Alternatives considered:

  • Do this at the VA level, instead of the bdns level, by making two separate calls to bdns.New. This has the advantage of giving us access to higher-level information, i.e. we could log whether or not the validation result matched, rather than logging whether the exact records match. But it has the disadvantage of requiring much more surgery, as we'd have to do those comparisons at multiple different sites (A, AAAA, TXT, CAA). And it would require some surgery to ensure that multiple calls to bdns.New don't result in errors registering identical metrics.
  • Do this at the RA level, with multiple sets of VAs, each of which is only talking to either unbound or hickory. This would require more coordination at the SRE layer, and probably require 1-to-1 binding of VAs to resolvers, and we don't want to block this project on that work.

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions