【Airflow on Kubernetes】DockerイメージのbuildとPodのdeployの仕組みについて

总结

Airflowでは、Kubernetes用のDockerイメージの作成スクリプトと、Podのdeploy用のスクリプトが用意されている。
GitHUB: https://github.com/apache/airflow

调查了这些脚本实际执行了什么处理。

只需要一种选项,用中文将以下内容进行同义改写:

版本

    airflow-1.10.3

目录

    【Airflow on Kubernetes】目次

関連記事

    Kubernetesハンズオン目次

おおまかな処理の流れ

将处理过程大致分为以下两个部分。

    1. 构建Docker镜像。

scripts/ci/kubernetes/docker/build.sh

部署Pod。

scripts/ci/kubernetes/kube/deploy.sh

在接下来的部分,我们将详细追踪每个处理步骤。

构建Docker镜像.

追踪 build.sh 文件的处理内容,以构建 Docker 镜像。

実際に実行させる場合は、以下の様にする。

$ sudo ./scripts/ci/kubernetes/docker/build.sh

执行build.sh命令,创建airflow的Docker镜像。

在build.sh的第45行中执行compile.sh。

docker run -it --rm -v ${AIRFLOW_ROOT}:/airflow \
    -w /airflow ${PYTHON_DOCKER_IMAGE} ./scripts/ci/kubernetes/docker/compile.sh

在 build.sh 的文件中执行 compile.sh

当在compile.sh的第32行执行setup.py时,会在主机操作系统上生成一个名为~/airflow/dist/的目录,并且在该目录下会生成一个名为apache-airflow-2.0.0.dev0.tar.gz的文件。这个文件就是airflow的源代码。

# apache-airflow-2.0.0.dev0.tar.gzが生成される
python setup.py compile_assets sdist -q

compile.shでairflowのtarファイルが作成されると、build.sh#L50で、先程生成されたapache-airflow-2.0.0.dev0.tar.gzが、scripts/ci/kubernetes/docker/airflow.tar.gzにリネームしてコピーされる。

