Zum Inhalt springen

DNS

Composia verwaltet DNS-Records für Dienste, die network.dns deklarieren. DNS-Updates laufen als controller-seitige Aufgaben.

Wie es funktioniert

Wenn ein Dienst deployed wird oder ein DNS-Update manuell ausgelöst wird, erstellt der Controller eine dns_update-Aufgabe. Der Controller-Worker führt sie aus:

  1. Liest die Dienst-Meta beim in der Aufgabe aufgezeichneten Repo-Revision.
  2. Erstellt die gewünschten DNS-Records aus network.dns.
  3. Synchronisiert die Records mit dem DNS-Provider.

Provider-Konfiguration

Konfiguriere mindestens einen DNS-Provider in der Controller-Konfiguration. Die Provider-Anmeldeinformationen und Zonenliste sind global:

controller:
  dns:
    cloudflare:
      api_token: "REPLACE"
      zones:
        - "example.com"
        - "other.com"

Fünf Provider werden unterstützt. Jeder hat seine eigenen Anmeldeschlüssel und alle teilen ein zones-Feld, das die verwalteten Domain-Zonen auflistet:

ProviderSchlüsselpräfixAnmeldeschlüssel
cloudflaredns.cloudflareapi_token, api_token_file
alidnsdns.alidnsaccess_key_id, access_key_secret, region_id, optional security_token
dnspoddns.dnspodsecret_id, secret_key, region, optional session_token
route53dns.route53access_key_id, secret_access_key, region, optional session_token, profile, hosted_zone_id
huaweiclouddns.huaweicloudaccess_key_id, secret_access_key, region_id

Jedes Anmeldefeld hat eine entsprechende _file-Variante zum Lesen aus einer Datei (zum Beispiel api_token_file).

Dienst-DNS-Deklaration

Deklariere DNS-Einstellungen in der composia-meta.yaml des Dienstes:

network:
  dns:
    - provider: cloudflare
      hostname: app.example.com
      record_type: A
      value: 203.0.113.10
      proxied: true
      ttl: 120
      comment: "Verwaltet von Composia"
    - provider: cloudflare
      hostname: app.example.com
      record_type: AAAA
      value: 2001:db8::10
SchlüsselTypErforderlichBeschreibung
providerstringNeincloudflare, alidns, dnspod, route53 oder huaweicloud. Bei eindeutiger Zone kann der Provider automatisch ermittelt werden.
hostnamestringJaDNS-Hostname. Die Zone wird aus der konfigurierten Zonenliste abgeglichen.
record_typestringNeinA, AAAA oder CNAME. Wenn leer, wird der Record-Typ aus dem Wert oder den Node-Adressen abgeleitet.
valuestringNeinExpliziter DNS-Record-Wert. Wenn leer, leitet Composia den Wert vom Ziel-Node ab.
proxiedboolNeinAktiviert den Cloudflare-Proxy. Wird nur von Cloudflare unterstützt.
ttluint32NeinDNS-TTL in Sekunden.
commentstringNeinDNS-Record-Kommentar. Wird nur von Cloudflare unterstützt.

Ein Dienst kann beliebig viele DNS-Einträge definieren. Derselbe Hostname darf unterschiedliche Typen wie A und AAAA verwenden; doppelte Kombinationen aus Hostname und Record-Typ sowie CNAME zusammen mit anderen Typen werden abgelehnt.

Record-Auflösung

Mit einem expliziten Wert

Wenn value gesetzt ist, verwendet Composia ihn direkt. Wenn es eine IP-Adresse ist, wird der Record-Typ abgeleitet: IPv4 wird zu A, IPv6 wird zu AAAA. Wenn es ein Hostname ist, muss der Record-Typ CNAME sein (oder leer, was ebenfalls zu CNAME aufgelöst wird).

network:
  dns:
    - provider: cloudflare
      hostname: app.example.com
      value: 203.0.113.10

Von Node-Adressen

Wenn value leer ist, verwendet Composia die public_ipv4 und public_ipv6 des Ziel-Nodes aus der Controller-Konfiguration:

controller:
  nodes:
    - id: "main"
      public_ipv4: "203.0.113.10"
      public_ipv6: "2001:db8::10"

Bei leerem record_type werden sowohl A- als auch AAAA-Records erstellt, wenn der Node beide Adressen hat. Wenn record_type A ist, wird nur die IPv4-Adresse verwendet. Wenn record_type AAAA ist, wird nur die IPv6-Adresse verwendet.

Dienste, die mehr als einen Node anvisieren, müssen value explizit setzen. Ein leeres value mit mehreren Ziel-Nodes erzeugt einen Fehler.

DNS-Updates auslösen

DNS-Records werden während des Deploy-Aufgabenablaufs erstellt oder aktualisiert. Du kannst auch ein eigenständiges DNS-Update über die Web-UI oder CLI auslösen:

composia service dns-update my-app

Dies erstellt eine dns_update-Aufgabe. Das Aufgabenprotokoll zeigt die Zonenauflösung, Record-Operationen und das Endergebnis.

Cloudflare-Optionen

Wenn der Provider cloudflare ist, werden proxied und comment nach der Record-Erstellung angewendet. Composia ruft die Cloudflare-API auf, um jeden DNS-Record mit dem angeforderten Proxy-Status und Kommentar zu patchen.

Nicht-Cloudflare-Provider unterstützen diese Optionen nicht. Das Setzen von proxied oder comment mit einem anderen Provider führt zum Fehlschlag des DNS-Updates.

Zonenabgleich

Composia gleicht den Dienst-Hostnamen mit den konfigurierten Zonen ab. Zonen werden von der längsten zur kürzesten Übereinstimmung durchprobiert. Zum Beispiel, mit zones: ["example.com.", "sub.example.com."], passt der Hostname app.sub.example.com zuerst zu sub.example.com..

Wenn dieselbe Zone für mehrere Provider konfiguriert ist, verweigert der Controller den Start. provider kann nur entfallen, wenn die präziseste Zone des Hostnamens genau einem Provider zugeordnet ist.

Wenn keine Zone zum Hostnamen passt, schlägt das DNS-Update fehl.

Bereinigung veralteter Records

Die DNS-Synchronisation verwaltet genau drei Record-Typen pro Hostname: A, AAAA und CNAME. Jeder konfigurierte Record-Typ, der nicht im Sollzustand vorhanden ist, wird gelöscht, bevor neue Records gesetzt werden. Wenn zum Beispiel ein Dienst zuvor record_type: A hatte und zu record_type: CNAME wechselt, wird der alte A-Record entfernt und ein neuer CNAME-Record erstellt.

Das Ändern des Hostnamens eines Dienstes bereinigt keine Records für den alten Hostnamen. Wenn du app.example.com in api.example.com umbenennst, bleiben die Records für app.example.com im DNS-Provider, bis du sie manuell entfernst.

Zuletzt aktualisiert am • alexma233