Estoy ejecutando Celery Executor y estoy tratando de ejecutar un script de python en KubernetesPodOperator. A continuación se muestran ejemplos de lo que he intentado que no funcionó. ¿Qué estoy haciendo mal?
Correr guión
org_node = KubernetesPodOperator( namespace='default', image="python", cmds=["python", "somescript.py" "-c"], arguments=["print('HELLO')"], labels={"foo": "bar"}, image_pull_policy="Always", name=task, task_id=task, is_delete_operator_pod=False, get_logs=True, dag=dag ) Ejecutando la función load_users_into_table()
def load_users_into_table(postgres_hook, schema, path): gdf = read_csv(path) gdf.to_sql('users', con=postgres_hook.get_sqlalchemy_engine(), schema=schema) org_node = KubernetesPodOperator( namespace='default', image="python", cmds=["python", "somescript.py" "-c"], arguments=[load_users_into_table], labels={"foo": "bar"}, image_pull_policy="Always", name=task, task_id=task, is_delete_operator_pod=False, get_logs=True, dag=dag )El script somescript.py debe estar en Docker image .
Paso 1 : creemos una imagen https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ .
FROM python:3.8 # copy requirement.txt from local to container COPY requirements.txt requirements.txt # install dependencies into container (geopandas, sqlalchemy) RUN pip install -r requirements.txt # copy the python script from local to container COPY somescript.py somescript.py ENTRYPOINT [ "python", "somescript.py"] Paso 2 : cree y envíe la imagen al public Docker repository https://hub.docker.com .
NB: kubernetes_pod_operator busca la imagen del repositorio de public docker repo
# build image docker build -t my-python-img:latest . # test if your image works perfectly docker run my-python-img:latest # push image. docker tag my-python-img username/my-python-img docker push username/my-python-img docker pull username/my-python-img paso 3: Para no crear k8s task .
p = KubernetesPodOperator( namespace='default', image='username/my-python-img:latest', labels={'dag-id': dag.dag_id}, name='airflow-my-image-pod', task_id='load-users', in_cluster=False, #False: local, True: cluster cluster_context='microk8s', config_file='/usr/local/airflow/include/.kube/config', is_delete_operator_pod=True, get_logs=True, dag=dag )Si no entiende de dónde proviene el archivo de configuración, consulte aquí: https://www.astronomer.io/docs/cloud/stable/develop/kubepodoperator-local .
Finalmente: quiero mencionar algo importante cuando se trabaja con bases de datos (credenciales). Kubernetes ofrece el secret de uso para asegurar información confidencial. https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/stable/operators.html
KubernetesPodOperator lanza un pod de Kubernetes que ejecuta un contenedor como se especifica en los argumentos del operador.
En el primer ejemplo sucede lo siguiente:
image ) de hub.docker.com (el registro de imagen predeterminado)["python", "somescript.py" "-c"] (el parámetro cmd )["print('HELLO')"] (el parámetro de arguments )Entonces, el comando completo que se ejecuta en el contenedor es
python somescript.py -c print('HELLO') Obviamente, la imagen oficial de Python de Docker Hub no tiene somescript.py en su directorio de trabajo. Incluso si lo hubiera hecho, probablemente no habría sido el que escribiste. Es por eso que el comando falla con algo como:
python: can't open file 'somescrit.py': [Errno 2] No such file or directory En el segundo ejemplo, ocurre más o menos lo mismo que en el primer ejemplo, pero el comando que se ejecuta en el contenedor (nuevamente basado en los parámetros cmd y arguments ) es
python somescript.py -c None ( None es la representación de cadena del valor de retorno de load_users_into_table() )
Este comando falla por las mismas razones que en el primer ejemplo.
Podría crear una imagen de Docker con somescript.py y todas sus dependencias. Empuje la imagen a un registro de imágenes. Especifique la imagen, ENTRYPOINT y CMD en los parámetros correspondientes de KubernetesPodOperator.