Kubernetes — Executor, KubernetesPodOperator, Pod Mutation Hook
Apache Airflow Official Documentation (in-repo snapshot) — Apache Software Foundation administration-and-deployment/kubernetes.rst (전체)
이 모듈을 다 읽으면
- KubernetesExecutor와 KubernetesPodOperator의 역할 차이를 구분할 수 있다
- pod_mutation_hook이 언제, 어떤 인자를 받아 실행되는지 설명하고 활용 사례를 들 수 있다
Airflow는 K8s 친화적인 프로젝트를 지향하며, 공식 Helm Chart와 Docker 이미지를 통해 K8s 클러스터 안에서 배포·운영할 수 있다. KubernetesExecutor는 모든 Airflow 태스크를 K8s 파드로 실행하는 executor이고, KubernetesPodOperator는 Dag 안에서 파드를 만드는 오퍼레이터다. pod_mutation_hook을 쓰면 두 경우 모두에서 K8s에 보내기 전에 파드 객체를 변형할 수 있다.
Helm Chart, KubernetesExecutor, KubernetesPodOperator
Airflow는 매우 K8s 친화적인 프로젝트를 지향하며, 많은 사용자가 K8s가 제공하는 향상된 안정성과 오토스케일링 옵션을 활용하기 위해 K8s 클러스터 안에서 Airflow를 운영한다. 배포를 정의·설치·업그레이드하는 데 도움이 되는 공식 Helm Chart를 관리하며, 이 Helm Chart는 커뮤니티가 함께 관리·릴리스하는 공식 Docker 이미지와 Dockerfile을 사용한다.
Kubernetes Executor는 모든 Airflow 태스크를 K8s 위에서 각각 별도의 파드로 실행할 수 있게 해준다. 이는 클러스터 전체의 태스크 실행 방식을 결정하는 executor 레벨의 개념이다.
KubernetesPodOperator는 이와 별개로, K8s 위에 파드를 만들 수 있게 해주는 오퍼레이터다 — Dag 안의 한 태스크로서 특정 파드를 실행하고 싶을 때 쓰며, executor 종류와 무관하게 Dag 작성자가 원하는 위치에 배치할 수 있는 태스크 레벨의 도구다.
핵심 포인트
- 공식 Helm Chart는 공식 Docker 이미지/Dockerfile을 사용해 Airflow 배포의 정의·설치·업그레이드를 지원한다
- KubernetesExecutor는 executor 레벨에서 모든 태스크를 파드로 실행하는 클러스터 전역 설정이고, KubernetesPodOperator는 Dag 안에서 특정 파드를 만드는 태스크 레벨 오퍼레이터로 서로 다른 층위의 개념이다
Pod Mutation Hook
``airflow_local_settings.py``는 K8s 클라이언트로 스케줄링을 위해 파드를 보내기 전에 파드 객체를 변형할 수 있는 ``pod_mutation_hook`` 함수를 정의할 수 있게 해준다. 이 함수는 파드 객체에 대한 참조 하나를 단일 인자로 받으며, 그 속성을 직접 바꾸는 것이 기대된다.
이는 예를 들어 KubernetesExecutor나 KubernetesPodOperator가 실행하는 모든 워커 파드에 사이드카나 init 컨테이너를 추가하는 데 쓸 수 있다. 예시 코드는 ``kubernetes.client.models``의 ``V1Pod``를 받아 ``pod.metadata.annotations["airflow.apache.org/launched-by"] = "Tests"``처럼 애노테이션을 추가하는 형태다.
핵심 포인트
- pod_mutation_hook은 K8s에 파드를 실제로 보내기 전 마지막 시점에 파드 객체(V1Pod)를 in-place로 변형하는 훅으로, airflow_local_settings.py에 정의한다
- 대표적인 활용 사례는 KubernetesExecutor·KubernetesPodOperator가 만드는 모든 워커 파드에 사이드카/init 컨테이너나 공통 애노테이션을 일괄 주입하는 것이다