L'un des grands défis rencontrés dans la gestion des flux de travail avec Airflow réside dans le suivi des SLA (Service Level Agreements), une fonctionnalité à la fois précieuse et problématique. Bien qu'Airflow fournisse un mécanisme natif pour surveiller les SLAs, la mise en œuvre de ce dernier laisse souvent à désirer, présentant des imperfections qui peuvent rendre la surveillance des SLAs difficile. Ce problème est bien connu dans la communauté, et certains utilisateurs considèrent cette fonctionnalité comme défectueuse. Si la surveillance des SLAs est cruciale pour vos processus, une approche recommandée consiste à utiliser un outil externe, tel que Healthchecks, qui offre des alertes suppressives via une API REST pour gérer ces accords. En l'associant à des opérateurs HTTP ou à de simples requêtes de rappels, il devient possible de garantir un système d'alerte SLA dynamique et résilient, mieux adapté aux exigences complexes des flux de travail.

Une fois les alertes SLA en place, la surveillance des performances devient essentielle pour garantir l'efficacité des processus dans Airflow. L'interface utilisateur d'Airflow, bien qu'efficace, doit être exploitée de manière approfondie pour repérer les goulets d'étranglement et les anomalies. L'une des vues les plus utiles dans ce sens est le graphique de Gantt, qui offre une représentation visuelle des tâches individuelles et du temps qu'elles consomment. Cette vue permet de détecter rapidement si certaines tâches prennent plus de temps que prévu, et d'analyser les causes possibles de ces ralentissements. De plus, la visualisation des durées des tâches, qui permet de suivre les tendances temporelles de l'exécution des tâches sur une période donnée, est essentielle pour repérer des anomalies ou des tendances émergentes. Une attention particulière à la durée de lancement des tâches peut également fournir des indications précieuses sur la charge du planificateur et sur d'éventuels problèmes de performance liés à la planification des tâches. Les retards dans le lancement, associés à des durées stables dans les tâches en amont, peuvent révéler une surcharge du planificateur, nécessitant potentiellement une reconfiguration ou une optimisation des ressources sous-jacentes.

L'optimisation continue d'Airflow passe également par la collecte de métriques supplémentaires, bien que parfois plus complexes à obtenir. Le temps de démarrage des tâches, par exemple, constitue un indicateur clé, notamment lorsque vous utilisez un exécuteur Kubernetes. Calculer la différence entre start_date et execution_date pour chaque instance de tâche permet d'identifier des goulets d'étranglement potentiels en dehors d'Airflow, notamment au niveau des ressources d'infrastructure ou des contraintes réseau. Le suivi des échecs de tâches et des tentatives de reprise est également crucial : une fréquence élevée de ces événements peut indiquer une instabilité de l'environnement ou des interactions problématiques avec d'autres services, et leur analyse permet de mieux comprendre les causes sous-jacentes.

Le temps de parsing des DAGs mérite également une attention particulière. Un temps de parsing élevé, souvent causé par des imports lourds ou des appels bloquants pendant le processus de parsing, peut avoir un impact considérable sur le respect des délais de planification des tâches. Le suivi de ce paramètre permet de détecter les problèmes de performance au niveau du planificateur, ce qui est essentiel pour maintenir des flux de travail rapides et efficaces.

Enfin, une fois ces outils de surveillance mis en place, il devient possible de mieux gérer les déploiements d'Airflow dans des environnements complexes et multi-utilisateurs. Lorsqu'un déploiement Airflow devient plus vaste et implique plusieurs équipes ou utilisateurs aux besoins variés, il est crucial de choisir une stratégie de multi-location adaptée. Bien qu'Airflow ne soit pas conçu pour être une application multi-locataire au sens strict, certaines pratiques peuvent être mises en place pour isoler les charges de travail et partager l'infrastructure de manière plus sécurisée. Toutefois, il est important de noter que cette approche peut ne pas garantir une isolation forte entre les utilisateurs, et qu'une gouvernance rigoureuse devient nécessaire pour maintenir la sécurité et la stabilité de l'environnement partagé.

Pour gérer plusieurs équipes ou utilisateurs dans un même déploiement Airflow, il existe des solutions comme l'exécuteur Celery, qui permet de répartir les tâches entre différents workers. Cependant, cette approche de partage de ressources peut conduire à des conflits si elle n'est pas soigneusement gérée. L'utilisation de mécanismes de queue pour diriger les tâches vers des workers spécifiques, accompagnée de politiques de sécurité locales pour chaque worker, peut offrir un certain niveau d'isolement. Néanmoins, des outils supplémentaires, comme des linters ou des hooks de pré-engagement, peuvent être nécessaires pour appliquer des règles de sécurité et éviter les collisions entre tâches de différents utilisateurs.

En résumé, la surveillance des performances et des SLAs dans Airflow nécessite une attention continue et une mise en œuvre soignée de différents outils et méthodologies. En optimisant ces pratiques de surveillance et en adoptant des stratégies adaptées pour un environnement multi-utilisateur, il est possible de garantir la stabilité, la fiabilité et la performance des workflows, même dans des configurations complexes. Cependant, il reste impératif de comprendre que la mise en place d'un environnement multi-locataire dans Airflow n'est pas sans défis et que chaque choix technique doit être pesé avec soin pour éviter des compromis sur la sécurité et la performance.

Comment assurer l'isolation multi-locataire dans Airflow : Une approche basée sur des rôles et des permissions

