본문 바로가기
Data Engineering/Airflow

Helm Chart로 쿠버네티스에 Airflow설치(KubernetesExecutor 사용)

by 홍띠 2024. 4. 13.
💡 본문에서 설명하는 내용은 아래의 환경이나 설정을 따른다.
- 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