INTRO
이번에는 Stackable Data Platform(SDP) 를 사용하여 Airflow Application을 K8s에 배포해보겠습니다.
SDP
SDP
(이하 Stackable
)는 데이터 관련 Application 을 K8s상에서 손쉽게 배포,관리 해주게 만드는 Operator 입니다.
Stackable
이 지원하는 오픈소스는 다음과 같습니다.
공식사이트: https://docs.stackable.tech/home/stable/index.html
Stackablectl 설치
Stackable 을 사용하려면 Stackablectl
명령어를 사용해야하므로, Stackablectl
을 설치합니다.
먼저 해당 링크에 접속하여 사용하는 OS 에 알맞게 다운로드 해 줍니다.
공식링크: https://docs.stackable.tech/management/stable/stackablectl/installation
이 게시글에서는 m1 mac 환경을 기준으로 다운로드합니다
- OS환경이 다르다면 사이트에 안내된 명령어를 실행해주세요
#download
wget -O stackablectl https://github.com/stackabletech/stackable-cockpit/releases/download/stackablectl-1.0.0-rc2/stackablectl-aarch64-apple-darwin
#executable 하게 설정
chmod +x stackablectl
#디렉토리 이동
sudo mv stackablectl /usr/local/bin/stackablectl #다양한 명령어가 실행되는 장소
또한 MacOS 의 경우 아래의 내용이 설명되어있는데
If macOS denies the execution of stackablectl
go to Settings → Security & Privacy → General. Here you will see a pop up asking if you want to allow access for stackablectl
. You must allow access.
아무리봐도 일단 General 이라는 팝업이 안보이길래 그냥 넘어갔습니다.
- OS버전 소노마 입니다.
- 해당 팝업을 설정 안했는데도, 아무런 오류가 없었습니다.
실습 환경
실습환경은 GKE이며, 100GB SSD를 갖는 2개의 n2-standard-4타입의 머신으로 진행하였습니다.
또한, GKE에 접근하는 환경은 M1 Mac입니다.
- GKE의 인스턴스 정보는
https://cloud.google.com/compute/docs/general-purpose-machines?hl=ko#n2_series
페이지에서 확인 할 수 있습니다.
Apache Airflow
Apache Airflow
는 일종의 Workflow 관리 플랫폼으로, 데이터엔지니어링 및 데이터처리 워크플로우를 자동화하는데 사용하는 오픈소스입니다.
Airlfow를 사용하여 다양한 데이터처리 작업을 하거나, 스케쥴링을 할수 있고, 의존성을 관리하는 등 다양한 작업을 할 수 있습니다.
특징으로는 DAG(방향 비순환 그래프) 구조를 사용하고 있습니다.
주요 컴포넌트는 아래의 역할을 합니다.
Scheduler
: Airflow의 DAG와 작업들을 모니터링하고 실행 순서와 상태 관리
Worker
: Airflow의 작업을 실행하는 공간
MetadataDatabase
: Airflow에서 실행할 작업에 관한 정보들을 저장
Webserver
: Airflow의 User Interface를 제공
DAG Directory
: Airflow에서 실행할 작업들을 파이프라인 형태로 저장
https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/overview.html
Stackable Airflow
Stackable
에서 지원하는 Airflow를 상세히 확인해보려고 합니다.
다른 Operator들과 마찬가지로 Stackable
또한 CR, CRD
를 활용하여 Airflow를 관리합니다. Stackable
에서는 AirflowCluster와 AirflowDB 를 CR로 정의하고있습니다.
각각의 역할은 다음과같습니다.
AirflowCluster
- Airflow 인스턴스를 구성하기 위한 주요 리소스
- Webserver, Worker, Scheduler의 역할을 정의함
AirflowDB
- AirflowCluster가 처음 배포될때 생성
- 사용자, 권한, 워크플로우, 작업 인스턴스를 저장하는 리소스
- AirflowCluster가 제거되어도, 자동으로 삭제되지 않아서 데이터를 갖고있음
Airflow Operator를 통한 컴포넌트 아키텍쳐는 다음과같습니다.
Stackable Airflow Operator 의존성 작업
Stackable Airflow Operator를 설치하기 전에 Dependency로 사용하는 Postgresql과 Redis를 설치합니다.
Postgresql
은 DAG실행을 위한 메타데이터 저장소
Redis
는 DAG job을 스케쥴링/큐잉 하는 목적으로 사용합니다.
bitnami 헬름 레포를 추가합니다.
helm repo add bitnami https://charts.bitnami.com/bitnami
postgresql
을 배포합니다.
helm install --wait airflow-postgresql bitnami/postgresql --version 12.1.5 \
--set auth.username=airflow \
--set auth.password=airflow \
--set auth.database=airflow
redis
를 배포합니다. master-replica로 구성되어있습니다.
helm install --wait airflow-redis bitnami/redis \
--set auth.password=redis \
--version 17.3.7 \
--set replica.replicaCount=1
배포하면 다음과 같이 나옵니다.
Stackable Airflow Operator 설치
설치하는 방법은 크게 2가지로, stackablectl
을 사용하거나 HelmChart
를 사용하는것입니다. 여기서는 stackablectl
을 사용하겠습니다.
- HelmChart는 airtifacthub.io 에는 존재하지 않고 https://repo.stackable.tech/repository/helm-stable/ 에 존재합니다.
stackablectl로 설치
stackablectl operator install \
commons=23.7.0 \
secret=23.7.0 \
airflow=23.7.0
실행하게되면 우선 stackable-operators 라는 namespace에 각각의 Operator가 배포됩니다.
이때 하나 확인해야할건 하단의 2개의 Secrect operator가 생성되고, 각각 3개의 containter를 갖고있으며
external-provisioner, node-driver-registrar, secret-operator 를 갖고있는것을 확인할 수 있습니다.
또한 각각의 Secret Operator는 서로 다른노드에 배포됨을 확인할 수 있습니다.
이후로는 Airflow 로 명령어를 사용하기위해 Secret을 배포합니다.
airflow-credentials.yaml
---
apiVersion: v1
kind: Secret
metadata:
name: simple-airflow-credentials
type: Opaque
stringData:
adminUser.username: airflow
adminUser.firstname: Airflow
adminUser.lastname: Admin
adminUser.email: airflow@airflow.com
adminUser.password: airflow
connections.secretKey: thisISaSECRET_1234
connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql.default.svc.cluster.local/airflow
connections.celeryResultBackend: db+postgresql://airflow:airflow@airflow-postgresql.default.svc.cluster.local/airflow
connections.celeryBrokerUrl: redis://:redis@airflow-redis-master:6379/0
kubectl apply -f airflow-credentials.yaml
로 배포해주면, credentials이 배포됩니다.
credentials은 Database(postgresql
), Celery Executor(postgresql, redis
) 에 대한 정보를 갖고있음을 확인할 수 있습니다.
Stackble Operator Airflow: AirflowCluster 컴포넌트 구성
CR로 생성된 AirflowCluster는 3개의 컴포넌트를 갖고있습니다.
webserver
: user와 상호작용 하기 위한 웹 UI 대시보드 역할이다.workers
: 각각의 노드(인스턴스). 스케쥴러에 의해 job이 실행된다.scheduler
: job을 트리거 해주며, 백엔드 데이터베이스로 메타데이터를 지속가능하게 해주게합니다.
이제 airflow를 배포합니다.
airflow.yaml
---
apiVersion: airflow.stackable.tech/v1alpha1
kind: AirflowCluster
metadata:
name: airflow
spec:
image:
productVersion: 2.6.1
stackableVersion: 23.7.0
clusterConfig:
executor: CeleryExecutor
loadExamples: true
exposeConfig: false
credentialsSecret: simple-airflow-credentials
webservers:
roleGroups:
default:
replicas: 1
workers:
roleGroups:
default:
replicas: 2
schedulers:
roleGroups:
default:
replicas: 1
배포하게 되면 먼저 airflow pod 하나가 생성됩니다(현재 Completed 된 상태)
이후 나머지 postgresql, redis 등등이 생성됩니다(현재 만들어지고 있는 상태)
airflow pod를 자세히 보기위해 로그를 확인해봅니다
head로 찍었을때를 보면 해당상태에서 DB가 initialization 된 것을 확인할 수 있습니다.
그리고, 해당 pod는 하나의 Job 이라는것을 확인해야합니다.
여기서 알 수 있는 내용은, AirflowCluster를 배포하면, 하나의 Pod가 맨처음 배포되는데
해당 pod는 하나의 Airflow Job을 구성했고,
해당 Job이 Done되었을때 나머지 컴포넌트가 배포된다는것입니다.
또한 배포되어있는 전체 Pod를 확인해보면, worker만 서로 다른 노드에 배포되어있는것을 확인할 수 있습니다.
Stackble Operator Airflow: AirflowCluster 초기화 및 대시보드
배포는 잘 되었으니 본격적으로 사용하기위해서 DB를 초기화시켜줍니다.
kubectl wait airflowdb/airflow \
--for jsonpath='{.status.condition}'=Ready \
--timeout 300s
이렇게하면 initialize
가 되었습니다.
대시보드를 확인하기 위해서 Port-forwarding 시켜서 확인해보겠습니다.
- TMI: 개인적으로 포트포워딩할때는 lens를 사용해서 하는데, k9s보다 직관적이여서 좋아합니다.
Start를 누르게 되면 자동으로 브라우저창이 열리며 localhost:8080 에 접근하게됩니다.
로그인 정보는 airflow-credentials.yaml
파일에서
stringData.adminUser.username 으로 정한 값(airflow
), stringData.adminUser.password 으로 정한 값(airflow
) 입니다.
이렇게 하면 성공적으로 떠있는것을 확인할 수 있습니다.
예시로 지정되어있는 example_branch_operator를 확인해보겠습니다.
Graph탭에서 조금 더 자세하게 DAG구조를 확인할 수 있습니다.
DAG: example_branch_operator 왼쪽에 토글 버튼을 누르면, 해당 DAG가 실행되는데
진행 상태(현재 어떤 태스크 까지 진행했는지, 잘 진행되고 있는지 등등) 을 알 수 있습니다.
- 예제 태스크로 진행한
example_branch_operator
는 오래걸리는 작업이 많이 없어서 6초만에 끝났습니다.
또한 Code탭에서는 해당 파일의 소스코드를 확인할 수 있습니다.
Outro
이번 게시글에서는 Stackable Data Platform(SDP) 을 사용하여 Airflow를 배포해보고, 간단하게 DAG도 돌려봤습니다.
예전기억으로는 Artifacthub에서 제공하는 공식 HelmChart를 사용하여 배포하면 에러가 발생했고, 삽질했지만 에러를 해결하지 못해서 결국 다른방식으로 배포했었습니다.
그때의 기억 때문에 Stackable로 Airflow를 배포하는 게시글을 만들어 보게 되었고, 순조롭게 되길래 신기… 했습니다.
나중에 시간되면 kubernetes operator를 사용해서 DAG를 돌려본다던가.. 하는 게시글을 작성해보고싶네요.
이렇게 6주간의 DOIK2(Database Operator In Kubernetes 2번째) 스터디가 마무리 되었습니다. 저는 명색이 데이터엔지니어인데도 불구하고, 데이터베이스와 쿠버네티스에 대한 지식이 많이 부족했는데요. 이번 스터디를 통해서 많이 배울 수 있어서 뜻깊은시간이었습니다.
스터디를 진행해 주신 가시다님께 많은 감사드립니다!
'외부활동' 카테고리의 다른 글
[AEWS] 2기 스터디: 스터디 기본지식 + EKS내용정리 (0) | 2024.03.10 |
---|---|
코딩테스트 준비 플랫폼 추천: 코드트리 (0) | 2024.03.03 |
[DOIK2] 스터디: Strimzi로 Kafka Cluster 배포하기 (0) | 2023.11.18 |
[DOIK2] 스터디: 조금 자세하게 설명한 Kafka (0) | 2023.11.15 |
구글 클라우드 스터디잼: GenAI 수료후기 (1) | 2023.11.11 |