Cloud Composer 1 | Cloud Composer 2 | Cloud Composer 3
Cette page explique comment utiliser KubernetesPodOperator pour déployer des pods Kubernetes à partir de Cloud Composer dans le cluster Google Kubernetes Engine appartenant à votre environnement Cloud Composer.
KubernetesPodOperator lance Pods Kubernetes dans le cluster de votre environnement. En comparaison, Les opérateurs Google Kubernetes Engine exécutent les pods Kubernetes dans un qui peut être un cluster distinct, sans lien avec votre environnement. Vous pouvez aussi créer et supprimer des clusters Opérateurs Google Kubernetes Engine.
KubernetesPodOperator est une bonne option si vous avez besoin des éléments suivants:
- de dépendances Python personnalisées qui ne sont pas disponibles via le dépôt PyPI public ;
- de dépendances binaires qui ne sont pas disponibles dans l'image de nœud de calcul Cloud Composer issue de la banque d'images.
Avant de commencer
Si vous utilisez la version 5.0.0 du fournisseur CNCF Kubernetes, suivez les instructions section CNCF du fournisseur Kubernetes.
La configuration de l'affinité de pod n'est pas disponible dans Cloud Composer 2. Si vous voulez pour utiliser l'affinité de pod, utilisez les opérateurs GKE pour lancer les pods dans un autre cluster.
À propos de KubernetesPodOperator dans Cloud Composer 2
Cette section décrit le fonctionnement de KubernetesPodOperator dans Cloud Composer 2.
Utilisation des ressources
Dans Cloud Composer 2, le cluster de votre environnement évolue automatiquement. Les charges de travail supplémentaires que vous exécutez à l'aide de KubernetesPodOperator évoluent indépendamment de votre environnement.
Votre environnement n'est pas affecté par l'augmentation de la demande de ressources, mais son cluster peut évoluer à la hausse en fonction de la demande de ressources.
La tarification des charges de travail supplémentaires que vous exécutez dans le cluster de votre environnement suit le modèle de tarification de Cloud Composer 2 et utilise les codes SKU Cloud Composer Compute.
Cloud Composer 2 utilise des clusters Autopilot qui introduisent la notion de classes de calcul :
Cloud Composer n'est compatible qu'avec la classe de calcul
general-purpose
.Par défaut, si aucune classe n'est sélectionnée, la classe
general-purpose
est supposée lorsque vous créez des pods à l'aide de KubernetesPodOperator.Chaque classe est associée à des propriétés et limites de ressources spécifiques, Pour en savoir plus à leur sujet, consultez Documentation Autopilot. Pour Par exemple, les pods qui s'exécutent dans la classe
general-purpose
peuvent utiliser Gio de mémoire.
Accès aux ressources du projet
Cloud Composer 2 utilise des clusters GKE avec
Fédération d'identité de charge de travail pour GKE Les pods exécutés dans l'espace de noms composer-user-workloads
peuvent accéder aux ressources Google Cloud de votre projet sans configuration supplémentaire. Compte de service de votre environnement
est utilisé pour accéder à ces ressources.
Si vous souhaitez utiliser un espace de noms personnalisé, les comptes de service Kubernetes associés à cet espace de noms doivent être mappés sur des comptes de service Google Cloud afin d'autoriser l'identité de service pour les requêtes envoyées aux API Google et à d'autres services. Si vous exécutez des pods dans un espace de noms personnalisé dans la couche puis les liaisons IAM entre Kubernetes Les comptes de service Google Cloud ne sont pas créés et ces pods ne peuvent pas d'accéder aux ressources de votre projet Google Cloud.
Si vous utilisez un espace de noms personnalisé et que vous souhaitez que vos pods aient accès aux ressources Google Cloud, suivez les instructions de la section "Fédération d'identité de charge de travail pour GKE" et configurez les liaisons pour un espace de noms personnalisé :
- Créez un espace de noms distinct dans le cluster de votre environnement.
- Créez une liaison entre le compte de service Kubernetes de l'espace de noms personnalisé et le compte de service de votre environnement.
- Ajoutez l'annotation de compte de service de votre environnement au compte de service Kubernetes.
- Lorsque vous utilisez KubernetesPodOperator, spécifiez l'espace de noms et la valeur
Compte de service Kubernetes dans
namespace
etservice_account_name
paramètres.
Configuration minimale
Pour créer un opérateur KubernetesPodOperator, seuls les paramètres name
, image
à utiliser et task_id
du pod sont obligatoires. /home/airflow/composer_kube_config
qui contient des identifiants permettant de s'authentifier auprès de GKE.
Configuration supplémentaire
Cet exemple présente des paramètres supplémentaires que vous pouvez configurer dans KubernetesPodOperator.
Pour en savoir plus sur les paramètres, consultez la documentation de référence Airflow pour KubernetesPodOperator. Pour en savoir plus sur l'utilisation des secrets et des ConfigMaps Kubernetes, consultez Utiliser des secrets et des ConfigMaps Kubernetes. Pour en savoir plus sur l'utilisation de modèles Jinja avec KubernetesPodOperator, consultez Utiliser des modèles Jinja.
Utiliser des modèles Jinja
Airflow est compatible avec les modèles Jinja dans les DAG.
Vous devez déclarer les paramètres Airflow requis (task_id
, name
et
image
) avec l'opérateur. Comme le montre l'exemple suivant,
Vous pouvez modéliser tous les autres paramètres avec Jinja, y compris cmds
,
arguments
, env_vars
et config_file
.
Le paramètre env_vars
de l'exemple est défini à partir d'une variable Airflow nommée my_value
. Exemple de DAG
Elle obtient sa valeur à partir de la variable de modèle vars
dans Airflow. Airflow dispose de plus de variables qui permettent d'accéder à différents types d'informations. Par exemple, vous pouvez utiliser la variable de modèle conf
pour accéder aux valeurs des options de configuration d'Airflow. Pour en savoir plus et obtenir la liste des variables disponibles dans Airflow, consultez la documentation de référence sur les modèles dans la documentation Airflow.
Sans modifier le DAG ni créer la variable env_vars
,
Dans l'exemple, la tâche ex-kube-templates
échoue, car la variable n'a pas
existent. Créez cette variable dans l'interface utilisateur d'Airflow ou dans Google Cloud CLI:
Interface utilisateur d'Airflow
Accédez à l'interface utilisateur d'Airflow.
Dans la barre d'outils, sélectionnez Administration > Variables.
Sur la page List Variable (Variable de liste), cliquez sur Add a new record (Ajouter un enregistrement).
Sur la page Add Variable (Ajouter une variable), saisissez les informations suivantes :
- Key (Clé) :
my_value
- Val (Valeur) :
example_value
- Key (Clé) :
Cliquez sur Enregistrer.
gcloud
Saisissez la commande suivante :
gcloud composer environments run ENVIRONMENT \
--location LOCATION \
variables set -- \
my_value example_value
Remplacez :
ENVIRONMENT
par le nom de l'environnement.LOCATION
par la région où se trouve l'environnement.
L'exemple suivant montre comment utiliser les modèles Jinja avec KubernetesPodOperator:
Utiliser les Secrets et les ConfigMaps de Kubernetes
Un secret Kubernetes est un objet qui contient des données sensibles. Un ConfigMap Kubernetes est un objet qui contient des données non confidentielles sous forme de paires clé-valeur.
Dans Cloud Composer 2, vous pouvez créer des secrets et des ConfigMaps à l'aide de la Google Cloud CLI, de l'API ou de Terraform, puis y accéder depuis KubernetesPodOperator.
À propos des fichiers de configuration YAML
Lorsque vous créez un Secret Kubernetes ou un ConfigMap à l'aide de Google Cloud CLI et vous devez fournir un fichier au format YAML. Ce fichier doit suivre le même utilisé par les Secrets et les ConfigMaps de Kubernetes. Documentation Kubernetes fournit de nombreux exemples de code de ConfigMaps et de Secrets. Pour commencer, vous pouvez consultez les Distribuer les identifiants de manière sécurisée à l'aide de secrets et ConfigMaps.
Comme dans les secrets Kubernetes, utilisez la représentation base64 lorsque vous définissez des valeurs dans Secrets.
Pour encoder une valeur, vous pouvez utiliser la commande suivante (il s'agit de l'une des nombreuses façons pour obtenir une valeur encodée en base64):
echo "postgresql+psycopg2://root:example-password@127.0.0.1:3306/example-db" -n | base64
Sortie :
cG9zdGdyZXNxbCtwc3ljb3BnMjovL3Jvb3Q6ZXhhbXBsZS1wYXNzd29yZEAxMjcuMC4wLjE6MzMwNi9leGFtcGxlLWRiIC1uCg==
Les deux exemples de fichiers YAML suivants sont utilisés dans les exemples présentés plus loin dans ce guide. Exemple de fichier de configuration YAML pour un secret Kubernetes:
apiVersion: v1
kind: Secret
metadata:
name: airflow-secrets
data:
sql_alchemy_conn: cG9zdGdyZXNxbCtwc3ljb3BnMjovL3Jvb3Q6ZXhhbXBsZS1wYXNzd29yZEAxMjcuMC4wLjE6MzMwNi9leGFtcGxlLWRiIC1uCg==
Autre exemple montrant comment inclure des fichiers. Comme dans l'exemple précédent, commencez par encoder le contenu d'un fichier (cat ./key.json | base64
), puis fournissez cette valeur dans le fichier YAML :
apiVersion: v1
kind: Secret
metadata:
name: service-account
data:
service-account.json: |
ewogICJ0eXBl...mdzZXJ2aWNlYWNjb3VudC5jb20iCn0K
Exemple de fichier de configuration YAML pour un ConfigMap. Vous n'avez pas besoin d'utiliser la représentation base64 dans les ConfigMaps :
apiVersion: v1
kind: ConfigMap
metadata:
name: example-configmap
data:
example_key: example_value
Gérer les secrets Kubernetes
Dans Cloud Composer 2, vous créez des secrets à l'aide de Google Cloud CLI et de kubectl
:
Obtenez des informations sur le cluster de votre environnement:
Exécutez la commande suivante :
gcloud composer environments describe ENVIRONMENT \ --location LOCATION \ --format="value(config.gkeCluster)"
Remplacez :
ENVIRONMENT
par le nom de votre environnement.LOCATION
par la région où se trouve l'environnement Cloud Composer.
Le résultat de cette commande utilise le format suivant :
projects/<your-project-id>/locations/<location-of-composer-env>/clusters/<your-cluster-id>
.Pour obtenir l'ID du cluster GKE, copiez le résultat après
/clusters/
(se termine par-gke
).
Connectez-vous à votre cluster GKE avec le code suivant : :
gcloud container clusters get-credentials CLUSTER_ID \ --project PROJECT \ --region LOCATION
Remplacez les éléments suivants :
CLUSTER_ID
: ID du cluster de l'environnement.PROJECT_ID
: ID du projet.LOCATION
: région dans laquelle se trouve l'environnement.
Créez des secrets Kubernetes:
Les commandes suivantes illustrent deux approches différentes pour créer Secrets Kubernetes. L'approche
--from-literal
utilise des paires clé/valeur. L'approche--from-file
utilise le contenu des fichiers.Pour créer un secret Kubernetes en fournissant des paires clé/valeur, exécutez la commande la commande suivante. Cet exemple crée un secret nommé
airflow-secrets
comportant un champsql_alchemy_conn
avec la valeur detest_value
kubectl create secret generic airflow-secrets \ --from-literal sql_alchemy_conn=test_value -n composer-user-workloads
Pour créer un secret Kubernetes en fournissant le contenu d'un fichier, exécutez la commande la commande suivante. Cet exemple crée un secret nommé
service-account
qui comporte le champservice-account.json
avec la valeur extraite du contenu d'un fichier./key.json
local.kubectl create secret generic service-account \ --from-file service-account.json=./key.json -n composer-user-workloads
Utiliser des secrets Kubernetes dans vos DAG
Cet exemple présente deux façons d'utiliser les secrets Kubernetes: en tant qu'environnement et en tant que volume installé par le pod.
Le premier secret, airflow-secrets
, est défini
à une variable d'environnement Kubernetes nommée SQL_CONN
(par opposition à
(variable d'environnement Airflow ou Cloud Composer).
Le second secret, service-account
, installe service-account.json
, un fichier contenant un jeton de compte de service, dans /var/secrets/google
.
Voici à quoi ressemblent les objets Secret:
Le nom du premier secret Kubernetes est défini dans la variable secret_env
.
Ce secret est nommé airflow-secrets
. Le paramètre deploy_type
spécifie qu'il doit être exposé en tant que variable d'environnement. Le nom de la variable d'environnement est SQL_CONN
, comme spécifié dans le paramètre deploy_target
. Enfin, la fonction
la valeur de la variable d'environnement SQL_CONN
est définie sur la valeur de la
sql_alchemy_conn
.
Le nom du deuxième secret Kubernetes est défini dans le fichier secret_volume
.
. Ce secret est nommé service-account
. Il est exposé comme
le volume, comme spécifié dans le paramètre deploy_type
. Le chemin d'accès du fichier vers
"mount", deploy_target
, est /var/secrets/google
. Enfin, le key
du
Le secret stocké dans deploy_target
est service-account.json
.
Voici à quoi ressemble la configuration de l'opérateur :
Informations sur le fournisseur CNCF Kubernetes
KubernetesPodOperator est implémenté dans
Fournisseur apache-airflow-providers-cncf-kubernetes
.
Pour obtenir des notes de version détaillées sur le fournisseur Kubernetes CNCF, consultez Site Web CNCF du fournisseur Kubernetes
Version 6.0.0
Dans la version 6.0.0 du package fournisseur Kubernetes CNCF,
la connexion kubernetes_default
est utilisée par défaut dans KubernetesPodOperator.
Si vous avez spécifié une connexion personnalisée dans la version 5.0.0, cette connexion personnalisée est toujours utilisée par l'opérateur. Pour revenir à l'utilisation de kubernetes_default
vous pouvez ajuster vos DAG en conséquence.
Version 5.0.0
Cette version introduit quelques modifications non rétrocompatibles par rapport à la version 4.4.0. Les plus importants sont liés
La connexion kubernetes_default
, qui n'est pas utilisée dans la version 5.0.0.
- La connexion
kubernetes_default
doit être modifiée. Configuration de Kubernetes le chemin d'accès doit être défini sur/home/airflow/composer_kube_config
(comme illustré ci-dessous). À la place,config_file
doit à la configuration de KubernetesPodOperator (comme indiqué dans l'exemple de code suivant).
- </ph>
- Modifiez le code d'une tâche à l'aide de KubernetesPodOperator comme suit :
KubernetesPodOperator(
# config_file parameter - can be skipped if connection contains this setting
config_file="/home/airflow/composer_kube_config",
# definition of connection to be used by the operator
kubernetes_conn_id='kubernetes_default',
...
)
Pour en savoir plus sur la version 5.0.0, consultez Notes de version du fournisseur Kubernetes CNCF
Dépannage
Cette section fournit des conseils pour résoudre les problèmes courants liés à KubernetesPodOperator problèmes:
Voir les journaux
Lorsque vous résolvez des problèmes, vous pouvez consulter les journaux dans l'ordre suivant:
Journaux de tâches Airflow :
Dans la console Google Cloud, accédez à la page Environnements.
Dans la liste des environnements, cliquez sur le nom de votre environnement. La page Détails de l'environnement s'ouvre.
Accédez à l'onglet DAG.
Cliquez sur le nom du DAG, puis sur l'exécution du DAG pour afficher les détails et les journaux.
Journaux du programmeur Airflow :
Accédez à la page Détails de l'environnement.
Accédez à l'onglet Journaux.
Inspectez les journaux du planificateur Airflow.
Journaux des pods dans la console Google Cloud, sous les charges de travail GKE. Ces journaux incluent le fichier YAML de définition des pods, les événements des pods et les détails des pods.
Codes de retour non nuls
Lorsque vous utilisez KubernetesPodOperator (et GKEStartPodOperator), du point d'entrée du conteneur détermine si la tâche considéré comme réussi ou non. Les codes de retour non nuls indiquent un échec.
Un schéma courant consiste à exécuter un script shell comme point d'entrée du conteneur pour regrouper plusieurs opérations dans le conteneur.
Si vous rédigez un script de ce type, nous vous recommandons d'inclure le
set -e
en haut du script afin que les commandes ayant échoué
d'arrêter le script et de propager l'échec vers l'instance de tâche Airflow.
Délais d'inactivité des pods
Le délai avant expiration par défaut pour KubernetesPodOperator est de 120 secondes, ce qui
peut entraîner des délais d'inactivité avant le téléchargement d'images plus volumineuses. Vous pouvez
augmenter le délai avant expiration en modifiant le paramètre startup_timeout_seconds
lorsque
vous devez créer l'opérateur KubernetesPodOperator.
Lorsqu'un pod expire, le journal spécifique à la tâche est disponible dans l'interface utilisateur d'Airflow. Exemple :
Executing <Task(KubernetesPodOperator): ex-all-configs> on 2018-07-23 19:06:58.133811
Running: ['bash', '-c', u'airflow run kubernetes-pod-example ex-all-configs 2018-07-23T19:06:58.133811 --job_id 726 --raw -sd DAGS_FOLDER/kubernetes_pod_operator_sample.py']
Event: pod-name-9a8e9d06 had an event of type Pending
...
...
Event: pod-name-9a8e9d06 had an event of type Pending
Traceback (most recent call last):
File "/usr/local/bin/airflow", line 27, in <module>
args.func(args)
File "/usr/local/lib/python2.7/site-packages/airflow/bin/cli.py", line 392, in run
pool=args.pool,
File "/usr/local/lib/python2.7/site-packages/airflow/utils/db.py", line 50, in wrapper
result = func(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/airflow/models.py", line 1492, in _run_raw_task
result = task_copy.execute(context=context)
File "/usr/local/lib/python2.7/site-packages/airflow/contrib/operators/kubernetes_pod_operator.py", line 123, in execute
raise AirflowException('Pod Launching failed: {error}'.format(error=ex))
airflow.exceptions.AirflowException: Pod Launching failed: Pod took too long to start
Les délais d'inactivité des pods peuvent également se produire Compte de service Cloud Composer ne dispose pas des autorisations IAM nécessaires pour effectuer la tâche à votre main. Pour le vérifier, examinez les erreurs au niveau du pod à l'aide de la méthode Tableaux de bord GKE pour examiner les journaux de vos une charge de travail spécifique, ou encore utiliser Cloud Logging.
Échec de l'établissement d'une nouvelle connexion
La mise à niveau automatique est activée par défaut dans les clusters GKE. Si un pool de nœuds se trouve dans un cluster en cours de mise à niveau, le message d'erreur suivant peut s'afficher :
<Task(KubernetesPodOperator): gke-upgrade> Failed to establish a new
connection: [Errno 111] Connection refused
Pour vérifier si votre cluster effectue une mise à niveau, accédez à la page Clusters Kubernetes dans la console Google Cloud, puis recherchez l'icône de chargement à côté du nom du cluster de votre environnement.