【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ハンズオン目次
おおまかな処理の流れ
将处理过程大致分为以下两个部分。
-
- 构建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する