Cloud Composer 1 | Cloud Composer 2 | Cloud Composer 3
Questa pagina descrive come utilizzare KubernetesPodOperator
per eseguire il deployment dei pod Kubernetes da Cloud Composer nel cluster Google Kubernetes Engine che fa parte del tuo ambiente Cloud Composer e per garantire che l'ambiente disponga delle risorse appropriate.
KubernetesPodOperator
avvia i
pod Kubernetes
nel cluster del tuo ambiente. In confronto, gli operatori di Google Kubernetes Engine eseguono i pod Kubernetes in un cluster specificato, che può essere un cluster separato non correlato al tuo ambiente. Puoi anche creare ed eliminare i cluster
usando gli operatori di Google Kubernetes Engine.
KubernetesPodOperator
è una buona soluzione se hai bisogno di:
- Dipendenze Python personalizzate non disponibili tramite il repository PyPI pubblico.
- Dipendenze binarie che non sono disponibili nell'immagine worker di Cloud Composer di stock.
Questa pagina illustra un esempio di DAG Airflow che include le seguenti
configurazioni KubernetesPodOperator
:
- Configurazione minima: imposta solo i parametri richiesti.
- Configurazione del modello: utilizza i parametri che puoi modellare con Jinja.
Configurazione delle variabili secret: passa un oggetto Secret di Kubernetes al pod.
In Cloud Composer 3, la configurazione dell'affinità dei pod non è disponibile. Utilizza invece gli operatori GKE per avviare i pod in un cluster diverso.
Configurazione completa: include tutte le configurazioni.
Prima di iniziare
In Cloud Composer 3, il cluster del tuo ambiente scala automaticamente. I carichi di lavoro aggiuntivi eseguiti utilizzando
KubernetesPodOperator
scalano in modo indipendente dal tuo ambiente. Il tuo ambiente non è influenzato dall'aumento della domanda di risorse, ma il cluster del tuo ambiente fa lo scale up e lo scale down a seconda della richiesta di risorse. I prezzi per i carichi di lavoro aggiuntivi eseguiti nel cluster del tuo ambiente seguono il modello di prezzi di Cloud Composer 2 e utilizzano gli SKU di computing di Cloud Composer.In Cloud Composer 3, il cluster del tuo ambiente si trova nel progetto tenant. KubernetesPodOperator funziona allo stesso modo, senza dover apportare modifiche al codice rispetto a Cloud Composer 2. I pod vengono eseguiti nel cluster dell'ambiente, in uno spazio dei nomi isolato, ma con accesso alla tua rete VPC (se abilitata).
Cloud Composer 3 usa i cluster GKE con Workload Identity. Per impostazione predefinita, i pod in esecuzione in spazi dei nomi appena creati o nello spazio dei nomi
composer-user-workloads
non possono accedere alle risorse Google Cloud. Quando si utilizza Workload Identity, gli account di servizio Kubernetes associati agli spazi dei nomi devono essere mappati agli account di servizio Google Cloud per abilitare l'autorizzazione delle identità dei servizi per le richieste alle API di Google e ad altri servizi.Per questo motivo, se esegui pod nello spazio dei nomi
composer-user-workloads
o in uno spazio dei nomi appena creato nel cluster del tuo ambiente, le associazioni IAM appropriate tra gli account di servizio Kubernetes e Google Cloud non vengono create e questi pod non possono accedere alle risorse del tuo progetto Google Cloud.Se vuoi che i pod abbiano accesso alle risorse Google Cloud, utilizza lo spazio dei nomi
composer-user-workloads
o crea il tuo spazio dei nomi come descritto più avanti.Per fornire l'accesso alle risorse del progetto, segui le indicazioni in Workload Identity e configura le associazioni:
- Crea uno spazio dei nomi separato nel cluster del tuo ambiente.
- Crea un'associazione tra l'
composer-user-workloads/<namespace_name>
account di servizio Kubernetes e l'account di servizio del tuo ambiente. - Aggiungi l'annotazione dell'account di servizio del tuo ambiente all'account di servizio Kubernetes.
- Quando utilizzi
KubernetesPodOperator
, specifica lo spazio dei nomi e l'account di servizio Kubernetes nei parametrinamespace
eservice_account_name
.
Cloud Composer 3 utilizza i cluster GKE con Workload Identity. Il server di metadati GKE impiega alcuni secondi per iniziare ad accettare richieste su un pod appena creato. Di conseguenza, i tentativi di autenticazione utilizzando Workload Identity entro i primi secondi di vita di un pod potrebbero non riuscire. Per ulteriori informazioni su questa limitazione, consulta Restrizioni di Workload Identity.
Cloud Composer 2 utilizza i cluster Autopilot che introducono la nozione di classi di computing:
Per impostazione predefinita, se non è selezionata nessuna classe, viene assunta la classe
general-purpose
quando crei pod utilizzandoKubernetesPodOperator
.Ogni classe è associata a proprietà e limiti di risorse specifici. Puoi leggere informazioni in merito nella documentazione di Autopilot. Ad esempio, i pod in esecuzione nella classe
general-purpose
possono utilizzare fino a 110 GiB di memoria.
Configurazione di KubernetesPodOperator
Per seguire questo esempio, inserisci l'intero file kubernetes_pod_operator.py
nella cartella dags/
del tuo ambiente o aggiungi il codice KubernetesPodOperator
pertinente a un DAG.
Le sezioni seguenti spiegano ciascuna configurazione di KubernetesPodOperator
nell'esempio. Per informazioni su ogni variabile di configurazione, consulta il riferimento di Airflow.
Configurazione minima
Per creare un KubernetesPodOperator
, sono necessari solo name
, namespace
del pod in cui eseguire il pod, image
da utilizzare e task_id
.
Quando inserisci il seguente snippet di codice in un DAG, la configurazione utilizza
i valori predefiniti in /home/airflow/composer_kube_config
. Non devi modificare il codice per completare l'attività pod-ex-minimum
.
Configurazione modello
Airflow supporta l'utilizzo di
Jinja Templating.
Devi dichiarare le variabili richieste (task_id
, name
, namespace
e image
) con l'operatore. Come mostrato nell'esempio seguente, puoi
modellare tutti gli altri parametri con Jinja, inclusi cmds
, arguments
,
env_vars
e config_file
.
Senza modificare il DAG o il tuo ambiente, l'attività ex-kube-templates
non va a buon fine a causa di due errori. I log mostrano che questa attività non è riuscita perché non esiste la variabile appropriata (my_value
). Il secondo errore, che puoi ricevere dopo aver corretto il primo errore, indica che l'attività non riesce perché core/kube_config
non è stato trovato in config
.
Per correggere entrambi gli errori, segui i passaggi descritti più avanti.
Per impostare my_value
con gcloud
o con la UI di Airflow:
UI di Airflow
Nell'interfaccia utente di Airflow 2:
Vai alla UI di Airflow.
Nella barra degli strumenti, seleziona Amministrazione > Variabili.
Nella pagina Elenca variabili, fai clic su Aggiungi un nuovo record.
Nella pagina Aggiungi variabile, inserisci le seguenti informazioni:
- Chiave:
my_value
- Val:
example_value
- Chiave:
Fai clic su Salva.
gcloud
Per Airflow 2, inserisci il comando seguente:
gcloud composer environments run ENVIRONMENT \
--location LOCATION \
variables set -- \
my_value example_value
Sostituisci:
ENVIRONMENT
con il nome dell'ambiente.LOCATION
con la regione in cui si trova l'ambiente.
Per fare riferimento a un config_file
personalizzato (un file di configurazione di Kubernetes), esegui l'override dell'opzione di configurazione kube_config
Airflow con una configurazione Kubernetes valida:
Sezione | Chiave | Valore |
---|---|---|
core |
kube_config |
/home/airflow/composer_kube_config |
Attendi qualche minuto per l'aggiornamento dell'ambiente. Poi esegui di nuovo l'attività ex-kube-templates
e verifica che l'attività ex-kube-templates
sia riuscita.
Configurazione completa
Questo esempio mostra tutte le variabili che puoi configurare in
KubernetesPodOperator
. Non è necessario modificare il codice per completare
l'attività ex-all-configs
.
Per maggiori dettagli su ogni variabile, consulta il riferimento di KubernetesPodOperator
Airflow.
Informazioni sul provider Kubernetes CNCF
GKEStartPodOperator e KubernetesPodOperator sono implementati all'interno del provider apache-airflow-providers-cncf-kubernetes
.
Per le note di rilascio non superate per il provider Kubernetes CNCF, fai riferimento al sito web del provider Kubernetes CNCF.
Versione 6.0.0
Nella versione 6.0.0 del pacchetto del provider Kubernetes CNCF,
la connessione kubernetes_default
viene utilizzata per impostazione predefinita in
KubernetesPodOperator
.
Se hai specificato una connessione personalizzata nella versione 5.0.0, questa
viene comunque utilizzata dall'operatore. Per tornare a utilizzare la connessione kubernetes_default
, ti consigliamo di regolare i DAG di conseguenza.
Versione 5.0.0
Questa versione introduce alcune modifiche incompatibili
con le versioni precedenti rispetto alla 4.4.0. I più importanti sono correlati alla connessione kubernetes_default
, che non viene utilizzata nella versione 5.0.0.
- La connessione
kubernetes_default
deve essere modificata. Il percorso di configurazione di Kube deve essere impostato su/home/airflow/composer_kube_config
(come mostrato nella Figura 1) In alternativa, è necessario aggiungereconfig_file
alla configurazioneKubernetesPodOperator
(come mostrato nel seguente esempio di codice).
- Modifica il codice di un'attività utilizzando KubernetesPodOperator nel seguente modo:
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',
...
)
Per ulteriori informazioni sulla versione 5.0.0, consulta le note di rilascio del provider Kubernetes CNC.
Risoluzione dei problemi
Suggerimenti per la risoluzione degli errori dei pod
Oltre a controllare i log delle attività nella UI di Airflow, controlla anche i seguenti log:
Output dello scheduler e dei worker di Airflow:
Nella console Google Cloud, vai alla pagina Ambienti.
Segui il link DAG per il tuo ambiente.
Nel bucket del tuo ambiente, sali di un livello.
Esamina i log nella cartella
logs/<DAG_NAME>/<TASK_ID>/<EXECUTION_DATE>
.
Log dettagliati dei pod nella console Google Cloud, in Carichi di lavoro GKE. Questi log includono il file YAML di definizione dei pod, gli eventi dei pod e i dettagli dei pod.
Codici di reso diversi da zero se utilizzi anche GKEStartPodOperator
Quando utilizzi KubernetesPodOperator
e GKEStartPodOperator
, il codice restituito del punto di ingresso del container determina se l'attività viene considerata riuscita o meno. I codici di reso diversi da zero indicano un errore.
Un pattern comune quando si utilizzano KubernetesPodOperator
e GKEStartPodOperator
è l'esecuzione di uno script shell come punto di ingresso del container per raggruppare più operazioni all'interno del container.
Se stai scrivendo uno script di questo tipo, ti consigliamo di includere
il comando set -e
nella parte superiore dello script
in modo che i comandi con errori nello script terminino lo script e
propaghino l'errore all'istanza dell'attività Airflow.
Timeout pod
Il timeout predefinito per KubernetesPodOperator
è 120 secondi, il che può comportare timeout prima del download di immagini più grandi. Puoi
aumentare il timeout modificando il parametro startup_timeout_seconds
quando crei KubernetesPodOperator
.
In caso di timeout di un pod, il log specifico dell'attività è disponibile nella UI di Airflow. Ad esempio:
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
I timeout dei pod possono verificarsi anche quando l'account di servizio Cloud Composer non dispone delle autorizzazioni IAM necessarie per eseguire l'attività in questione. Per verificarlo, esamina gli errori a livello di pod utilizzando le dashboard di GKE per esaminare i log per il tuo particolare carico di lavoro oppure utilizza Cloud Logging.
Impossibile stabilire una nuova connessione
L'upgrade automatico è abilitato per impostazione predefinita nei cluster GKE. Se un pool di nodi si trova in un cluster in fase di upgrade, potresti visualizzare il seguente errore:
<Task(KubernetesPodOperator): gke-upgrade> Failed to establish a new
connection: [Errno 111] Connection refused
Per verificare se il cluster è in fase di upgrade, nella console Google Cloud vai alla pagina Cluster Kubernetes e cerca l'icona di caricamento accanto al nome del cluster dell'ambiente.