Airflow KubernetesExecutor 차트 업데이트

이번에는 Airflow 를 여러벌 올려야 하는 일이 생겼다.
이참에 고친다는 마음으로 helm chart 도 정비해서 다른 사람들한테 공유가 가능한 수준으로 좀 다듬어 졌다.

전체 구성도

일단 지난번 포스트(https://humbledude.github.io/blog/2019/07/12/airflow-on-k8s/) 의 그림과 조금 다르지만 뭐 같다고 봐도 되겠쥬

다른 점은 ConfigMap 으로 Airflow 설정을 한다는 점인데, 아래에 좀더 자세히 설명이 되어있다.

이전 글에도 설명했지만, 간단히 Airflow + KubernetesExecutor 의 동작 방식을 설명한다면~

  • scheduler 는 DAG 내에 정의된 각 task 마다 worker pod 을 만들어 띄운다.
  • worker pod 의 init container 는 git-sync 를 통해 dag 를 다운받고, 필요한 task 를 실행한다.
  • 만약 worker pod 이 실행해야 될 task 가 KubernetesPodOperator 였다면, task 에 정의된 대로 pod 를 하나 더 띄우고, 해당 pod 의 작업이 잘 동작하는지 모니터링 하는 역할을 한다.
  • 만약 worker pod 이 실행해야 될 task 가 그 외의 Operator 였다면 (예를 들어, PythonOperator), 해당 동작은 worker container 가 직접 실행한다.

따라서 KubernetesPodOperator 외에 다른 어떤 Operator 들을 실행하려면, 실행 환경을 worker 의 이미지에 다 담아야 한다.
예를 들어, 나는 SqoopOperator 를 실행하려고 했는데, 그러려면 worker image 에 sqoop 명령어와, 각종 권한 관련 환경 셋팅을 해야 한다는 것이다.

그리고 Airflow 가 worker 를 띄우는 명령어는 entrypoint 를 대체하도록 되어있어서 (적어도 현재까지는, 1.10.12) entrypoint 에 환경설정을 하는 스크립트를 넣으려면 약간의 꼼수가 필요했다.
이거는 나중에 필요한 사람이 있다면 또 글을 쓰게 될지도 ㅎㅎ
(참고 : https://github.com/apache/airflow/issues/8495)

Helm Chart

이번에 chart 를 개발하면서 주로 변경한 점은, ConfigMap 을 통해 Airflow 설정을 관련 Pod 들이 공유 할 수 있도록 한 것이다.
Airflow 설정은 초기 chart 에서는 cfg 파일에 정의해서 썼었다.
그렇게 하면 그 수많은 Airflow 설정값을 일일이 chart 의 항목으로 옮겨 적어야 되서 좀 고생스러웠는데…
Airflow 에서는 환경변수를 통해 설정값을 조절하는 방법도 제공하고 있었다.

(참조 : https://airflow.apache.org/docs/stable/howto/set-config.html)

export AIRFLOW__{SECTION}__{KEY}={VALUE}

위와 같은 포맷으로 설정값을 지정하면 Airflow 의 cfg 파일에 override 해서 설정이 적용된다.

그리고 Kubernetes 에서는 ConfigMap 의 모든 값을 환경변수로 가져오는 기능이 있다.
https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#configure-all-key-value-pairs-in-a-configmap-as-container-environment-variables

따라서, Airflow 의 configuration 정의를 모두 ConfigMap 으로 넣고, webserver, scheduler, worker 가 같은 ConfigMap 을 사용해 환경변수를 설정하면, configuration 을 복붙할수 있다는거다.

chart 는 아래에 업로드 되어있다.
https://github.com/humbledude/airflow_k8s_chart

많은 사람들에게 공유할 차트로 쓰기에도 아직 좀 부족한데.. 그냥 일단 블로깅 용으로 공유 한다 ㅎㅎ

  • helm v2 에서만 테스트 해본점
  • ingress 가 없을때 딱히 예외처리가 없는 점
  • github 에서 DAG fetch 하는거 외에 딱히 옵션이 없는 점

등등이 좀 허접한 것이지만
참고하실 분이 있다면 쓰라는 의미에서~
chart 내의 airflow_config_env 에 Airflow configuration 항목을 집어 넣으면 그게 다 ConfigMap 으로 생성된다.

직접 코드를 보면 다 이해가 되실 것으로..
(직접 짜기가 고생스럽지만, 짜 놓은 차트는 별거 없다는 helm 의 세계..)