Von ExternalDNS veröffentlichte Zonen und Recordsets (ein DNSEndpoint pro Recordset).
Go ExternalDNSopenkeel-designate
Das Modul
OpenKeel implementation in Go of OpenStack Designate (DNS as a Service), generated from the reverse-specification of branch stable/2026.2 by the generate-go-from-spec skill. It replaces the Python service without its clients noticing (python-designateclient and its OSC plugin, Neutron's DNS driver, Heat's OS::Designate::*, Skyline): same 78 routes, status codes, {code, type, message, request_id} error bodies and policies, writes answered 202 PENDING. What is reproduced and what differs is in docs/CONFORMANCE.md; the security checklist is in docs/SECURITY.md.
DNS publication is Kubernetes-native: zones are created through the DNS server's API (PowerDNS), recordsets become ExternalDNSDNSEndpoint custom resources, and a reconciler reports ACTIVE/ERROR by querying the authoritative servers. designate-worker, designate-producer and designate-mdns are replaced by that reconciler; designate-central runs in-process (no RPC).
Go module: github.com/openkeel/openkeel-designate
Binaries (one image):
designate-api: API on port 9001, health and metrics on 9090, -migrate for the migration Job;
designate-reconciler: pushes zones (PowerDNS API + DNSEndpoints), polls the servers, purges deleted zones; one active replica (Lease);
designate-sink: Nova and Neutron notifications to managed records (optional, RabbitMQ);
designate-manage: database sync, pool update --file pools.yaml, pool show-config.
Configuration: YAML, see config/config.example.yaml
Setting up a development environment, the database and the tests: docs/GETTING-STARTED.md
Database schema, migrations and upgrades: docs/DATABASE.md
Auszug aus openkeel-designate/README.md (auf Englisch).
REST-API
78 Operationen der Original-REST-API (Routen und Body-Aktionen) und ihr Status in OpenKeel.
Die funktionalen API-Austausche von Python-Designate werden gegen den Go-Dienst wiedergegeben, mit Algorithmus-Vektoren und durch das Replay abgedeckten Client-Erwartungen.
Replay aufgezeichneter Austausche
E2E-Replay der funktionalen API-Tests
548 Austausche aus 299 funktionalen Python-API-Tests liefern denselben Status und Body.
Ausführung
go test -tags e2e ./test/e2e/..., E2E_MYSQL_DSN für MariaDB 11.4; E2E_STRICT=1 besteht mit 32 bekannten Unterschieden.
Letztes Ergebnis 516 / 548 identisch auf beiden Engines (das Python-Original erreicht beim Replay 501 / 548).
Quelle: openkeel-designate/docs/CONFORMANCE.md
Unit- und Golden Tests
Algorithmus-Vektoren
SOA-Seriennummern, Zonen- und Record-Status, Poll-Ergebnisse und der Import von Zonendateien werden wie in Python berechnet.
Ausführung
go test ./... in internal/central und internal/zonefile.
Letztes Ergebnis 263 / 263.
Quelle: openkeel-designate/docs/CONFORMANCE.md
Client-Vertrag
Client-Erwartungen
Namensfilter, links.next, Zählungen, Designate-Header, 202 PENDING, 404 bei gelöschten Zonen, 400 für verwaltete Records, PTR-Aktualisierungen wie von den Clients erwartet.
Ausführung
Durch das Replay abgedeckt. Echte designateclient/OSC, Neutron, Heat, Skyline und designate-tempest-plugin nicht ausgeführt.
Letztes Ergebnis Alle konstruktionsbedingt erfüllt und durch das Replay abgedeckt.
Quelle: openkeel-designate/docs/CONFORMANCE.md
Unit- und Golden Tests
Reconciler und Back-Ends
Zonen-Lebenszyklus gegen einen DNS-Server, die PowerDNS-Zonen-API, der ExternalDNS-Writer und die Benachrichtigungssenke verhalten sich wie spezifiziert.
Ausführung
internal/reconciler mit einem Fake-DNS-Server, internal/backend, internal/sink.
Letztes Ergebnis Bestanden.
Quelle: openkeel-designate/docs/CONFORMANCE.md
Im Rewrite ausgelassen
Designate behält seine 78 API-Operationen, veröffentlicht Einträge aber über ExternalDNS und die APIs der DNS-Anbieter; damit entfallen mdns, Pool-Ziele im BIND-Stil und die RPC-Worker.
Von der Cloud-Native-Plattform übernommen
mdns, AXFR/NOTIFY und Pool-Ziele
Übernommen von ExternalDNS
Warum es ausgelassen wurde
Zonen werden über die API des DNS-Servers angelegt (PowerDNS, Route 53, Azure, Google, Cloudflare), und Recordsets werden zu DNSEndpoints, die ExternalDNS veröffentlicht.
Warum die Lösung nicht beeinträchtigt ist
Der Zonenstatus wird durch Abfrage der autoritativen Server bestätigt. SOA-Seriennummer und ausgelieferte Nameserver gehören dem Anbieter, und TSIG-Schlüssel dienen nur zur Information.
Quelle: openkeel-designate/docs/CONFORMANCE.md
Vereinfachte interne Mechanik
RPC für central, worker, producer und tooz-Sperren
Übernommen von Kubernetes Leases
Warum es ausgelassen wurde
Central läuft im Prozess mit einer Transaktion pro Anfrage; ein einziger Reconciler, der einen Lease hält, ersetzt worker, producer und mdns.
Warum die Lösung nicht beeinträchtigt ist
Gleiches API-Verhalten, einschließlich 202 PENDING bei Schreibzugriffen; ein MessagingTimeout 504 kann nicht mehr auftreten.
Quelle: openkeel-designate/docs/CONFORMANCE.md
Von der Cloud-Native-Plattform übernommen
SPF-, SSHFP-, CAA-, CERT-, HTTPS- und SVCB-Einträge
Übernommen von ExternalDNS
Warum es ausgelassen wurde
ExternalDNS kann diese Typen nicht veröffentlichen.
Warum die Lösung nicht beeinträchtigt ist
Sie werden mit dem eigenen 400 von Designate, 'not a supported record type', abgewiesen. Betreiber können sie für ein Backend aktivieren, das sie veröffentlicht.
Quelle: openkeel-designate/docs/CONFORMANCE.md
Von der Cloud-Native-Plattform übernommen
Sekundäre Zonen bei Cloud-DNS-Anbietern
Übernommen von ExternalDNS
Warum es ausgelassen wurde
ExternalDNS unterstützt keine sekundären Zonen; nur ein Backend mit sekundären Zonen (PowerDNS) kann sie abrufen.
Warum die Lösung nicht beeinträchtigt ist
Sekundäre Zonen funktionieren mit PowerDNS; bei Route 53, Azure, Cloud DNS oder Cloudflare gehen sie in ERROR.
Quelle: openkeel-designate/docs/CONFORMANCE.md
Hier ist nur aufgeführt, was bewusst ausgelassen wurde; noch nicht erledigte Arbeit steht in den Known gaps der docs/CONFORMANCE.md des Moduls. Alle Module
Designate-Interaktionen
Dienstansicht, vom Diagramm-Skill aus dem OpenKeel-Modell generiert.