Automatisierung von DNS-Updates mit Consul-Terraform-Sync, Kubernetes Consul Sync und Cloudflare unter Verwendung von Service-Anmerkungen


Bicycle

In dynamischen Kubernetes-Umgebungen kann das Verwalten von DNS-Einträgen eine Herausforderung sein. Wenn Dienste skaliert, neu bereitgestellt oder IP-Adressen geändert werden, ist es entscheidend, dass DNS-Einträge aktuell bleiben, um die Verfügbarkeit der Dienste sicherzustellen. Die Automatisierung dieses Prozesses mit Consul-Terraform-Sync, Kubernetes-basiertem Consul Sync und Cloudflare unter Nutzung von Kubernetes-Service-Anmerkungen zur Definition von Hostnamen ist eine effiziente Möglichkeit, diese Komplexität zu bewältigen.

Dieser Artikel führt Sie durch die Automatisierung von DNS-Updates unter Verwendung von Kubernetes Service-Anmerkungen zur Hostnamendefinition, kombiniert mit Consul-Terraform-Sync und Cloudflare.

Überblick über die Werkzeuge

  1. Consul-Terraform-Sync (CTS): Automatisiert Infrastruktur-Updates basierend auf Änderungen im Dienstkatalog von Consul und nutzt Terraform zur Verwaltung externer Dienste wie DNS.
  2. Consul Service Sync: Überwacht Kubernetes-Dienste und synchronisiert sie mit Consul, um sicherzustellen, dass der Katalog von Consul den aktuellen Zustand des Clusters widerspiegelt.
  3. Cloudflare: Ein global verteilter DNS-Anbieter, der APIs zur Verwaltung von DNS-Einträgen anbietet.
  4. Kubernetes Service-Anmerkungen: Ermöglichen die Definition benutzerdefinierter Hostnamen innerhalb der Servicemetadata, die wir zur Automatisierung von DNS-Eintrag-Updates nutzen werden.

Die Verwendung von Kubernetes-Service-Anmerkungen zur Definition von Hostnamen bietet eine einfache Möglichkeit, Dienste dynamisch mit DNS-Einträgen zu verknüpfen. Die Anmerkungen dienen als Quelle für die Dienstnamen in DNS-Updates und stellen sicher, dass die DNS-Einträge aktuell bleiben, während Dienste skaliert oder neu bereitgestellt werden.

Architekturübersicht

  1. Kubernetes-Dienste: Anwendungen laufen in Kubernetes, wo Service-Anmerkungen benutzerdefinierte Hostnamen für DNS-Einträge definieren.
  2. Consul Sync: Consul Sync überwacht die Kubernetes-Dienste und registriert deren Metadaten (einschließlich Anmerkungen) in Consul.
  3. Consul-Terraform-Sync (CTS): Überwacht Änderungen im Consul-Katalog und löst Terraform-Ausführungen aus, um DNS-Einträge in Cloudflare zu aktualisieren.
  4. Cloudflare DNS: Terraform aktualisiert DNS-Einträge in Cloudflare, wann immer sich eine Dienst-IP oder ein Hostname ändert, und stellt sicher, dass DNS mit dem tatsächlichen Zustand des Kubernetes-Clusters synchron bleibt.

Verwendung von Kubernetes-Service-Anmerkungen für Hostdefinitions

Kubernetes-Dienste ermöglichen es, benutzerdefinierte Anmerkungen anzuhängen, um zusätzliche Metadaten zu beschreiben. Wir können DNS-Hostnamen innerhalb dieser Anmerkungen definieren, die später von CTS verwendet werden, um die DNS-Einträge in Cloudflare zu aktualisieren.

Beispiel eines Dienstes mit benutzerdefinierten Anmerkungen:

 1apiVersion: v1
 2kind: Service
 3metadata:
 4  name: web-app
 5  annotations:
 6    consul.hashicorp.com/service-sync: "true"
 7    consul.hashicorp.com/service-tags: dns.hostname=`web.example.com`
 8spec:
 9  selector:
10    app: web-app
11  ports:
12    - protocol: TCP
13      port: 8080

In diesem Beispiel wird die Anmerkung dns.hostname verwendet, um den DNS-Namen (web.example.com) zu definieren, der in Cloudflare registriert und aktualisiert werden soll. Die Anmerkung consul.hashicorp.com/service-sync weist Consul an, diesen Dienst mit dem Consul-Katalog zu synchronisieren. Und consul.hashicorp.com/service-tags spezifiziert die Metadaten-Tags, die in Consul registriert werden sollen und die innerhalb der Consul-Terraform-Sync-Konfiguration verwendet werden können.

Einrichtung von Consul-Terraform-Sync (CTS)

Jetzt konfigurieren Sie Consul-Terraform-Sync (CTS), um DNS-Updates in Cloudflare zu automatisieren, wann immer sich eine Dienst-IP oder ein Hostname ändert. CTS wird den Consul-Katalog auf Änderungen überwachen und Terraform-Ausführungen auslösen, um die DNS-Einträge aktuell zu halten.

