3. Programación de tiempo Imagen personalizada de Docker y parámetros de transferencia de la serie de flujo de aire

Este artículo describe primero el proceso de prueba y error del DockerOperator del autor, y el último KubernetesPodOperator es la forma más conveniente

1. Error informado en la página de Conexiones

Cuando hago clic en Admin -> Conexiones, encuentro el siguiente error

 File "/home/airflow/.local/lib/python3.7/site-packages/airflow/models/connection.py", line 238, in get_password
    return fernet.decrypt(bytes(self._password, 'utf-8')).decode()
  File "/home/airflow/.local/lib/python3.7/site-packages/cryptography/fernet.py", line 194, in decrypt
    raise InvalidToken
cryptography.fernet.InvalidToken

Causa del problema: al volver a ejecutar install.sh, encontramos este comando, ya que la clave de fernet cambiará cada vez que volvamos a implementar, la contraseña cifrada previamente no se puede descifrar correctamente.

[root@sha-216 airflow-plus]#  echo Fernet Key: $(kubectl get secret --namespace airflow-plus airflow-fernet-key -o jsonpath="{.data.fernet-key}" | base64 --decode)
Fernet Key: ekc3MHl6VmSSSNnY0pjSSSSZk94WkVxl5T3E2OUtXT0s=

Solución: Agregamos una clave fija a install.sh para que no se regenere cada vez

--set webserverSecretKey=ekc3MHl6VmSSSNnY0pjSSSSZk94WkVxl5T3E2OUtXT0s=
--set fernetKey=ekc3MHl6VmNnY0pjZk94WkVxRVRmUkl5T3E2OUtXT0s=

Luego encontramos la biblioteca pgsql conectada, la conexión de la tabla en la base de datos airflow-plus, hacemos una copia de seguridad de la configuración agregada manualmente antes de la reconfiguración y luego borramos la tabla, no se preocupe por la pérdida de los datos del sistema anterior, y luego ejecutamos install.sh que es Can

Luego podemos configurar la conexión configurada manualmente nuevamente, para que el problema no ocurra después de volver a desinstalar la instalación.

2. Configure la configuración de conexión de Docker en Conexión

Esta configuración especifica el ID de Conn como docker_repo [se usará más adelante], especifica la dirección del almacén privado, el nombre de usuario y la contraseña

3. Escribe un espejo para ejecutar DAG

from airflow.providers.docker.operators.docker import DockerOperator
import pendulum
from airflow import DAG

with DAG(
    dag_id="comm_add_dag",
    schedule_interval=None,
    start_date=pendulum.datetime(2023, 5, 8, tz="Asia/Shanghai"),
    catchup=True,
    description="小区自动化入库"
) as dag:
    t1 = DockerOperator(
        # 刚才定义的conn id
        docker_conn_id="docker_repo",
        # WebServer中点击Admin -> Providers -> Docker对应的Version,如果是auto,可能会报错
        api_version="2.2.0",
        image='comm-add:1.0.1',
        # 临沂为我们的传参,python代码中, 镜像中部分代码
        # @ click.command()
        # @ click.option('--city', default="all", help='要计算的城市')
        command='python main.py --city {
   
   {dag_run.conf["city"] if "city" in dag_run.conf}} else all',
        task_id='comm_add'
    )
    t1

4. Pasar parámetros para ejecutar

Ingrese la cadena json y haga clic para ejecutar Trigger

5. Informe y resolución de errores

requests.exceptions.ConnectionError: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory'))
[2023-05-10, 01:46:33 UTC] {local_task_job.py:154} INFO - Task exited with return code 1
[2023-05-10, 01:46:33 UTC] {local_task_job.py:264} INFO - 0 downstream tasks scheduled from follow-on schedule check

Modificamos la configuración del trabajador en valores.yaml mencionado anteriormente para montar docker.sock

workers:
  resources:
    #limits:
    #  cpu: 4000m
    #  memory: 12288Mi
    requests:
      cpu: 100m
      memory: 1024Mi
  extraVolumes:
    - name: dockersock
      hostPath:
        path: /var/run/docker.sock
  extraVolumeMounts:
    - name: dockersock
      mountPath: /var/run/docker.sock

Se produce un problema de permisos después de reinstalar después del montaje

File "/home/airflow/.local/lib/python3.7/site-packages/docker/transport/unixconn.py", line 30, in connect
    sock.connect(self.unix_socket)
PermissionError: [Errno 13] Permission denied

Después de lanzar durante mucho tiempo, no hay solución por el momento. Los socios experimentados pueden discutirlo.

6. Ejecute Docker basado en Kubernetes PodOperator

¡Este método es muy conveniente y se puede hacer en minutos! ! ! ! !

Entre ellos, image_pull_secrets es el Secreto configurado en K8S, que proporciona autorización de acceso a la imagen del almacén privado, que no se explicará en detalle aquí.

from airflow.providers.docker.operators.docker import DockerOperator
from airflow.providers.cncf.kubernetes.operators.kubernetes_pod import KubernetesPodOperator
import pendulum
from airflow import DAG
from docker.types import Mount
from kubernetes.client import models as k8s

with DAG(
    dag_id="comm_add_dag",
    schedule_interval=None,
    start_date=pendulum.datetime(2023, 5, 8, tz="Asia/Shanghai"),
    catchup=True,
    description="自动化入库"
) as dag:
    production_task = KubernetesPodOperator(namespace='airflow-plus',
                                            image="comm-add:1.0.1",
                                            image_pull_secrets=[k8s.V1LocalObjectReference("nexus-registry-secret")],
                                            cmds=["python", "main.py"],
                                            arguments=["--city", '{
   
   {dag_run.conf["city"] if "city" in dag_run.conf}} else all'],
                                            name="comm_add",
                                            task_id="comm_add",
                                            get_logs=True
                                            )

    production_task


Bienvenido a prestar atención al nicho de algoritmo de cuenta oficial

Supongo que te gusta

Origin blog.csdn.net/SJshenjian/article/details/130610483
Recomendado
Clasificación