💡 본문에서 설명하는 내용은 아래의 환경이나 설정을 따른다.
- Airflow version: 2.5.3
- AWS 클라우드를 사용하며 EKS에서 쿠버네티스 운영
- Airflow Executor: KubernetesExecutor
- Helm Chart: 공식차트 사용 (User Community 차트 X)
초기 설정
- 네임스페이스 생성
kubectl create ns airflow
- helm repo 추가
# airflow repo 추가
helm repo add apache-airflow https://airflow.apache.org
# repo 업데이트
helm repo update
- values.yaml 가져오기
airflow/chart/values.yaml at main · apache/airflow
Apache Airflow - A platform to programmatically author, schedule, and monitor workflows - apache/airflow
github.com
Airflow 차트 설치에 필요한 설정 수행
Webserver Secret Key
필수 설정은 아니지만, production에서는 불필요한 restart를 막기 위해 static webserver secret key를 만들것을 권장
- Secret key 생성
kubectl create secret generic webserver-secret --from-literal="webserver-secret-key=$(python3 -c 'import secrets; print(secrets.token_hex(16))')"
- helm chart 설정
# Flask secret key for Airflow Webserver: `[webserver] secret_key` in airflow.cfg
webserverSecretKey: ~
webserverSecretKeySecretName: webserver-secret
Fernet Key 설정
- (신규 생성 시) Fernet key 생성
# 패키지 설치 필요: $ pip install 'apache-airflow[crypto]'
from cryptography.fernet import Fernet
fernet_key= Fernet.generate_key()
print(fernet_key.decode())
- 쿠버네티스 시크릿 생성
kubectl create secret generic fernet-key --from-literal="fernet-key=<생성한 fernet key>"
- helm chart 설정
# Fernet key settings
# Note: fernetKey can only be set during install, not upgrade
fernetKey: ~
fernetKeySecretName: fernet-key
에어플로우 metastore DB 설정
- DB 커넥션 정보를 시크릿으로 생성
kubectl create secret generic database-secret --from-literal=connection=
<db_connection_url>/airflow
- helm chart 설정
# Airflow database & redis config
data:
# Airflow >= 2.4.0 에서는 metadata와 resultBackend DB가 동일하다면, metadataSecretName만 설정해 주어도 됨
metadataSecretName: database-secret
resultBackendSecretName: ~
brokerUrlSecretName: ~
Remote Logging 설정
Kubernetes executor를 사용하는 경우에는 각 태스크가 각각의 pods에서 실행되기 때문에 로그를 유실하지 않기 위해서는 별도의 설정이 필요하다. 여기서는 외부 스토리지(S3)에 로그를 쌓는 방식을 선택했다.
- IAM role for service account (IRSA) 생성 - eksctl 사용
아래 예시에서는 S3전체 권한을 부여했지만, 필요 버킷과 권한을 한정해서 policy를 생성해서 ARN을 입력하면 좋다.
eksctl create iamserviceaccount --cluster <EKS 클러스터 이름> --name airflow-logging-sa --namespace airflow --attach-policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess --approve
- helm chart 설정
# Airflow webserver settings
webserver:
(생략)
# Create ServiceAccount
serviceAccount:
# default value is true
# ref: <https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/>
automountServiceAccountToken: false
# Specifies whether a ServiceAccount should be created
create: false
# The name of the ServiceAccount to use.
# If not set and create is true, a name is generated using the release name
name: airflow-logging-sa
# Annotations to add to webserver kubernetes service account.
annotations: {}
# Airflow Worker Config
#kubernetes executor를 사용하는 경우 태스크 파드 템플릿도 workers의 설정을 따름
workers:
# Create ServiceAccount
serviceAccount:
# default value is true
# ref: <https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/>
automountServiceAccountToken: false
# Specifies whether a ServiceAccount should be created
create: false
# The name of the ServiceAccount to use.
# If not set and create is true, a name is generated using the release name
name: airflow-logging-sa
# Annotations to add to worker kubernetes service account.
annotations: {}
config:
(생략)
logging:
remote_logging: 'True'
logging_level: 'INFO'
remote_base_log_folder: 's3://airflow-bucket/logs/'
remote_log_conn_id: 'aws_logging_conn'
# delete_worker_pods: ''
encrypt_s3_logs: 'True'
- Airflow Connection 생성
Helm 차트로 Airflow 설치 후 위에서 설정한 remote_log_conn_id 으로 airflow connection을 AWS 타입으로 생성해주면 된다. (key, secret 입력안해도 됨)
values.yaml 편집사항
위에서 설정한 것 외에 필요에 따라서 값들을 설정해 준다.
아래 yaml은 변경한 부분의 값만 가져오고 나머지 부분은 생략되어 있다.
# For new installations - it is recommended to set it to True to follow standard naming conventions
useStandardNaming: true
# Airflow executor
# One of: LocalExecutor, LocalKubernetesExecutor, CeleryExecutor, KubernetesExecutor, CeleryKubernetesExecutor
executor: "KubernetesExecutor"
# Environment variables for all airflow containers
env:
- name: "AIRFLOW__CORE__PARALLELISM" # 병렬성 설정, 동시 실행되는 최대 태스크 수.(default: 32)
value: "5"
# Airflow Worker Config
workers:
tolerations: #worker용 특정 노드에 배포되도록 toleration 설정. 노드에 taint 설정 되어있어야함
- key: "job"
effect: "NoExecute"
value: "airflow"
persistence: #statfulset에 따른 설정으로 보이는데, kubernetesExecutor에서는 적용되지 않는것 같음
# Enable persistent volumes
enabled: false
# Volume size for worker StatefulSet
size: 10Gi
# Airflow Triggerer Config
triggerer:
enabled: true
persistence: # airflow version >=2.6.0 이상에서 statefulset으로 배포 원하면 적용가능
# Enable persistent volumes
enabled: false
# Configuration for the redis provisioned by the chart
redis:
enabled: false # kubernetes executor에서는 사용안함
# Configuration for postgresql subchart
postgresql:
enabled: false
Helm Release 설치
필요한 설정을 마쳤으면 아래 명령어를 이용해서 Ariflow를 설치해준다.
helm upgrade --install airflow apache-airflow/airflow -f <편집한 values.yaml> -n airflow
'Data Engineering > Airflow' 카테고리의 다른 글
Airflow에서 custom timetable로 자유롭게 스케쥴 설정하기 (0) | 2024.07.28 |
---|---|
[Airflow] git-sync 설정하기 (0) | 2024.03.31 |
docker-compose로 Airflow 설치하기 (0) | 2024.03.17 |
Airflow Rest API를 사용하여 DAG 호출하기 (0) | 2024.01.13 |
Airflow를 알아보자 (0) | 2023.05.14 |