열심히 구축한 home server을 더 다양하게 활용하기 위해 (설치가 매우 간편한 K3s $\rightarrow$ 많은 시행착오 끝에 K8s로,,,) K8s를 통해 Apache Airflow를 설치하고 배포해보겠다. https://${DDNS}/airflow에 서비스가 구동될 수 있도록 ingress도 설정해보겠다.
삽질 끝에 복이 온다!
Apache Airflow
우선 local에서 확인을 하고 ingress로 경로 설정을 진행한다. Local에 Apache Airflow를 설치하기 위해 Helm을 사용할 것인데 이는 Kuberenetes의 package manager이다.
Helm에 대해 좀 더 자세한 설명
Helm의 주요 구성요소
Charts: Helm의 패키지로, 어플리케이션을 실행하는 데 필요한 모든 리소스 정의를 포함합니다. 차트는 디렉토리 구조로 되어 있으며, 여러 개의 YAML 파일로 구성됩니다.
Releases: 클러스터에 배포된 차트의 인스턴스입니다. 하나의 차트를 여러 번 또는 여러 버전으로 클러스터에 배포할 수 있습니다. 각 배포는 새로운 릴리즈가 됩니다.
Repositories: 공유 차트의 위치입니다. 공개 또는 사설 리포지토리를 설정하여 차트를 저장하고 공유할 수 있습니다.
Helm의 주요 기능
쉬운 관리: Helm을 사용하면, 복잡한 어플리케이션도 명령 한 줄로 쉽게 설치, 업그레이드, 제거할 수 있습니다.
버전 관리: 다양한 버전의 차트를 저장하고 관리할 수 있으므로, 어플리케이션의 이전 버전으로 롤백하기 쉽습니다.
커스터마이제이션: values.yaml 파일을 통해 패키지의 기본 설정을 쉽게 변경할 수 있습니다. 이를 통해 동일한 차트로 여러 환경과 조건에 맞게 배포할 수 있습니다.
커뮤니티 지원: Helm Hub나 Artifact Hub 같은 곳에서 커뮤니티가 관리하는 수백 개의 준비된 차트를 찾을 수 있어, 많은 공통 어플리케이션을 쉽게 배포할 수 있습니다.
1 2 3 4 5 6 7
$ helm repo add apache-airflow https://airflow.apache.org "apache-airflow" has been added to your repositories $ helm repo update Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "apache-airflow" chart repository Update Complete. ⎈Happy Helming!⎈ $ helm install airflow apache-airflow/airflow -f values.yaml -n airflow --create-namespace
여기서 values.yaml은 대표적으로 아래와 같은 변수들이 존재한다. 더 자세한 사항은 helm show values apache-airflow/airflow > values.yaml 명령어를 실행하여 확인하면 된다.
Name
Mean
Default
executor
사용할 Airflow executor (예: CeleryExecutor)
CeleryExecutor
airflow.image.repository
Airflow Docker 이미지 저장소
apache/airflow
airflow.image.tag
Airflow Docker 이미지 태그
차트 버전과 일치
airflow.config
Airflow 설정 (airflow.cfg 내용)
{}
web.replicas
Airflow 웹 서버의 레플리카 수
1
scheduler.replicas
Airflow 스케줄러의 레플리카 수
1
dags.gitSync.enabled
DAGs의 git-sync 활성화 여부
false
dags.path
DAGs 파일의 경로
/opt/airflow/dags
postgresql.enabled
내장 PostgreSQL 데이터베이스 사용 여부
true
redis.enabled
내장 Redis 사용 여부
true
service.type
Kubernetes 서비스 타입 (예: ClusterIP, NodePort)
ClusterIP
ingress.enabled
Ingress 리소스 활성화 여부
false
삽질 그리고 삽질…
삽질 !~
1 2
Error: INSTALLATION FAILED: failed post-install: 1 error occurred: * timed out waiting for the condition
는 위와 같이 설치가 자꾸 안돼서 다른 버전을 선택해보려고 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
$ helm search repo apache-airflow/airflow --versions NAME CHART VERSION APP VERSION DESCRIPTION apache-airflow/airflow 1.10.0 2.6.2 The official Helm chart to deploy Apache Airflo... apache-airflow/airflow 1.9.0 2.5.3 The official Helm chart to deploy Apache Airflo... apache-airflow/airflow 1.8.0 2.5.1 The official Helm chart to deploy Apache Airflo... apache-airflow/airflow 1.7.0 2.4.1 The official Helm chart to deploy Apache Airflo... apache-airflow/airflow 1.6.0 2.3.0 The official Helm chart to deploy Apache Airflo... apache-airflow/airflow 1.5.0 2.2.4 The official Helm chart to deploy Apache Airflo... apache-airflow/airflow 1.4.0 2.2.3 The official Helm chart to deploy Apache Airflo... apache-airflow/airflow 1.3.0 2.2.1 The official Helm chart to deploy Apache Airflo... apache-airflow/airflow 1.2.0 2.1.4 The official Helm chart to deploy Apache Airflo... apache-airflow/airflow 1.1.0 2.1.2 The official Helm chart to deploy Apache Airflo... apache-airflow/airflow 1.0.0 2.0.2 Helm chart to deploy Apache Airflow, a platform... $ helm install airflow apache-airflow/airflow --version ${Chart_Version} -n airflow --create-namespace
이마저도 안돼서 다른 방법을 찾아보던 중 User-Community Airflow Helm Chart을 발견해서 아래와 같이 시도했다.
$ helm repo add airflow-stable https://airflow-helm.github.io/charts "airflow-stable" has been added to your repositories $ helm repo update Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "apache-airflow" chart repository ...Successfully got an update from the "airflow-stable" chart repository Update Complete. ⎈Happy Helming!⎈ $ helm search repo airflow-stable/airflow --versions NAME CHART VERSION APP VERSION DESCRIPTION airflow-stable/airflow 8.7.1 2.5.3 Airflow Helm Chart (User Community) - the stand... airflow-stable/airflow 8.7.0 2.5.3 Airflow Helm Chart (User Community) - the stand... airflow-stable/airflow 8.6.1 2.2.5 Airflow Helm Chart (User Community) - the stand... airflow-stable/airflow 8.6.0 2.2.5 Airflow Helm Chart (User Community) - the stand... airflow-stable/airflow 8.5.3 2.1.4 Airflow Helm Chart (User Community) - used to d... airflow-stable/airflow 8.5.2 2.1.2 Airflow Helm Chart (User Community) - used to d... airflow-stable/airflow 8.5.1 2.1.2 Airflow Helm Chart (User Community) - used to d... airflow-stable/airflow 8.5.0 2.1.2 Airflow Helm Chart (User Community) - used to d... airflow-stable/airflow 8.4.1 2.1.1 the community Apache Airflow Helm Chart - used ... airflow-stable/airflow 8.4.0 2.1.1 the community Apache Airflow Helm Chart - used ... airflow-stable/airflow 8.3.2 2.0.1 the community-maintained descendant of the stab... airflow-stable/airflow 8.3.1 2.0.1 the community-maintained descendant of the stab... airflow-stable/airflow 8.3.0 2.0.1 the community-maintained descendant of the stab... airflow-stable/airflow 8.2.0 2.0.1 the community-maintained descendant of the stab... airflow-stable/airflow 8.1.3 2.0.1 the community-maintained descendant of the stab... airflow-stable/airflow 8.1.2 2.0.1 airflow is a platform to programmatically autho... airflow-stable/airflow 8.1.1 2.0.1 airflow is a platform to programmatically autho... airflow-stable/airflow 8.1.0 2.0.1 airflow is a platform to programmatically autho... airflow-stable/airflow 8.0.9 2.0.1 airflow is a platform to programmatically autho... airflow-stable/airflow 8.0.8 2.0.1 airflow is a platform to programmatically autho... airflow-stable/airflow 8.0.7 2.0.1 airflow is a platform to programmatically autho... airflow-stable/airflow 8.0.6 2.0.1 airflow is a platform to programmatically autho... airflow-stable/airflow 8.0.5 2.0.1 airflow is a platform to programmatically autho... airflow-stable/airflow 8.0.4 2.0.1 airflow is a platform to programmatically autho... airflow-stable/airflow 8.0.3 2.0.1 airflow is a platform to programmatically autho... airflow-stable/airflow 8.0.2 2.0.1 airflow is a platform to programmatically autho... airflow-stable/airflow 8.0.1 2.0.1 airflow is a platform to programmatically autho... airflow-stable/airflow 8.0.0 2.0.1 airflow is a platform to programmatically autho... airflow-stable/airflow 7.16.0 1.10.12 airflow is a platform to programmatically autho... airflow-stable/airflow 7.15.0 1.10.12 airflow is a platform to programmatically autho... airflow-stable/airflow 7.14.3 1.10.12 airflow is a platform to programmatically autho... airflow-stable/airflow 7.14.2 1.10.12 airflow is a platform to programmatically autho... airflow-stable/airflow 7.14.1 1.10.12 airflow is a platform to programmatically autho... airflow-stable/airflow 7.14.0 1.10.12 airflow is a platform to programmatically autho... $ helm install airflow airflow-stable/airflow -n airflow --create-namespace
도저히 안된다… 아래 로그에서 발생하는 문제로 추정되는데 어디 부분인지 파악이 되지 않아 일단,,, 포기,,,
하지만 Minikube와 Kind는 내가 원하는 환경 구축에 적절하지 않아 Kubeadm을 이용해 구축하려 했다. 하지만… Ubuntu 22.04 LTS에 호완이 되지 않는 것으로 보였다. (아닐 수 있음…) 따라서 Ubuntu 20.04 LTS로 downgrade 후 1.22.8의 K8s를 설치했다.
결국 해낸 방법
Minikue, K3s, Kind와는 다르게 K8s를 사용하여 바로 helm으로 Airflow를 설치하려고 시도한다면 아래와 같은 이슈가 발생한다.
이 이유는 Pod가 bound할 PersistentVolumeClaims가 존재하지 않기 때문이다. 설명하기 앞서 PVC가 무엇인지 알아보자.
PersistentVolume (PV)
Cluster 내에 provisioning 된 저장 공간
특정 저장 용량과 접근 모드 (ReadWriteOnce, ReadOnlyMany, ReadWriteMany) 존재
수동으로 관리자에 의해 생성되거나, StorageClass를 사용하여 동적 provisioning 가능
PersistentVolumeClaim (PVC)
사용자의 요청에 의해 생성, PV의 저장 용량과 같은 특정 양의 저장 공간을 요청하는 방법 제공
사용자는 특정 저장 시스템이나 세부 구현에 대해 걱정할 필요 없이 저장 공간 요청
일반적으로 특정 크기와 접근 모드를 요구하며, 이를 만족하는 PV가 연결
적절한 PV가 없는 경우, StorageClass를 사용하여 동적으로 PV를 생성 가능
StorageClass
동적 volume provisioning을 위한 정의
PVC가 생성되었을 때, 그에 맞는 PV가 없다면 StorageClass를 사용하여 자동으로 PV 생성
이를 통해 특정 종류의 storage (AWS의 EBS, Google Cloud의 Persistent Disk, Azure의 Azure Disk Storage 등)를 provisioning 할 수 있는 방법과 파라미터 정의
쉽게 말해 위 오류는 helm으로 Airflow를 배포할 때 동적 provisioning이 되지 않기 때문에 발생한 현상이다. 따라서 적절한 StorageClass를 정의해야하며, 이를 위해 local-path-provisioner를 사용했다. 설치와 setup은 아래와 같다.
다중 접근: Airflow의 여러 컴포넌트 (스케줄러, 웹서버, 워커)가 동시에 DAGs를 읽을 필요가 있습니다. 따라서 여러 노드에서 동시에 해당 볼륨에 접근할 수 있어야 합니다.
읽기 전용: 일반적으로 DAG 파일들은 실행 중에 변경되거나 쓰여지지 않습니다. 대신에 사용자나 CI/CD 파이프라인에 의해 업데이트 될 수 있습니다. 그러나 이러한 업데이트는 별도의 프로세스를 통해 이루어지며, 실행 중인 Airflow 서비스 자체에서는 DAG 파일을 수정할 필요가 없습니다. 따라서, 이 볼륨은 읽기 전용(ReadOnlyMany)으로 설정될 수 있습니다.
Logs: ReadWriteMany
다중 접근 및 쓰기 가능: 워커 노드에서는 태스크의 실행 로그를 작성하고 저장해야 하며, 웹 서버는 사용자가 해당 로그를 볼 수 있도록 제공합니다. KubernetesExecutor를 사용하는 경우 각 태스크는 별도의 파드에서 실행됩니다. 따라서 여러 파드가 동시에 로그 볼륨에 쓰기 작업을 수행할 수 있어야 합니다.
쓰기 및 읽기: 로그는 실행 중에 기록되므로 쓰기 작업이 필요합니다. 또한, 로그를 검토하거나 디버깅할 때 읽을 수 있어야 합니다. 따라서, 이 볼륨은 다중 접근 및 읽기/쓰기 모드(ReadWriteMany)로 설정되어야 합니다.