L’exécuteur Kubernetes d'Airflow est un outil puissant et hautement isolé, chaque processus s'exécutant dans son propre Pod. Cette configuration offre un environnement extrêmement sécurisé avec un minimum de configuration. Si l'isolation du travail est d'une importance capitale, l'exécuteur Kubernetes s'avère être l'option la plus simple et la plus sécurisée. Dans le cas où des contextes de sécurité spécialisés sont nécessaires, l'utilisation d'un remplacement de Pod et de sélecteurs de nœuds avec des taints ou des images spécifiques représente la meilleure approche. Cependant, l'architecture actuelle d'Airflow, qui inclut le planificateur et le déclencheur, ne permet pas de rendre ces composants multi-locataires de manière native. Ces composants auront toujours un accès complet aux DAGs et seront responsables de leur planification dans le DagBag. Si, pour une raison quelconque, vous avez besoin d'une isolation dans ces composants, la seule option est d'exploiter des déploiements Airflow supplémentaires.

En ce qui concerne la gestion des DAGs, ceux-ci sont disponibles dans un répertoire unique au sein d'Airflow. En raison de l’architecture interne d'Airflow et de Python, les DAGs sont intrinsèquement chargés dans le même espace de noms au moment de l'exécution. Cela signifie qu'en pratique, bien que les DAGs ne soient pas explicitement conscients les uns des autres, des informations contenues dans un DAG peuvent être accessibles via des importations Python et un accès basique au système de fichiers lors de l'analyse. Ainsi, il n’existe pratiquement aucun moyen de soutenir une quelconque forme d'isolation au sein du dossier de DAG principal. Cependant, avec les méthodologies "push" ou "pull", il est relativement facile de distribuer un ensemble disparate et distribué de DAGs à une seule instance Airflow pour leur planification.

Quant à l’interface Web d’Airflow, elle permet de mettre en place une forme de multi-locataire grâce à l’attribution de rôles et de permissions. Les utilisateurs peuvent être affectés à des rôles spécifiques, leur accordant ou restreignant l'accès à différents objets d'Airflow. Pour garantir un contrôle d'accès précis, Airflow offre un système de permissions qui se compose de noms d’objets (tels que DAG, Task, Variable, etc.) et de verbes (création, lecture, modification, suppression). Ces permissions sont ensuite appliquées à des rôles, et quand un utilisateur avec un rôle spécifique tente d'accéder à une ressource, il peut y accéder si ses permissions sont adéquates.

Pour structurer un environnement multi-locataire dans Airflow, il est essentiel de définir des rôles personnalisés en fonction des besoins organisationnels. Par exemple, dans une configuration avec plusieurs utilisateurs ayant des répertoires distincts contenant leurs propres DAGs, l’objectif est de veiller à ce qu'ils ne puissent pas accéder aux DAGs des autres utilisateurs via l'interface Web. Ce processus implique la création d'un rôle personnalisé, l'attribution de permissions et la gestion de l'accès via des scripts administratifs.

Un exemple de mise en œuvre de cette isolation via l'API Airflow pourrait ressembler à ceci :

python
def __add_users(user_name, password, email, first_name='', last_name='', role='Public'):
with get_application_builder() as appbuilder: role = appbuilder.sm.find_role(role) if appbuilder.sm.find_user(user_name): print(f"{user_name} already exist in the db") return user = appbuilder.sm.add_user( user_name, first_name, last_name, email, role, password ) def _add_users(): users = [ ("user_1", "user_1", "[email protected]"), ("user_2", "user_2", "[email protected]"), ] for u in users: __add_users(*u)

Ce code montre comment ajouter un utilisateur en utilisant les bibliothèques de base d'Airflow, avec un rôle par défaut « Public », qui restreint l'accès. Une autre approche consiste à utiliser des plugins d'authentification pour gérer la création d'utilisateurs de manière plus sécurisée.

Ensuite, dans le cadre d'une gestion multi-locataire, un administrateur peut facilement associer des permissions spécifiques à des rôles en fonction des répertoires de DAGs et des actions nécessaires. En procédant de cette manière, chaque utilisateur peut être assigné à un rôle ayant des permissions détaillées sur leurs DAGs respectifs. Par exemple :

python
dag_bag = DagBag(os.path.join("dags", d)) for action in [READ, EDIT, CREATE, DELETE]: for d_id in dag_bag.dags.keys(): perm: Permission | None = appbuilder.sm.create_permission(action, f"DAG:{d_id}") appbuilder.sm.add_permission_to_role(role, perm)

Cette configuration garantit que les utilisateurs auront un accès restreint et spécifique à leurs propres DAGs, sans interférer avec ceux des autres.

L'ajout de rôles et de permissions spécifiques au sein d'Airflow, ainsi que l'isolation via des Pods Kubernetes et une gestion fine des accès à l'interface Web, constitue une approche robuste pour assurer une séparation claire des environnements dans un cadre multi-locataire. Cela est particulièrement utile dans des scénarios où plusieurs équipes ou projets doivent coexister dans une même instance d'Airflow, tout en préservant la confidentialité et la sécurité des données et des processus.

Il est essentiel de noter que l'approche de multi-locataire ne se limite pas à la configuration de rôles et de permissions dans l'interface Web. L'isolation complète des utilisateurs requiert également une vigilance particulière sur la manière dont les DAGs sont chargés et gérés dans Airflow. En d'autres termes, une approche proactive, impliquant des stratégies de sécurité et de gestion des ressources en backend, s'avère indispensable pour garantir un environnement réellement sécurisé et isolé, notamment lorsque des déploiements multiples sont nécessaires pour répondre aux exigences d'isolement.