이번 시간에는 multi-node로 이루어진 kubernetes 환경에서 apache airflow 를 설치하는 과정을 공유하려 합니다.
필자는 on-premise 환경에 구성된 kubernetes 에 설치를 진행하였습니다.
원활한 진행을 위해서는 kubernetes 의 default storage class 가 있어야합니다.
helm init
helm 설치
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
https://helm.sh/ko/docs/intro/install/
helm repo 를 업데이트
helm repo add apache-airflow https://airflow.apache.org
helm repo update apache-airflow
helm apache-airflow yaml 템플릿 가져오기
helm show values apache-airflow/airflow > values.yaml
이대로 배포해도 되지만 values.yaml 을 설정하여 여러가지 설정을 바꾸어줄 수 있다.
Airflow executor 변경
기존 default인 celecyExecutor 대신 kubernetesExecutor로 설정한다.
이렇게 되면 기존 worker container가 계속 띄워져있지 않고 실행될 때만 worker pod가 띄워져 작업을 수행하게 된다.
Webserver 설정
Webserver Nodeport 변경
clusterIP 는 클러스터 내부에서만 통신이 가능하다. 따라서 외부에 airflow UI 를 보기 위해서는 NodePort로 변경해주어야 한다.
Webserver kubenertes secret 생성
flask 웹서버에서 session 을 관리하기 위한 secret을 생성해주자.
kubectl create secret generic my-webserver-secret --from-literal="webserver-secret-key=$(python3 -c 'import secrets; print(secrets.token_hex(16))')"
webserver-secret-key 설정 (values.yaml)
(my-sebserver-secret -> my-webserver-secret) 오타가 있다...
helm airflow 설치
helm upgrade --install airflow apache-airflow/airflow --namespace airflow --create-namespace -f values.yaml --debug
airflow 설치 확인 및 UI 접속
여기까지 한다면 우선 성공적으로 airflow 가 설치가 되었다는 것을 의미한다.
NodePort를 31151로 설정하였기 때문에 ${k8s_api_server}:31151 로 접속을 하면 아래와 같은 화면이 뜰 것이다.
Username 과 password는 각각 admin, admin 으로 접속을 하면
위와 같은 화면이 뜰 것이다. 하지만 여기서 든 생각은... 이제 dag 를 작성하여 airflow 프로그래밍을 하고 싶은데, dag 를 어디다가 작성하지?! 하는 생각이 들었다.
docker-compose 로 로컬환경에서 구축을 하고 개발을 하였을 때는 dag를 저장하는 folder를 mount시켜서 IDE로 작업을 하고 즉각 UI로 돌려보고 확인을 할 수 있었다.
하지만 여기는 쿠버네티스 환경이고 docker-compose로 구축된 환경처럼 개발을 하려면 pv와 pvc를 따로 만들어서 할당을 하고, jupyterlab같은 환경으로 개발을 진행하여야 할 것이다.
Dag 관리를 위한 git-sync
또다른 방법으로는 git-sync를 이용하는 방법이다. 이 글에서는 바로 git-sync를 활용한 방법을 보여줄 것이다.
이 방법은 git remote에 올린 repository를 kubernetes의 또다른 side-car pod가 생성되어 지속적으로 바라보면서 가져오고 이를 dag로 활용하는 것이다. 다시 말해 git repository에 있는 폴더를 나의 airflow 의 dag로 사용할 수 있다는 말이다.
ssh key 생성
ssh-keygen -t rsa -b 4096 -C "your@email.com"
ssh-keygen으로 키를 생성하면 .pub 으로 끝나는 publish key 가 생성된다.
ssh key 등록 (github)
해당 키를 github 전체 설정에서 ssh key 로 등록을 하여도 되고, 위처럼 repository의 setting에서 deploy keys에 등록을 하여도 된다.
kubernetes secret 생성
GIT_SECRET="$HOME/.ssh/k8s_sg_gitlab"
kubectl create secret generic airflow-ssh-git-secret --from-file=gitSshKey="${GIT_SECRET}" --namespace airflow
그리고 kubernetes를 위해 해당 키로 secret을 생성해주면 된다. namespace 또한 airflow 로 동일하게 설정해주어야 한다.
helm values.yaml 수정
다음은 앞서 만든 values.yaml을 수정하는 작업이다.
#ampersandor라고 주석 처리된 부분을 수정해주면 된다.
log 설정
git 과 sync를 맞추고 돌려보았는데 log가 보이지 않았다. values.yaml 에 간단히 logs 의 persistence를 수정해주면 된다. storageClassName은 default storage를 사용할 것이기 때문에 따로 수정하지는 않았다.
'Data Engineer > airflow' 카테고리의 다른 글
[Airflow] 실습을 통해 배우는 Airflow (1/7) (1) | 2023.08.05 |
---|