Skip to content
cover-dataengineering

사이드카 컨테이너로 Airflow 기능 확장하기

  • DataEngineering

📅 August 01, 2021

⏱️4 min read

Airflow 2.1 버전부터 공식 Helm Chart가 정식 릴리즈 되었습니다. 오늘은 공식 차트에서 사용할 수 있는 기능 중 extraContainers 옵션을 활용하는 방법을 3가지 예시를 통해 소개해보려 합니다.


Sidecar Container

분산 컨테이너 환경에서 사이드카 패턴이란 Pod 안에서 두 개 이상의 컨테이너로 구성되어 있는 형태를 말합니다. 컨테이너들은 서로 네트워크 또는 볼륨을 공유할 수 있습니다. 사이드카 컨테이너를 활용하면 다음과 장점을 가져갈 수 있습니다.

기존 로직의 변경 없이 새로운 기능 추가: 가끔 일부 기능 추가를 위해 Airflow 저장소 코드를 수정하는 경우가 생길 수 있습니다. 하지만 이렇게 한번 수정하고 나면 이후에 버전 업데이트할 때마다 새로운 버전 브랜치와 병합해야 하는 번거로움이 생깁니다. 만약 원하는 기능이 사이드카 컨테이너를 활용할 수 있다면 기존 저장소의 변경 없이 새로운 기능을 추가할 수 있습니다.

컨테이너 재사용: 사내에서 개발 환경에 따라 또는 접근 권한에 따라 Airflow 인스턴스를 여러 개 구성하고 운영하는 경우가 많습니다. 사이드카 컨테이너로 구성한 기능은 재사용이 가능하기 때문에 새로 배포한 Airflow 인스턴스에 쉽게 적용할 수 있습니다.


Airflow extraContainers

Airflow Helm Chart에서는 extraContainers 옵션을 통해 사이드카 컨테이너를 scheduler, webserver, worker에 정의할 수 있습니다. 제가 기여한 옵션입니다! (https://github.com/apache/airflow/pull/13735)

이제 몇 가지 예시를 통해 어떻게 활용할 수 있는지 알아보겠습니다.


1. S3 Sync Container

s3-sidecar

AWS MWAA 처럼 S3를 DAG 저장소로 활용하고 싶은 경우에 S3 Sync 사이드카 컨테이너를 통해 구현할 수 있습니다. S3 Sync 사이드카 컨테이너는 S3 버킷에 올라간 파일을 DAG 경로에 주기적으로 동기화하는 컨테이너입니다. 만약 DAG Serialiaztion 옵션이 활성화되어 있다면 scheduler에만 정의하면 됩니다.

예시는 아래와 같습니다.

scheduler:
  extraContainers:
    - name: s3-sync
      image: myrepository/s3-sync:latest
      imagePullPolicy: Always
      volumeMounts:
        - name: dags
          mountPath: /opt/airflow/dags
      env:
        - name: AWS_BUCKET
          value: airflow-src
        - name: KEY_PATH
          value: dags
        - name: DEST_PATH
          value: /opt/airflow/dags
        - name: INTERVAL
          value: "10"

위와 같이 인스턴스마다 서로 다른 설정이 필요한 값들은 환경변수로 구성할 수 있도록 이미지를 정의합니다. S3 접근 권한은 직접 credential을 사용하는 것보다 EKS의 IRSA를 활용해서 Role 기반으로 제어하는 편이 좋습니다. Dockerfile은 s3sync 저장소를 참고하시면 됩니다.


2. Permission Sync Container

2.0 부터 추가된 DAG level Permission을 사용하는 경우, airflow sync-perm 명령어를 통해 DAG 권한을 갱신해주어야 Role에 권한제어가 정상적으로 반영됩니다. Permission Sync 컨테이너는 webserver에서 주기적으로 sync-perm 명령어를 수행하는 역할을 합니다.

예시는 아래와 같습니다.

webserver:
  extraContainers:
    - name: sync-perm
      image: apache/airflow:2.1.2-python3.7
      imagePullPolicy: Always
      command: ["/bin/sh"]
      args: ["-c", "while true; do airflow sync-perm; sleep 60; done"]
      volumeMounts:
        - name: dags
          mountPath: "/opt/airflow/dags"
      env:
        - name: AIRFLOW__CORE__SQL_ALCHEMY_CONN
          valueFrom:
            secretKeyRef:
              key: connection
              name: airflow-dev-airflow-metadata

보시면 Airflow 이미지와 정의된 connection을 재활용 합니다. 컴포넌트 컨테이너와 분리되어 있으니 사이드카에서 발생하는 로그만 따로 확인할 수도 있습니다.


3. Kerberos Container

클러스터에 접근하기 위해 Kerberos 인증이 필요한 경우, Kerberos 컨테이너를 활용하면 인증 토큰 갱신을 자동화할 수 있습니다. Airflow 공식 문서의 production-deployment 부분을 보면 아래와 같은 내용이 있습니다.

In the Kubernetes environment, this can be realized by the concept of side‐car, where both Kerberos token refresher and worker are part of the same Pod. Only the Kerberos side‐car has access to Keytab secret and both containers in the same Pod share the volume, where temporary token is written by the side‐ care container and read by the worker container.

대략 K8S 환경에서 사이드카 형태로 구성하는 방법에 대한 내용입니다. 이를 그림으로 그려보면 아래와 같습니다.

kerberos

kerberos 컨테이너는 keytab이 존재하는 볼륨에 접근하고 kinit 명령어를 통해 ccache를 갱신합니다. airflow 인스턴스들의 worker는 해당 볼륨의 갱신된 토큰을 통해 인증을 달성할 수 있습니다. prod, dev와 같이 여러 airflow를 사용하더라도 kerberos의 컨테이너에서 한번만 캐시 업데이트를 수행하면 됩니다.

예시는 아래와 같습니다.

worker:
  extraContainers:
    - name: worker-kerberos
      image: myrepository/kerberos:latest
      imagePullPolicy: Always
      volumeMounts:
        - name: keytab
          mountPath: /etc/keytab
      env:
        - name: INTERVAL
          value: "3600"
        - name: KRB5_CONFIG
          value: /etc/keytab/krb5.conf

...

extraVolumes:
  - name: keytab
    persistentVolumeClaim:
      claimName: airflow-keytab
extraVolumeMounts:
  - name: keytab
    mountPath: "/etc/keytab"

위와 같이 keytab이 존재하는 볼륨을 마운트해주어야 합니다.


정리

이외에도 사이드카 컨테이너를 잘 활용한다면 다양한 기능으로 확장할 수 있습니다. extraInitContainers 옵션도 있으니 함께 활용해보면 좋을 것 같습니다.

← PrevNext →
  • Powered by Contentful
  • COPYRIGHT © 2020 by @swalloow