본문 바로가기
Data Engineering/Airflow

[Airflow] git-sync 설정하기

by 홍띠 2024. 3. 31.
💡 Git-sync는 무엇인가?
kubernetes에서 Airflow를 구성할 때 사이드카 컨테이너로 동작하면서 외부 repository의 dag의 코드를 Airflow 컨테이너에 sync해주는 역할을 합니다. 이를 통해 git repo의 특정 브랜치를 공통개발환경의 SOT(Source of Truth)로 활용 할 수 있습니다.

Docker Compose Airflow 에서 설정

기본적으로 git-sync는 쿠버네티스 Airflow에 사이드카패턴으로 사용되기 때문에, docker compose 환경에서 사용하는 방법을 찾기가 제한적이다. 아래 이미지를 활용해서 간단하게 구성이 가능한데, 공식적으로 제공되거나 많이 사용 되는 이미지는 아니기 때문에 주의가 필요하다.

https://github.com/data-burst/airflow-git-sync

 

GitHub - data-burst/airflow-git-sync: Sync DAG changes from Git to Airflow

Sync DAG changes from Git to Airflow. Contribute to data-burst/airflow-git-sync development by creating an account on GitHub.

github.com

1. SSH Key 설정

  • SSH 키 생성
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/test/.ssh/id_rsa): #key 저장 위치 설정
Enter passphrase (empty for no passphrase): # 엔터
Enter same passphrase again: # 엔터
  • 위에서 생성한 key의 public key 복사
cat id_rsa.pub | pbcopy
  • sync할 깃헙 레포지토리 접속 → Settings → Deploy keys → Add deploy key

  • Key에 붙여넣기 후 Add key
    Allow wire access 하지 않으면 read-only 권한 부여됨

2. docker-compose.yml 작성

공식 홈페이지에서 안내되는 코드에 아래 사항만 추가&수정해주면 됨

  • git-sync 추가
  git-sync:
    image: databurst/git-sync:latest
    volumes:
      - ./project_data:/app/sync #sync할 코드를 로컬에 mount
      - <key_path>/id_rsa:/root/.ssh/id_rsa #1에서 생성한 프라이빗키를 git-sync 컨테이너에 mount
    environment:
      REPO_URL: git@github.com:hongjy21/test.git #git repo ssh clone url
      GIT_BRANCH: main # sync할 브랜치 설정
      DIRECTORY_NAME: project # git-sync 컨테이너에 clone해오는 위치
      DESTINATION_PATH: /app/sync # sync할 코드 경로
      SUBFOLDER_PATH: dags # git repo에서 sync대상인 위치 (optional)
      INTERVAL: 10 # sync 주기
  • airflow-common에서 dags 마운트 경로 변경
  volumes:
#    - ${AIRFLOW_PROJ_DIR:-.}/dags:/opt/airflow/dags
    - ./project_data:/opt/airflow/dags # git-sync 컨테이너에서 코드 mount한 로컬 경로로 변경

 

Helm차트에서 git-sync 사용

Helm 차트에서는 옵션으로 git sync를 제공하기 때문에 더 간편하게 사용 할 수 있다.

1. SSH Key 설정

  • SSH Key 생성과 Git Repo 설정은 위와 동일한 방식
  • k8s secret에 private key를 등록해야 함
kubectl create secret generic airflow-ssh-secret \
  --from-file=gitSshKey=/<key_path>/id_rsa \
  --from-file=id_rsa.pub=/<key_path>/id_rsa.pub \
  -n airflow

2.. Helm Chart values.yaml 수정

  • values.yaml에서 git-sync 관련 파라미터 값 설정
dags:
	(생략)
  gitSync:
    enabled: true
    # git repo ssh clone url
    repo: git@github.com:hongjy21/test.git
    branch: main # sync할 브랜치 설정
    rev: HEAD
    # ref: v2-2-stable
    depth: 1
    # the number of consecutive failures allowed before aborting
    maxFailures: 0
    # repo 내부 sync path
    subPath: "dags"
    # 위에서 생성한 ssh-key secret 지정
    sshKeySecret: airflow-ssh-secret
    # sync 주기 설정.
    period: 5s # Go-style의 시간 주기 
    wait: ~ # 하위버전 호환용. 초단위 시간

    containerName: git-sync
    uid: 65533

    # When not set, the values defined in the global securityContext will be used
    securityContext: {}
    #  runAsUser: 65533
    #  runAsGroup: 0

    securityContexts:
      container: {}

    # container level lifecycle hooks
    containerLifecycleHooks: {}

    # Mount additional volumes into git-sync. It can be templated like in the following example:

    extraVolumeMounts: []
    env: []

    resources: {}
    #  limits:
    #   cpu: 100m
    #   memory: 128Mi
    #  requests:
    #   cpu: 100m
    #   memory: 128Mi