3. タイミングスケジュールDockerカスタムイメージとairflowシリーズの転送パラメータ

この記事では、最初に著者の DockerOperator の試行錯誤プロセスについて説明します。その後の KubernetesPodOperator が最も便利な方法です。

1. [接続] ページでエラーが報告される

[管理] -> [接続] をクリックすると、次のエラーが発生します。

 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

問題の原因: install.sh を再実行すると、このコマンドが見つかりました。再デプロイするたびに fernet-key が変更されるため、以前に暗号化されたパスワードが正しく復号化できません。

[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=

解決策: 毎回再生成されないように、install.sh に固定キーを追加します。

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

次に、接続されている pgsql ライブラリ、airflow-plus データベース内のテーブル接続を見つけ、再構成の前に手動で追加した構成をバックアップし、テーブルをクリアします。以前のシステム データが失われることを心配しないで、実行します。 install.sh、つまりCanです

その後、手動で構成した接続を再度構成して、インストールを再アンインストールした後に問題が発生しないようにします。

2. [接続] で Docker 接続構成を構成します。

この構成では、Conn ID を docker_repo [後で使用します] として指定し、プライベート ウェアハウスのアドレスとユーザー名とパスワードを指定します。

3. 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. 実行するパラメータを渡す

json 文字列を入力し、クリックしてトリガーを実行します

5. エラーの報告と解決

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

前述のvalues.yamlのワーカー構成を変更して、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

マウント後に再インストールすると権限の問題が発生する

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

長年悩んでも当面解決策がない 経験豊富なパートナーにご相談ください

6. Kubernetes PodOperator に基づいて Docker を実行する

この方法は非常に便利で、数分で完了します。

このうち、image_pull_secrets は K8S に設定された Secret で、プライベート ウェアハウスのイメージへのアクセス許可を提供しますが、ここでは詳しく説明しません。

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


公式アカウントのアルゴリズムニッチに注目してください

おすすめ

転載: blog.csdn.net/SJshenjian/article/details/130610483