Cloud Composer 1 | Cloud Composer 2 | Cloud Composer 3
En esta página, se describe cómo usar KubernetesPodOperator para implementar pods de Kubernetes desde Cloud Composer en el clúster de Google Kubernetes Engine que forma parte de tu entorno de Cloud Composer.
KubernetesPodOperator inicia Pods de Kubernetes en el clúster de tu entorno. En comparación, los operadores de Google Kubernetes Engine ejecutan pods de Kubernetes en un clúster especificado, que puede ser un clúster independiente que no está relacionado con tu entorno. También puedes crear y borrar clústeres con los operadores de Google Kubernetes Engine.
KubernetesPodOperator es una buena opción si necesitas lo siguiente:
- Dependencias de Python personalizadas que no están disponibles a través del repositorio público de PyPI.
- Dependencias binarias que no están disponibles en stock Imagen del trabajador de Cloud Composer.
Antes de comenzar
- Recomendamos usar la versión más reciente de Cloud Composer. Como mínimo, esta versión debe ser compatible como parte de la política de baja y asistencia.
- Asegúrate de que tu entorno tenga recursos suficientes. Iniciar Pods en un entorno con escasez de recursos puede hacer que Airflow errores del trabajador y del programador de Airflow.
Configura los recursos de tu entorno de Cloud Composer
Cuando creas un entorno de Cloud Composer, especificas la parámetros de rendimiento, incluidos los parámetros de rendimiento clúster. Iniciar Pods de Kubernetes en el clúster de entorno puede causar por los recursos del clúster, como la CPU o la memoria. Debido a que el programador y los trabajadores de Airflow están en el mismo clúster de GKE, los programadores y los trabajadores no funcionarán correctamente si la competencia provoca escasez de recursos.
Para evitar escasez de recursos, realiza una o más de las siguientes acciones:
- (Recomendado) Crea un grupo de nodos
- Aumenta la cantidad de nodos de tu entorno
- Especifica el tipo de máquina adecuado
Crea un grupo de nodos
La forma preferida de evitar la escasez de recursos en el entorno de Cloud Composer es crear un nuevo grupo de nodos y configurar los pods de Kubernetes para que se ejecuten solo con recursos de ese grupo.
Console
En la consola de Google Cloud, ve a la página Entornos.
Haz clic en el nombre de tu entorno.
En la página Detalles del entorno, ve a la pestaña Configuración del entorno.
En Recursos > Clúster de GKE sigue el vínculo Ver detalles del clúster.
Crea un grupo de nodos como se describe en Cómo agregar un grupo de nodos.
gcloud
Determina el nombre del clúster de tu entorno:
gcloud composer environments describe ENVIRONMENT_NAME \ --location LOCATION \ --format="value(config.gkeCluster)"
Reemplaza lo siguiente:
ENVIRONMENT_NAME
por el nombre del entorno.LOCATION
por la región en la que se encuentra el entorno.
El resultado contiene el nombre del clúster de tu entorno. Por ejemplo: puede ser
europe-west3-example-enviro-af810e25-gke
.Crea un grupo de nodos como se describe en Agrega un grupo de nodos.
Aumenta la cantidad de nodos de tu entorno
Si aumentas la cantidad de nodos de tu entorno de Cloud Composer, aumentará la capacidad de procesamiento disponible para tus trabajadores. Este aumento no proporciona recursos adicionales para las tareas que requieren más CPU o RAM de las que proporciona el tipo de máquina especificado.
Para aumentar el recuento de nodos, actualiza tu entorno.
Especifica el tipo de máquina adecuado
Durante la creación de entornos de Cloud Composer, puedes especificar un tipo de máquina. A fin de garantizar que haya recursos disponibles, especifica el tipo de máquina para el tipo de procesamiento que se produce en tu entorno de Cloud Composer.
Configuración mínima
Para crear un KubernetesPodOperator, solo se requieren los parámetros name
, image
y task_id
del pod. /home/airflow/composer_kube_config
contiene credenciales para autenticarse en GKE.
Airflow 2
Airflow 1
Configuración de afinidad de Pods
Cuando configuras el parámetro affinity
en KubernetesPodOperator,
controlar en qué nodos programar Pods; por ejemplo, nodos solo en una
grupo de nodos. En este ejemplo, el operador se ejecuta solo en grupos de nodos
pool-0
y pool-1
. Los nodos de tu entorno de Cloud Composer 1 están en default-pool
, por lo que tus pods no se ejecutan en los nodos de tu entorno.
Airflow 2
Airflow 1
Según se configura en el ejemplo, la tarea falla. Si observas los registros, la tarea
falla porque los grupos de nodos pool-0
y pool-1
no existen.
Para asegurarte de que los grupos de nodos de values
existan, realiza cualquiera de los siguientes cambios de configuración:
Si creaste un grupo de nodos anteriormente, reemplaza
pool-0
ypool-1
con los nombres de tus grupos de nodos y vuelve a subir el DAG.Crea un grupo de nodos con el nombre
pool-0
opool-1
. Puedes crear ambos, pero la tarea necesita solo uno para tener éxito.Reemplaza
pool-0
ypool-1
condefault-pool
, que es el grupo predeterminado que utiliza Airflow. A continuación, vuelve a subir el DAG.
Después de realizar los cambios, espera unos minutos a que se actualice tu entorno.
Luego, vuelve a ejecutar la tarea ex-pod-affinity
y verifica que el ex-pod-affinity
tarea se realice de forma correcta.
Configuración adicional
En este ejemplo, se muestran los parámetros adicionales que puedes configurar en KubernetesPodOperator.
Para obtener más información sobre los parámetros, consulta la Referencia de Airflow para KubernetesPodOperator Para obtener información sobre el uso de Secrets de Kubernetes y ConfigMaps, consulta Cómo usar Secrets y ConfigMaps de Kubernetes. Para obtener información sobre el uso de plantillas de Jinja con KubernetesPodOperator, consulta Cómo usar plantillas de Jinja.
Airflow 2
Airflow 1
Utiliza las plantillas de Jinja
Airflow admite plantillas de Jinja en DAG.
Debes declarar los parámetros obligatorios de Airflow (task_id
, name
y
image
) con el operador. Como se muestra en el siguiente ejemplo, puedes crear plantillas de todos los demás parámetros con Jinja, incluidos cmds
, arguments
, env_vars
y config_file
.
El parámetro env_vars
del ejemplo se establece desde una variable de Airflow llamada my_value
. DAG de ejemplo
Obtiene su valor de la variable de plantilla vars
en Airflow. Airflow tiene más variables que proporcionan acceso a diferentes tipos de información. Por ejemplo, puedes usar la variable de plantilla conf
para acceder a los valores de las opciones de configuración de Airflow. Para obtener más información
de variables disponibles en Airflow, consulta
Referencia de plantillas en Airflow
en la documentación de Google Cloud.
Sin cambiar el DAG ni crear la variable env_vars
, la tarea ex-kube-templates
del ejemplo falla porque la variable no existe. Crea esta variable en la IU de Airflow o con Google Cloud CLI:
IU de Airflow
Ve a la IU de Airflow.
En la barra de herramientas, selecciona Administrador > Variables.
En la página Variable de lista, haz clic en Agregar un registro nuevo.
En la página Agregar variable, ingresa la siguiente información:
- Key:
my_value
- Val:
example_value
- Key:
Haz clic en Guardar.
Si tu entorno usa Airflow 1, ejecuta el siguiente comando:
Ve a la IU de Airflow.
En la barra de herramientas, selecciona Administrador > Variables.
En la página Variables, haz clic en la pestaña Crear.
En la página Variable, ingresa la siguiente información:
- Key:
my_value
- Val:
example_value
- Key:
Haz clic en Guardar.
gcloud
Ingresa el siguiente comando:
gcloud composer environments run ENVIRONMENT \
--location LOCATION \
variables set -- \
my_value example_value
Si tu entorno usa Airflow 1, ejecuta el siguiente comando:
gcloud composer environments run ENVIRONMENT \
--location LOCATION \
variables -- \
--set my_value example_value
Reemplaza lo siguiente:
ENVIRONMENT
por el nombre del entorno.LOCATION
por la región en la que se encuentra el entorno
El siguiente ejemplo demuestra cómo usar las plantillas de Jinja con KubernetesPodOperator:
Airflow 2
Airflow 1
Usa Secrets de Kubernetes y ConfigMaps
Un Secret de Kubernetes es un objeto que contiene datos sensibles. Un ConfigMap de Kubernetes es un objeto que contiene datos no confidenciales en pares clave-valor.
En Cloud Composer 2, puede crear Secrets y ConfigMaps con Google Cloud CLI, API o Terraform y, luego, accede a ellas desde KubernetesPodOperator
Información acerca de los archivos de configuración YAML
Cuando creas un Secret o un ConfigMap de Kubernetes con Google Cloud CLI y la API, proporcionas un archivo en formato YAML. Este archivo debe seguir el mismo formato que usan los Secrets y ConfigMaps de Kubernetes. Documentación de Kubernetes proporciona muchas muestras de código de ConfigMaps y Secrets. Para comenzar, puedes ver la página Cómo distribuir credenciales de forma segura con Secrets y ConfigMaps.
Al igual que en los Secrets de Kubernetes, usa el base64. cuando defines valores en Secrets.
Para codificar un valor, puedes usar el siguiente comando (esta es una de muchas formas para obtener un valor codificado en base64):
echo "postgresql+psycopg2://root:example-password@127.0.0.1:3306/example-db" -n | base64
Resultado:
cG9zdGdyZXNxbCtwc3ljb3BnMjovL3Jvb3Q6ZXhhbXBsZS1wYXNzd29yZEAxMjcuMC4wLjE6MzMwNi9leGFtcGxlLWRiIC1uCg==
Los siguientes dos ejemplos de archivos YAML se usan en muestras más adelante en esta guía. Ejemplo de archivo de configuración YAML para un Secret de Kubernetes:
apiVersion: v1
kind: Secret
metadata:
name: airflow-secrets
data:
sql_alchemy_conn: cG9zdGdyZXNxbCtwc3ljb3BnMjovL3Jvb3Q6ZXhhbXBsZS1wYXNzd29yZEAxMjcuMC4wLjE6MzMwNi9leGFtcGxlLWRiIC1uCg==
Otro ejemplo en el que se muestra cómo incluir archivos. Al igual que en el ejemplo anterior, primero codifica el contenido de un archivo (cat ./key.json | base64
) y, luego, proporciona este valor en el archivo YAML:
apiVersion: v1
kind: Secret
metadata:
name: service-account
data:
service-account.json: |
ewogICJ0eXBl...mdzZXJ2aWNlYWNjb3VudC5jb20iCn0K
Un archivo de configuración YAML de ejemplo para un ConfigMap. No necesitas usar el base64 en ConfigMaps:
apiVersion: v1
kind: ConfigMap
metadata:
name: example-configmap
data:
example_key: example_value
Administra Secrets de Kubernetes
En Cloud Composer 2, puedes crear secretos con Google Cloud CLI y kubectl
:
Obtén información sobre el clúster de tu entorno:
Ejecuta el siguiente comando:
gcloud composer environments describe ENVIRONMENT \ --location LOCATION \ --format="value(config.gkeCluster)"
Reemplaza lo siguiente:
ENVIRONMENT
por el nombre de tu entornoLOCATION
es la región en la que se encuentra el entorno de Cloud Composer.
El resultado de este comando usa el siguiente formato:
projects/<your-project-id>/zones/<zone-of-composer-env>/clusters/<your-cluster-id>
.Para obtener el ID del clúster de GKE, copia el resultado después de
/clusters/
(termina en-gke
)Para obtener la zona, copia el resultado después de
/zones/
.
Conéctate a tu clúster de GKE con el siguiente comando:
gcloud container clusters get-credentials CLUSTER_ID \ --project PROJECT \ --zone ZONE
Reemplaza lo siguiente:
CLUSTER_ID
: Es el ID del clúster del entorno.PROJECT_ID
: El ID del proyectoZONE
por la zona en la que se encuentra el clúster del entorno
Crea secretos de Kubernetes:
Los siguientes comandos demuestran dos enfoques diferentes para crear Secretos de Kubernetes. El enfoque de
--from-literal
usa pares clave-valor. El enfoque--from-file
usa el contenido del archivo.Para crear un Secret de Kubernetes proporcionando pares clave-valor, ejecuta el siguiente comando: En este ejemplo, se crea un Secret llamado
airflow-secrets
que tiene un camposql_alchemy_conn
con el valor detest_value
kubectl create secret generic airflow-secrets \ --from-literal sql_alchemy_conn=test_value
Para crear un Secret de Kubernetes proporcionando contenido del archivo, ejecuta el comando siguiente comando. En este ejemplo, se crea un Secret con el nombre
service-account
que tiene el camposervice-account.json
con el valor tomado del contenido de un archivo./key.json
local.kubectl create secret generic service-account \ --from-file service-account.json=./key.json
Usa Secrets de Kubernetes en tus DAG
En este ejemplo, se muestran dos formas de usar Secrets de Kubernetes: como entorno variable y como un volumen activado por el Pod.
Se configura el primer Secret, airflow-secrets
a una variable de entorno de Kubernetes llamada SQL_CONN
(en lugar de una
Airflow o variable de entorno de Cloud Composer).
El segundo Secret, service-account
, activa service-account.json
, un archivo con un token de cuenta de servicio, en /var/secrets/google
.
A continuación, se muestra cómo se ven los objetos Secret:
Airflow 2
Airflow 1
El nombre del primer Secret de Kubernetes se define en la variable secret_env
.
Este Secret se llama airflow-secrets
. El parámetro deploy_type
especifica
que debe exponerse como una variable de entorno. La variable de entorno
el nombre es SQL_CONN
, como se especifica en el parámetro deploy_target
. Por último, la
de la variable de entorno SQL_CONN
se establece en el valor de
Tecla sql_alchemy_conn
.
El nombre del segundo Secret de Kubernetes se define en el archivo secret_volume
de salida. Este Secret se llama service-account
. Se expone como un volumen, como se especifica en el parámetro deploy_type
. La ruta del archivo que se activará, deploy_target
, es /var/secrets/google
. Por último, el key
del secreto que se almacena en deploy_target
es service-account.json
.
La configuración del operador tiene el siguiente aspecto:
Airflow 2
Airflow 1
Información sobre el proveedor de Kubernetes de CNCF
KubernetesPodOperator se implementa en el proveedor apache-airflow-providers-cncf-kubernetes
.
Para obtener notas de la versión detalladas del proveedor de Kubernetes para CNCF, consulta Sitio web del proveedor de Kubernetes de CNCF.
Versión 6.0.0
En la versión 6.0.0 del paquete del proveedor de Kubernetes de CNCF,
la conexión kubernetes_default
se usa de forma predeterminada en KubernetesPodOperator.
Si especificaste una conexión personalizada en la versión 5.0.0, el operador seguirá usándola. Para volver a usar la conexión kubernetes_default
, es posible que debas ajustar tus DAG según corresponda.
Versión 5.0.0
Esta versión incorpora algunos cambios incompatibles con versiones anteriores
en comparación con la versión 4.4.0. Los más importantes se relacionan con la conexión kubernetes_default
, que no se usa en la versión 5.0.0.
- Se debe modificar la conexión
kubernetes_default
. La ruta de acceso de configuración de Kubernetes debe establecerse en/home/airflow/composer_kube_config
(como se muestra en la siguiente figura). Como alternativa,config_file
debe se agregará a la configuración de KubernetesPodOperator (como se muestra en siguiente ejemplo de código).
- Modifica el código de una tarea con KubernetesPodOperator de la siguiente manera:
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',
...
)
Para obtener más información sobre la versión 5.0.0, consulta las notas de la versión del proveedor de CNCF Kubernetes.
Soluciona problemas
En esta sección, se proporcionan consejos para solucionar problemas de KubernetesPodOperator comunes problemas:
Visualiza registros
Cuando soluciones problemas, puedes revisar los registros en el siguiente orden:
Registros de tareas de Airflow:
En la consola de Google Cloud, ve a la página Entornos.
En la lista de entornos, haz clic en el nombre de tu entorno. Se abrirá la página Detalles del entorno.
Ve a la pestaña DAG.
Haz clic en el nombre del DAG y, luego, en la ejecución del DAG para ver los detalles. y registros.
Registros del programador de Airflow:
Ve a la página Detalles del entorno.
Ve a la pestaña Registros.
Inspeccionar los registros del programador de Airflow
Los registros de pods en la consola de Google Cloud, en las cargas de trabajo de GKE. Estos registros incluyen el archivo YAML de definición de Pod, los eventos de Pods y Detalles del Pod.
Códigos de retorno distintos de cero
Cuando usas KubernetesPodOperator (y GKEStartPodOperator), los el código de retorno del punto de entrada del contenedor determina si la tarea se considerada exitosa o no. Los códigos de retorno distintos de cero indican un error.
Un patrón común es ejecutar una secuencia de comandos de shell como punto de entrada del contenedor para varias operaciones en el contenedor.
Si escribes una secuencia de comandos de este tipo, recomendamos que incluyas el comando set -e
en la parte superior de la secuencia de comandos para que sus comandos con error finalicen la secuencia y propaguen el error a la instancia de tarea de Airflow.
Tiempos de espera de los pods
El tiempo de espera predeterminado para KubernetesPodOperator es de 120 segundos,
puede provocar tiempos de espera antes de que se descarguen las imágenes más grandes. Puedes
aumenta el tiempo de espera alterando el parámetro startup_timeout_seconds
cuando
debes crear el KubernetesPodOperator.
Cuando se agota el tiempo de espera de un Pod, el registro específico de la tarea está disponible en la IU de Airflow. Por ejemplo:
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
Los tiempos de espera de Pods también pueden ocurrir Cuenta de servicio de Cloud Composer carece de los permisos de IAM necesarios para realizar la tarea en mano. Si deseas verificar esto, revisa los errores en el nivel del pod mediante los Paneles de GKE para ver los registros de tu carga de trabajo específica o usa Cloud Logging.
No se pudo establecer una conexión nueva
La actualización automática está habilitada de forma predeterminada en los clústeres de GKE. Si un grupo de nodos está en un clúster que se está actualizando, es posible que veas el siguiente error:
<Task(KubernetesPodOperator): gke-upgrade> Failed to establish a new
connection: [Errno 111] Connection refused
Para verificar si tu clúster se está actualizando, en la consola de Google Cloud, ve a Clústeres de Kubernetes y busca el ícono de carga junto nombre del clúster del entorno.