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