Beispiel für eine CTS-Konfiguration:

 1consul {
 2  address = "http://localhost:8500"
 3}
 4
 5vault {
 6    address = "http://localhost:8200"
 7}
 8
 9driver "terraform" {
10  log         = false
11  persist_log = false
12
13  backend "consul" {
14    gzip = true
15  }
16  required_providers {
17    cloudflare = {
18      source  = "cloudflare/cloudflare"
19      version = "~> 4.0"
20    }
21  }
22}
23
24terraform_provider "cloudflare" {
25    api_token = "{{ with secret \"kv/network/cloudflare\" }}{{ .Data.data.api_token }}{{ end }}"
26}
27
28task {
29  name       = "cloudflare-dns-update"
30  description = "Automatisches Update der Cloudflare DNS-Einträge basierend auf den Dienstanmerkungen"
31  source     = "./k8s-cloudflare"
32  providers  = ["cloudflare"]
33
34  condition "services" {
35    regexp = ".*"
36    filter = "Service.Meta[\"external-source\"] == \"kubernetes\""
37  }
38}

Diese Konfiguration weist CTS an, alle Dienste zu überwachen, die mit dem Kubernetes Consul Sync im Service-Katalog von Consul verbunden sind. Wenn sich die IP oder der Hostname ändert, wird CTS Terraform auslösen, um den entsprechenden DNS-Eintrag in Cloudflare zu aktualisieren. Die tatsächliche Konfiguration des Anbieters muss innerhalb der CTS-Konfiguration angewendet werden, da wir das API-Token nicht im Terraform-Code offenlegen möchten. Außerdem können wir Vault verwenden, um das API-Token sicher zu speichern und während der CTS-Ausführung abzurufen. CTS wird das angewandte Token auch aktiv halten und bei Bedarf erneuern.

Konfigurieren des Cloudflare-Anbieters in Terraform

Um DNS-Einträge in Cloudflare zu verwalten, müssen Sie den Cloudflare-Anbieter in Terraform konfigurieren. Hier ist eine Terraform-Konfiguration zum Erstellen oder Aktualisieren von DNS-Einträgen:

 1locals {
 2
 3    dns_tagged = {
 4        for name, service in var.services : name => [
 5            for tag in service.tags : tag if can(regex("dns.hostname=.*", tag))
 6        ]
 7    }
 8    dns_hosts = {
 9        for name, tag in local.k8s_tagged : name => regex("dns.hostname=`\\((?P<hostname>.*)`\\)", element(tag,0)).hostname
10    }
11
12}
13
14resource "cloudflare_record" "web" {
15
16  for_each = local.dns_hosts
17
18  zone_id = "YOUR_ZONE_ID"
19  name    = each.value
20  type    = "A"
21  value   = var.services[each.key].address
22  ttl     = 300
23}

Diese Konfiguration zieht den DNS-Namen dynamisch aus der Anmerkung dns.hostname und aktualisiert den Eintrag, um auf die aktuelle IP des Dienstes zu verweisen.

6. Automatisierung der DNS-Eintrag-Updates

Mit allem, was konfiguriert ist, ist Ihr System jetzt eingerichtet, um DNS-Einträge in Cloudflare automatisch zu aktualisieren. Wenn Dienste in Kubernetes skaliert oder neu bereitgestellt werden, können sich ihre IP-Adressen ändern, und Consul erfasst diese Änderungen in Echtzeit. Consul-Terraform-Sync wird dann Terraform-Ausführungen auslösen, um die DNS-Einträge in Cloudflare entsprechend zu aktualisieren.

Vorteile der Verwendung von Service-Anmerkungen zur Automatisierung von DNS

  • Vereinfachte DNS-Verwaltung: Service-Anmerkungen bieten eine einfache Möglichkeit, DNS-Hostnamen innerhalb der Kubernetes-Service-Metadaten zu definieren, die CTS zur dynamischen Verwaltung von DNS-Einträgen nutzt.
  • Echtzeit-DNS-Updates: Consul und CTS stellen sicher, dass die DNS-Einträge in Cloudflare aktualisiert werden, sobald Änderungen in Kubernetes auftreten, was Ausfallzeiten reduziert und die Verfügbarkeit der Dienste verbessert.
  • Nahtlose Integration: Die Verwendung von Service-Anmerkungen ermöglicht es, DNS-Namen direkt in Kubernetes zu verwalten, wodurch der Arbeitsablauf optimiert wird.
  • Skalierbarkeit: Wenn Kubernetes-Dienste hoch- oder heruntergefahren werden, passt das System die DNS-Einträge automatisch ohne manuelle Eingriffe an.

Fazit

Durch die Verwendung von Consul-Terraform-Sync, Kubernetes Consul Sync, Cloudflare und Service-Anmerkungen in Kubernetes können Sie DNS-Updates in dynamischen Umgebungen vollständig automatisieren. Dies stellt sicher, dass DNS-Einträge immer aktuell und genau sind, was den manuellen Aufwand reduziert und die Resilienz der Dienste verbessert. Ein sehr ähnlicher Ansatz kann auch für HashiCorp Nomad verwendet werden.

Weiterführende Literatur

flare/latest/docs)

Dieser Ansatz bietet eine skalierbare, zuverlässige Lösung zur Automatisierung des DNS-Managements in Kubernetes unter Verwendung einfacher Service-Anmerkungen und der DNS-Funktionen von Cloudflare. Natürlich kann Cloudflare auch durch jeden anderen DNS-Anbieter ersetzt werden, der eine API und einen Terraform-Anbieter zur Verwaltung von DNS-Einträgen anbietet.

Zurück Unsere Trainings entdecken

Wir sind für Sie da

Sie interessieren sich für unsere Trainings oder haben einfach eine Frage, die beantwortet werden muss? Sie können uns jederzeit kontaktieren! Wir werden unser Bestes tun, um alle Ihre Fragen zu beantworten.

Hier kontaktieren