cp $AIRFLOW_ROOT/dist/*.tar.gz ${DIRNAME}/airflow.tar.gz

build.shの中でairflowのDockerイメージをbuildする

build.sh#L51で、docker buildが実行される。

cd $DIRNAME && docker build --pull $DIRNAME --tag=${IMAGE}:${TAG}

このときに、このDockerfileが読み込まれる。

Dockerfile 的处理

在Dockerfile的第45行,将先前生成的主机操作系统的scripts/ci/kubernetes/docker/airflow.tar.gz复制到容器内。

# コンテナ内にCOPY
COPY airflow.tar.gz /tmp/airflow.tar.gz

在Dockerfile中,将执行airflow-test-env-init.sh

次にDockerfile#L48で、airflow-test-env-init.shが実行される。

COPY airflow-test-env-init.sh /tmp/airflow-test-env-init.sh

すると、airflow-test-env-init.sh#L23で、コンテナ内の/usr/local/lib/python3.6/site-packages/airflow/example_dags/を、PersistentVolumeのmount先である/root/airflow/dags/にコピーする。

# example_dags/とcontrib/example_dags/をPersistentVolumeにコピー
cd /usr/local/lib/python3.6/site-packages/airflow && \
cp -R example_dags/* /root/airflow/dags/ && \
cp -R contrib/example_dags/example_kubernetes_*.py /root/airflow/dags/ && \
cp -a contrib/example_dags/libs /root/airflow/dags/ && \

build.sh的处理已经完成。

部署

追踪deploy.sh脚本的处理步骤,以便部署Pod。

如果要实际执行,请按照以下方式操作:
使用“-d”选项,选择将dags_folder的添加模式设置为persistent_mode或git_mode中的一种。

  usage: ./scripts/ci/kubernetes/kube/deploy.sh options
  OPTIONS:
    -d Use PersistentVolume or GitSync for dags_folder. Available options are "persistent_mode" or "git_mode"

进行

$ sudo ./scripts/ci/kubernetes/kube/deploy.sh -d {persistent_mode,git_mode}

执行deploy.sh

运行deploy.sh脚本,部署Pod。

当执行时,会将scripts/ci/kubernetes/kube/templates文件夹中的模板文件中的必要部分替换,并生成到scripts/ci/kubernetes/kube/build下。
使用生成的manifest文件执行kubectl apply命令。

$ ls -1 scripts/ci/kubernetes/kube/templates/
airflow.template.yaml
configmaps.template.yaml
init_git_sync.template.yaml

初始容器

ci/kubernetes/kube/templates/airflow.template.yamlを元にして生成された、scripts/ci/kubernetes/kube/build/airflow.yamlをapplyすると、airflow.yaml#L44で定義されているInitContainerが実行され、deployの際にInitContainerでもairflow-test-env-init.shが実行される。

在这里,容器中的/usr/local/lib/python3.6/site-packages/airflow/example_dags/将被复制到Pod的PersistentVolume的挂载点/root/airflow/dags/上。

airflow.template.yaml文件中的第44行

    spec:
      initContainers:
      - name: "init"
        image: {{AIRFLOW_IMAGE}}:{{AIRFLOW_TAG}}
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - name: airflow-configmap
          mountPath: /root/airflow/airflow.cfg
          subPath: airflow.cfg
        - name: {{INIT_DAGS_VOLUME_NAME}}
          mountPath: /root/airflow/dags
        - name: test-volume
          mountPath: /root/test_volume
        env:
        - name: SQL_ALCHEMY_CONN
          valueFrom:
            secretKeyRef:
              name: airflow-secrets
              key: sql_alchemy_conn
        command:
          - "bash"
        args:
          - "-cx"
          - "./tmp/airflow-test-env-init.sh"

deploy.sh的处理已经完成。

dagsの確認

检查Pod内部:/root/airflow/dags/以及/usr/local/lib/python3.6/site-packages/airflow/example_dags/,发现文件存在。

我进入Pod里去确认一下。

$ sudo kubectl exec -it airflow-xxxxxxxxxx-xxxxx /bin/bash

检查Pod内的/usr/local/lib/python3.6/site-packages/airflow/example_dags/。

root@airflow-xxxxxxxxxx-xxxxx:/# ls -1 /usr/local/lib/python3.6/site-packages/airflow/example_dags/
__init__.py
__pycache__
docker_copy_data.py
example_bash_operator.py
example_branch_operator.py
example_branch_python_dop_operator_3.py
example_docker_operator.py
example_http_operator.py
example_latest_only.py
example_latest_only_with_trigger.py
example_passing_params_via_test_command.py
example_pig_operator.py
example_python_operator.py
example_short_circuit_operator.py
example_skip_dag.py
example_subdag_operator.py
example_trigger_controller_dag.py
example_trigger_target_dag.py
example_xcom.py
subdags
test_utils.py
tutorial.py

查看Pod中的 /root/airflow/dags/ 以下的内容。

root@airflow-xxxxxxxxxx-xxxxx:/# ls -1 /root/airflow/dags/
__init__.py
__pycache__
docker_copy_data.py
example_bash_operator.py
example_branch_operator.py
example_branch_python_dop_operator_3.py
example_docker_operator.py
example_http_operator.py
example_kubernetes_executor.py
example_kubernetes_executor_config.py
example_kubernetes_operator.py
example_latest_only.py
example_latest_only_with_trigger.py
example_passing_params_via_test_command.py
example_pig_operator.py
example_python_operator.py
example_short_circuit_operator.py
example_skip_dag.py
example_subdag_operator.py
example_trigger_controller_dag.py
example_trigger_target_dag.py
example_xcom.py
libs
subdags
test_utils.py
tutorial.py

虽然两者都有dag文件,但是/root/airflow/dags/文件夹里的文件数量更多。
这是通过查看airflow-test-env-init.sh可以得知的,原因是复制了example_dags/以及contrib/example_dags/下的文件。

cp -R example_dags/* /root/airflow/dags/ && \
cp -R contrib/example_dags/example_kubernetes_*.py /root/airflow/dags/ && \
cp -a contrib/example_dags/libs /root/airflow/dags/ && \

查看Pod的日志的方法

指定Pod名称和容器名称。

$ sudo kubectl logs -f pod/airflow--xxxxxxxxxx-xxxxx -c {webserver,scheduler}

Hackする

同期されるdagファイルを変更する場合

airflow-test-env-init.sh#L23
の以下の箇所を変更することで、同期されるdagファイルを変更することができる。

cp -R example_dags/* /root/airflow/dags/ && \
cp -R contrib/example_dags/example_kubernetes_*.py /root/airflow/dags/ && \
cp -a contrib/example_dags/libs /root/airflow/dags/ && \

如何更改PersistentVolume的挂载路径

修改以下两个卷的定义。

airflowのファイル群のmount先

scripts/ci/kubernetes/kube/volumes.yaml

postgresのデータのmount先

scripts/ci/kubernetes/kube/postgres.yaml

将元数据数据库从默认的PostgreSQL更改为MySQL。

【在Kubernetes上的Airflow】将默认的PostgreSQL元数据数据库更改为MySQL。

将Airflow在Kubernetes上的默认元数据数据库从PostgreSQL转换为MySQL。

查看日志的方法

当发生部署时的问题时,可以按照以下步骤检查各种容器的日志。

$ sudo kubectl logs -f airflow-xxxxxxxxxx-xxxxx init
$ sudo kubectl logs -f airflow-xxxxxxxxxx-xxxxx webserver
$ sudo kubectl logs -f airflow-xxxxxxxxxx-xxxxx scheduler

请查阅

    • 【KubernetesのPersistentVolume】その1- 外部ストレージをPodにmountする

 

    【KubernetesのPersistentVolume】その2- Dynamic Provisionerを使ってNFSサーバーをPodにmountする
广告
将在 10 秒后关闭
bannerAds