Blog
Bereitstellung von Apache Airflow auf Azure Kubernetes Service

In diesem Beitrag wird beschrieben, wie Sie Apache Airflow mit dem Kubernetes Executor auf Azure Kubernetes Service (AKS) einsetzen können. Außerdem erfahren Sie mehr über die Registrierung eines geeigneten Domainnamens für Airflow, der über HTTPS läuft. Um diesen Beitrag optimal nutzen zu können, sollten Sie über Grundkenntnisse in helm, kubectl und Docker verfügen, da die Befehle hier nicht im Detail erklärt werden. Kurz gesagt: Docker ist derzeit die beliebteste Container-Plattform und ermöglicht es Ihnen, in sich geschlossene Umgebungen zu isolieren und zu packen. Kubernetes (zugänglich über das Kommandozeilen-Tool kubectl) ist eine leistungsstarke und umfassende Plattform für die Orchestrierung von Docker-Containern. Helm ist eine auf kubectl aufbauende Schicht und ein Anwendungsmanager für Kubernetes, der die gemeinsame Nutzung und Installation komplexer Anwendungen auf Kubernetes erleichtert.
Erste Schritte
Um loszulegen und mitzumachen:
- Klonen Sie das Airflow-Docker-Image-Repository
- Klonen Sie die Airflow-Steuerkarte
Erstellen Sie eine Kopie von ./airflow-helm/airflow.yaml nach ./airflow-helm/airflow-local.yaml. Wir werden diese Datei im Laufe dieses Handbuchs ändern.
Kubernetes Executor auf Azure Kubernetes Service (AKS)
Der Kubernetes-Executor für Airflow führt jede einzelne Aufgabe in einem separaten Pod aus. Dies geschieht, indem er mit dem Befehl airflow run einen neuen Lauf der Aufgabe in einem neuen Pod startet. Der Executor sorgt auch dafür, dass der neue Pod eine Verbindung zur Datenbank und den Speicherort der DAGs und Protokolle erhält.
AKS ist ein verwalteter Kubernetes-Dienst, der in der Microsoft Azure Cloud läuft. Es wird davon ausgegangen, dass der Leser bereits einen solchen Cluster eingerichtet hat - dies ist in der Tat recht einfach, wenn Sie die Schnellstartanleitung verwenden. Hinweis: Diese Anleitung wurde mit der AKS-Version 1.12.7 geschrieben.
Der Fernet-Schlüssel in Airflow ist dafür gedacht, geheime Werte von der Datenbank zum Executor zu übermitteln. Wenn der Executor keinen Zugriff auf den fernet-Schlüssel hat, kann er keine Verbindungen entschlüsseln. Um sicherzustellen, dass dies möglich ist, setzen Sie den folgenden Wert in airflow-local.yaml:
Luftstrom: fernetKey:
Verwenden Sie bcb.github.io/airflow/fernet-key, um einen fernet-Schlüssel zu erzeugen.
Diese Einstellung sorgt dafür, dass der Fernet-Schlüssel an die Executor-Pods weitergegeben wird. Dies geschieht automatisch durch den Kubernetes Executor in Airflow.
Bereitstellen mit Helm
Stellen Sie zusätzlich zum airflow-helm Repository sicher, dass Ihr kubectl so konfiguriert ist, dass es den richtigen AKS-Cluster verwendet (wenn Sie mehr als einen haben). Wenn Sie einen Kubernetes-Cluster namens aks-airflow haben, können Sie das Azure CLI oder kubectl verwenden.
az aks get-credentials --name aks-airflow --resource-group MeineRessourcenGruppe
oder
kubectl config use-context aks-airflow
auf. Beachten Sie, dass letzteres nur funktioniert, wenn Sie den ersten Befehl mindestens einmal aufgerufen haben.
Azure Postgres
Um die Cloud-Funktionen vollständig nutzen zu können, werden wir mit einer verwalteten Azure Postgres-Instanz verbunden. Wenn Sie noch keine haben, ist die Schnellstartanleitung Ihr Freund. Der gesamte Status von Airflow wird im Metaspeicher gespeichert. Wenn Sie sich für diese verwaltete Datenbank entscheiden, müssen Sie sich auch nicht mehr um Backups kümmern.
Das in der Steuerkarte verwendete Docker-Image verwendet eine entrypoint.sh, die einige unangenehme Annahmen macht:
Es erstellt den Wert AIRFLOWCORESQL_ALCHEMY_CONN mit den Postgres-Werten host, port, user und password.
Das Problem ist, dass es standardmäßig eine unverschlüsselte (keine SSL) Verbindung erwartet. Da dieser Blogpost eine externe Postgres-Instanz verwendet, müssen wir SSL-Verschlüsselung verwenden.
Die einfachste Lösung für dieses Problem ist, die Dockerfile zu ändern und die Zeilen ENTRYPOINT und CMD vollständig zu entfernen. Dazu müssen Sie allerdings ein eigenes Image erstellen und es in Ihre Container-Registry einspeisen. Die Azure Container Registry (ACR) würde diesen Zweck sehr gut erfüllen.
Anschließend können wir mit psql den Benutzer und die Datenbank für Airflow erstellen. Am einfachsten ist es, sich im Azure-Portal anzumelden, eine Cloud-Shell zu öffnen und sich mit Ihrem Admin-Benutzer mit der Postgres-Datenbank zu verbinden. Von hier aus können Sie den Benutzer, die Datenbank und die Zugriffsrechte für Airflow erstellen mit
erstellen Datenbank Luftstrom; Benutzer airflow mit verschlüsseltem Passwort 'foo' anlegen; gewähren Sie airflow alle Rechte für die Datenbank airflow;
Sie können dann den folgenden Wert (unter der Annahme, dass Ihre Postgres-Instanz posgresdbforairflow heißt) in airflow-local.yaml einstellen:
Luftstrom: sqlalchemy_connection: postgresql+psycopg2://airflow@posgresdbforairflow:foo@posgresdbforairflow.postgres.database.azure.com:5432/airflow?sslmode=require
Beachten Sie die sslmode=require am Ende, die Airflow anweist, eine verschlüsselte Verbindung zu Postgres zu verwenden.
Da wir ein benutzerdefiniertes Bild verwenden, müssen wir dies an helm weitergeben. Stellen Sie die folgenden Werte in airflow-local.yaml ein:
Luftstrom: Bild: Repository: youracrservice.azurecr.io/custom-docker-airflow Tag: 1.10.2 pullPolicy: IfNotPresent pullSecret: acr-auth
Beachten Sie das acr-auth pull secret. Sie können es entweder selbst erstellen oder - noch besser - helm darum kümmern lassen. Damit helm das Geheimnis für Sie erstellt, setzen Sie die folgenden Werte in airflow-local.yaml:
imageCredentials: Registry: youracrservice.azurecr.io Benutzername: youracrservice Passwort: passwort-für-azure-container-registry
Der Sqlalchemy-Verbindungsstring wird auch an die Executor-Pods weitergegeben. Wie der fernet-Schlüssel wird auch dies vom Kubernetes Executor durchgeführt.
Dauerhafte Protokolle und Dags mit Azure Fileshare
Microsoft Azure bietet eine Möglichkeit, SMB-Dateifreigaben in jeden Kubernetes-Pod einzuhängen. Um eine dauerhafte Protokollierung zu ermöglichen, konfigurieren wir das Steuerdiagramm für die Einbindung einer Azure-Dateifreigabe (AFS). Die Einrichtung von logrotate fällt aus dem Rahmen, wird aber dringend empfohlen, da Airflow (insbesondere der Scheduler) sehr viele Protokolle erzeugt. In dieser Anleitung werden wir auch ein AFS für den Speicherort der Dags verwenden.
Stellen Sie die folgenden Werte ein, um die Protokollierung auf einer Dateifreigabe in airflow-local.yaml zu aktivieren.
Ausdauer: Dateispeicher: storageAccountName: IhrZeichenSpeicherkontoname storageAccountKey: Ihr Azurestorage-Kontoschlüssel Protokolle: secretName: logssecret shareName: yourlogssharename dags: secretName: dagssecret shareName: yourdagssharename
Der Name von shareName muss mit einem AFS übereinstimmen, den Sie vor dem Einsatz der Steuerkarte erstellt haben.
Jetzt ist alles für die persistente Protokollierung und persistente Dags eingerichtet.
Damit ist die Arbeit mit helm abgeschlossen und airflow kann nun eingesetzt werden! Führen Sie den folgenden Befehl von dem Pfad aus, in dem sich Ihr airflow-local.yaml befindet:
helm install --namespace "Luftstrom" --name "Luftstrom" -f airflow-local.yaml airflow/
Der nächste Schritt wäre exec -it im Webserver oder Scheduler Pod und die Erstellung von Airflow-Benutzern. Dies würde den Rahmen dieses Handbuchs sprengen.
Lernen Sie Spark oder Python in nur einem Tag
Entwickeln Sie Ihre Data Science-Fähigkeiten. **Online**, unter Anleitung am 23. oder 26. März 2020, 09:00 - 17:00 CET.
FQDN mit Ingress-Controller
Airflow läuft derzeit unter einem eigenen Dienst und einer eigenen IP im Cluster. Sie könnten auf den Webserver zugreifen, indem Sie den Pod oder den Dienst über port-forward aufrufen ( kubectl). Aber viel schöner ist es, airflow einen richtigen DNS-Namen zuzuweisen und ihn über HTTPS erreichbar zu machen. Microsoft Azure bietet einen hervorragenden Leitfaden, in dem alle Schritte erläutert werden, die für die Einrichtung erforderlich sind. Alles unten - bis zum Abschnitt "Chaoskube" - ist eine Zusammenfassung dieses Leitfadens.
Einrichten eines Ingress Controllers
Wenn Ihr AKS-Cluster ohne RBAC konfiguriert ist, können Sie den folgenden Befehl verwenden, um den Ingress Controller einzusetzen.
helm install stable/nginx-ingress --namespace airflow --set controller.replicaCount=2 ----set rbac.create=false
Damit wird eine öffentlich verfügbare IP-Adresse für einen NGINX-Pod konfiguriert, die derzeit auf nichts verweist. Wir werden das ändern. Sie können diese IP-Adresse verfügbar machen, indem Sie die Dienste beobachten:
kubectl -n airflow get service --watch
Einen DNS-Namen konfigurieren
Mit der vom Ingress Controller erstellten IP-Adresse können Sie nun einen DNS-Namen in Azure registrieren. Die folgenden bash Befehle kümmern sich darum:
IP=$(kubectl -n airflow get service nameIhrer-nginx-ingress-controller -o jsonpath={.status.loadBalancer.ingress..ip}) # Name, der mit der öffentlichen IP-Adresse verknüpft werden soll DNSNAME="IhrAirflowdnsname" # Abrufen der Ressourcen-ID der öffentlichen IP PUBLICIPID=$(az network public-ip list --query "[?ipAddress!=null]|[?contains(ipAddress, '$IP')].[id]" --Ausgabe tsv) # Öffentliche IP-Adresse mit DNS-Namen aktualisieren az network public-ip update --ids $PUBLICIPID --dns-name $DNSNAME
Machen Sie es HTTPS
Lassen Sie uns nun für Sicherheit sorgen, indem wir einen Zertifikatsmanager konfigurieren, der automatisch SSL-Zertifikate auf der Grundlage der Route ingress erstellt und erneuert. Die folgenden Bash-Befehle kümmern sich darum:
# Installieren Sie die CustomResourceDefinition-Ressourcen separat. kubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.7/deploy/manifests/00-crds.yaml # Erstellen Sie den Namespace für cert-manager kubectl create Namespace cert-manager # Kennzeichnen Sie den cert-manager-Namensraum, um die Ressourcenüberprüfung zu deaktivieren. kubectl label namespace cert-manager certmanager.k8s.io/disable-validation=true # Fügen Sie das Jetstack Helm Repository hinzu. helm repo jetstack hinzufügen https://charts.jetstack.io # Aktualisieren Sie den Cache Ihres lokalen Helm Chart-Repositorys. helm repo update # Installieren Sie den cert-manager Helm Chart Steuerruder installieren --name cert-manager --namespace cert-manager --version v0.7.0 jetstack/cert-manager
Als nächstes installieren Sie letsencrypt, um signierte Zertifikate zu aktivieren.
apiVersion: certmanager.k8s.io/v1alpha1
Art: ClusterIssuer
Metadaten:
Name: letsencrypt-prod
Namensraum: airflow
spec:
acme:
Server: https://acme-v02.api.letsencrypt.org/directory
E-Mail: youremail@domain.com
privateKeySecretRef:
Name: letsencrypt-prod
http01: {}
kubectl apply -f cluster-issuer.yaml
Nachdem das Skript abgeschlossen ist, verfügen Sie nun über einen DNS-Namen, der auf den Ingress-Controller verweist, und ein signiertes Zertifikat. Der einzige Schritt, der noch aussteht, um airflow zugänglich zu machen, ist die Konfiguration des Controllers, um sicherzustellen, dass er auf den gut versteckten airflow web Dienst zeigt. Erstellen Sie eine neue Datei namens ingress-routes.yaml, die Folgendes enthält
apiVersion: erweiterungen/v1beta1 freundlich: Eindringen Metadaten: Name: airflow-ingress Namespace: Luftstrom Anmerkungen: kubernetes.io/ingress.class: nginx certmanager.k8s.io/cluster-issuer: letsencrypt-prod nginx.ingress.kubernetes.io/rewrite-target: / spec: tls: - Wirte: - yourairflowdnsname.yourazurelocation.cloudapp.azure.com secretName: tls-geheim Regeln: - Gastgeber: yourairflowdnsname.yourazurelocation.cloudapp.azure.com http: Pfade: - Pfad: / Backend: serviceName: airflow-web servicePort: 8080
Laufen lassen
kubectl apply -f ingress-routes.yaml
um es zu installieren.
Airflow ist jetzt über HTTPS auf https://yourairflowdnsname.yourazurelocation.cloudapp.azure.com zugänglich.
Toll!
Chaoskube
Eifrigen Airflow-Benutzern ist vielleicht schon aufgefallen, dass der Scheduler gelegentlich ein seltsames Verhalten an den Tag legt. Das bedeutet, dass er aufhört, Aufgaben zu planen. Eine respektable - wenn auch umständliche - Lösung besteht darin, den Scheduler von Zeit zu Zeit neu zu starten. In Kubernetes können Sie dieses Problem lösen, indem Sie einfach den Scheduler-Pod zerstören. Kubernetes wird dann automatisch einen neuen Scheduler-Pod booten.
Geben Sie chaoskube ein. Dieses erstaunliche kleine Tool - das auch auf Ihrem Cluster läuft - kann so konfiguriert werden, dass es Pods innerhalb Ihres Clusters killt. Es ist hochgradig konfigurierbar und kann jeden Pod nach Ihren Wünschen anvisieren.
Mit dem folgenden Befehl können Sie festlegen, dass er nur auf den Airflow Scheduler-Pod zielt.
Upgrade des Steuerrads --Chaos installieren --set dryRun=false --set Intervall=5m --set Namespaces=Luftstrom --set Etiketten="app=airflow-scheduler" stabil/chaoskube
Schlusswort
Mit ein paar hochverfügbaren Azure-Diensten und ein wenig Aufwand haben Sie nun eine skalierbare Airflow-Lösung auf Kubernetes eingerichtet, die von einer verwalteten Postgres-Instanz unterstützt wird. Airflow hat auch einen voll qualifizierten Domainnamen und ist über HTTPS erreichbar. Der Kubernetes Executor macht Airflow unendlich skalierbar, ohne dass Sie sich um Worker kümmern müssen.
Schauen Sie sich unseren Apache Airflow-Kurs an, in dem Sie die Interna, die Terminologie und die besten Praktiken bei der Arbeit mit Airflow kennenlernen. bietet Ihnen praktische Erfahrungen beim Schreiben und Verwalten von Datenpipelines.
Unsere Ideen
Weitere Blogs
Contact



