Data Engineering/Airflow

🚀 Docker Desktop에서 Apache Airflow 설치 및 DAG 파일 마운트하기

ygtoken 2025. 2. 26. 13:02
728x90

 

Kubernetes 환경에서 Apache Airflow를 설치하고, DAG 파일을 로컬 디렉터리에서 마운트하는 방법을 정리해보았습니다.

특히 Docker Desktop (Mac M1)에서 hostPath를 올바르게 설정하여 DAGs를 공유하는 방법

Helm을 사용하여 기존 Airflow 환경을 업그레이드하는 방법을 포함합니다.

 


 

✅ 1. Docker Desktop 환경에서 Airflow 설치 개요

 

Docker Desktop의 내장 Kubernetes 기능을 사용하면 로컬 개발 환경에서 손쉽게 Apache Airflow를 실행할 수 있습니다.

그러나, DAG 파일을 로컬 디렉터리에서 관리하려면 Docker Desktop의 파일 공유 설정과 Kubernetes hostPath 설정이 필요합니다.

 

📌 목표

1. Helm을 사용하여 Airflow 최초 배포

2. 로컬 디렉터리를 Kubernetes Pod에 마운트하여 DAGs 공유

3. Helm Chart의 values.yaml을 수정하여 업그레이드

4. Docker 및 Kubernetes에서 DAG 마운트 여부 확인

✅ 2. Docker Desktop 설정 (File Sharing)

 

Airflow의 DAGs 디렉터리를 마운트하려면 Docker Desktop에서 파일 공유 설정을 활성화해야 합니다.

 

🔹 MacOS (M1, Intel 공통)

 

1️⃣ Docker Desktop 실행

2️⃣ Settings → Resources → File Sharing 이동

3️⃣ 다음 경로 추가:

/Users/your-username/workspace/airflow/dags

4️⃣ Apply & Restart 클릭 후 Docker Desktop 재시작

✅ 3. DAGs 마운트 테스트 (Docker에서 확인)

 

Helm을 이용해 Kubernetes에서 배포하기 전에, Docker에서 DAGs가 정상적으로 마운트되는지 확인해야 합니다.

docker run --rm -v /Users/your-username/workspace/airflow/dags:/mnt ubuntu ls /mnt

정상적으로 마운트되었을 경우 출력 예시

helloworld.py
openapi_to_mysql_dag.py
readme.md

📌 출력된 파일 목록이 로컬 디렉터리와 동일하면, 마운트가 정상적으로 작동하는 것!

 

🔹 컨테이너 내부에서 직접 확인하려면 -it 옵션 사용

docker run -it -v /Users/your-username/workspace/airflow/dags:/mnt ubuntu /bin/bash

이후 컨테이너 내부에서 ls -l /mnt 실행

exit 입력 후 종료

✅ 4. Airflow Helm Chart 다운로드 및 배포

 

Apache Airflow는 Helm을 통해 Kubernetes에 쉽게 배포할 수 있습니다.

 

🔹 4-1. Helm Chart 저장소 추가 및 업데이트

helm repo add apache-airflow https://airflow.apache.org
helm repo update

🔹 4-2. Helm을 사용하여 Airflow 최초 배포

helm install airflow apache-airflow/airflow --namespace airflow --create-namespace -f values.yaml

✅ 5. values.yaml 수정 후 Airflow 업그레이드

 

배포된 Airflow의 설정을 변경하기 위해 Helm을 이용한 업그레이드를 수행합니다.

특히, PostgreSQL 보안 설정, Worker/Scheduler 리소스 조정, Scheduler의 InitContainer 추가를 적용합니다.

 

📌 MacOS M1 환경에 맞춘 values.yaml 설정

# Airflow Webserver 설정 및 기본 관리자 계정
webserver:
  service:
    type: LoadBalancer
  resources:
    requests:
      memory: 1024Mi
      cpu: 500m
    limits:
      memory: 2048Mi
      cpu: 1000m
  livenessProbe:
    initialDelaySeconds: 60
    periodSeconds: 20
  readinessProbe:
    initialDelaySeconds: 60
    periodSeconds: 20
  extraVolumeMounts:
  - name: dags
    mountPath: /opt/airflow/dags
  extraVolumes:
  - name: dags
    hostPath:
      path: /Users/your-username/workspace/airflow/dags  # ✅ MacOS M1 환경에서 사용 가능한 경로

auth:
  defaultUser:
    enabled: true
    username: admin
    password: admin

# PostgreSQL 설정 (Airflow 메타데이터 DB용)
postgresql:
  primary:
    securityContext:
      runAsUser: 0
      fsGroup: 0
  volumePermissions:
    enabled: true

# Worker 설정
workers:
  securityContext:
    runAsUser: 0
    fsGroup: 0
  resources:
    requests:
      memory: 1024Mi
      cpu: 250m
    limits:
      memory: 1536Mi
      cpu: 500m
  extraInitContainers:
  - name: fix-worker-logs-permissions
    image: busybox:latest
    command:
    - sh
    - -c
    - "mkdir -p /opt/airflow/logs/worker && chmod -R 755 /opt/airflow/logs/worker"
    volumeMounts:
    - name: logs
      mountPath: /opt/airflow/logs
  extraVolumeMounts:
  - name: dags
    mountPath: /opt/airflow/dags
  extraVolumes:
  - name: dags
    hostPath:
      path: /Users/your-username/workspace/airflow/dags  # ✅ MacOS M1 환경에서 사용 가능한 경로

# Scheduler 설정
scheduler:
  securityContext:
    runAsUser: 0
    fsGroup: 0
  resources:
    requests:
      memory: 1024Mi
      cpu: 500m
    limits:
      memory: 2048Mi
      cpu: 1000m
  extraInitContainers:
  - name: fix-logs-permissions
    image: busybox:latest
    command:
    - sh
    - -c
    - "mkdir -p /opt/airflow/logs/scheduler && chmod -R 755 /opt/airflow/logs/scheduler"
    volumeMounts:
    - name: logs
      mountPath: /opt/airflow/logs
  extraVolumeMounts:
  - name: dags
    mountPath: /opt/airflow/dags
  extraVolumes:
  - name: dags
    hostPath:
      path: /Users/your-username/workspace/airflow/dags  # ✅ MacOS M1 환경에서 사용 가능한 경로

# MySQL 프로바이더 의존성 해결을 위한 추가 pip 패키지 설치
airflow:
  extraPipPackages: "apache-airflow-providers-mysql"

✅ 6. Helm을 사용하여 Airflow 업그레이드

 

설정이 완료되면 Helm을 사용하여 Airflow를 업그레이드합니다.

helm upgrade --install airflow apache-airflow/airflow --namespace airflow -f values.yaml

🚀 이제 Kubernetes에서 Airflow가 업그레이드된 설정으로 실행됩니다!

 

✅ 7. Kubernetes에서 DAGs 마운트 여부 확인

 

🔹 7-1. Webserver Pod 내부에서 DAGs 확인

kubectl exec -it airflow-webserver-0 -n airflow -- ls -l /opt/airflow/dags

👉 DAG 파일이 보이면 정상적으로 마운트된 것입니다!

 

🔹 7-2. 볼륨 마운트 정보 확인

kubectl describe pod airflow-webserver-0 -n airflow | grep -A10 "Volumes"

 

728x90