Airflow 운영상의 어려움
관리해야하는 DAG의 수가 100개를 넘어간다면?
- 데이터 품질이나 데이터 리니지 이슈 이외에도 다양한 이슈들이 발생
- 어떤 이슈들이 있을까?
- 라이브러리 충돌
- S/W 버전 충돌 (파이썬 2.0, 파이썬 3.8으로 돌아가는 경우)
- Worker의 부족
- Worker 서버들의 관리와 활용도 이슈
1. 라이브러리 충돌
- 라이브러리/모듈의 충돌 이슈가 발생하기 시작함
- DAG에 따라 실행에 필요한 라이브러리/모듈이 달라지기 시작
- 이로 인해 DAG 혹은 Task별로 별도의 독립공간을 만들어주는 것이 필요
- Docker to the rescue
- Dag 혹은 Task 코드를 Docker Image로 만들고 이를 독립된 공간(Docker Container)안에서 실행
2. Worker의 부족
- Scale Up
- 서버 하나의 사양을 높이는 방법(단순, 한계에 도달한다)
- Scale Out
- worker 노드를 별개의 서버로 분리한 다음 worker 노드를 증가 시킴
- 이후 클라우드 서비스 사용을 고려해봐야 함
- K8s와 같은 컨테이너 기술 사용

3. 낮은 Server Utilization 이슈
- Airflow 전용 하드웨어를 지정했는데 서버들이 항상 바쁘지 않다면? (노는 서버들이 발생)
- 서비스별로 전용 서버를 할당하는 것은 여러가지로 이슈를 만들어냄
- 서비스별로 Capacity 관리를 해야함
- 각 서비스에 속한 서버들은 보면 utilization이 낮은 이슈 발생
- 이 역시 K8s와 같은 컨테이너 기술의 도입으로 해결 가능

해결책
- 태스크나 DAG 코드를 Docker Image로 만들어서 Docker Container 형태로 실행
- 별도로 분리된 환경
- 라이브러리/모듈 충돌을 방지
- 개발 환경과 프로덕션 환경을 동일하게 유지
- Airflow Worker를 K8s에서 필요한 대로 동적으로 할당하여 사용
- 전용 서버를 Airflow에 할당하지 않고 Container Orchestration 서비스를 통해 할당해서 사용하고 리턴
- Airflow에서 이를 해결하는 방법은 3가지
a. Airflow Operator로 KubernetesPodOperator를 사용
b. Airflow Operator로 DockerOperator를 사용
c. Airflow Executor로 아래를 사용
- KubernetesExecutor
- CeleryKubernetesExecutor
- LocalKubernetesExecutor
Airflow Executor
- Executor는 Task들을 관리하고 실행하는 역할을 수행
- 병렬 혹은 일렬 실행이나 어느 worker에서 실행할지 등등
- 다양한 수의 Executor 타입이 존재
- Sequential Executor: 디폴트로 설치되며 Sqlite와 같은 싱글스레드 DB에서만 사용가능 (병렬 실행 지원 불가, 일렬 실행만 가능)
- Local Executor: task들을 Airflow 마스터 노드안에서 실행
- 다수의 스레드를 지원해주는 Executor, 병렬 실행 가능, 싱글 노드
- Celery Executor: 다수의 Worker 노드가 있는 경우 사용되며 Celery 큐를 사용해 task들을 worker 노드로 분산하여 실행
- worker 노드가 여려개일 때 사용하는 Executor
- Kubernetes Executor는 K8s 클러스터를 사용하여 task들을 독립된 환경에서 사용
- Docker Image로 구현되어 있어야 함.
- Local Kubernetes Executor와 Celery Kubernetes Executor도 존재
Airflow 아키텍처: Docker와 K8s를 사용하는 방법
-Airflow Operator로 KubernetesPodOperator를 사용
- 이 방식은 특정 태스크를 Docker Image로 만들어 K8s에서 실행
- Airflow Operator로 DockerOperator를 사용
- 이 방식은 특정 태스크를 Docker Image로 만들어 Docker Container 위 에서 실행
- Airflow Executor로 다음 중의 하나를 사용
- KubernetesExecutor
- 모든 DAG 코드가 Docker Image로 빌드되어 K8s에서 실행됨
- CeleryKubernetesExecutor
- CeleryExecutor와 KubernetesExecutor를 동시에 사용하는 방법을 제공해주는 Executor
- 이는 Airflow 로드가 전체적으로 큰데 소수의 task만 Isolation을 필요로 하는 경우
- LocalKubernetesExecutor
- LocalExecutor와 KubernetesExecutor를 동시에 사용하는 방법을 제공해주는 Executor
Docker 소개
내가 만든 프로그램이 다른 컴퓨터에서 안 돌아간다면?
- 설치 과정에서 중요한 파일이 빠짐
- 사용하는 라이브러리 등의 버전이 안 맞음
- 환경 설정이 안 맞는 것이 존재
내 컴퓨터 환경을 그대로 패키징해서 다른 이에게 줄 수 있다면?
- Docker Image: (프로그램 실행을 위한 모든 S/W와 환경 변수들을) 독립적으로 완전하게 만들어진 패키지
- Docker Container: 이 Docker Image를 독립된 환경에서 실행한 것

Docker의 목표
Virtual Machines vs. Docker Containers

Virtual Machine 소개
- AWS의 EC2가 대표적인 Virtual Machine (VM)
- 하드웨어를 추상화하여 한 컴퓨터 위에 가상 컴퓨터를 올리는 것

Virtual Machine의 장단점
- 장점
- 소프트웨어를 실행하기 위한 독립적이고 분리된 공간을 제공
- 다수의 소프트웨어를 각 VM단에서 독립적으로 실행가능
- 단점
- 각 VM은 자신만의 OS를 필요로 함 (가상 하드웨어위에서 돌기 때문)
- 유료 OS라면 라이센스 비용 필요
- 그러다보니 시작하는데 오래 걸림
- 자원을 많이 사용함 (VM들끼리 자원을 나눠써야함)
Docker Container 소개
- 소프트웨어를 실행하기 위한 독립적이고 분리된 공간
- 자체 파일 시스템을 갖고 있음 (Volume이라고 부름)
- Host OS가 맥킨토시인 경우 Linux만 지원
- 맥에서 돌아가는 Docker가 자원 낭비가 큼


Container의 장단점
- 장점
- 소프트웨어를 실행하기 위한 독립적이고 분리된 공간을 제공
- 다수의 소프트웨어를 각 컨테이너단에서 독립적으로 실행가능
- 자원 소비가 적음 (lightweight)
- 몇 십개에서 몇 백개의 container를 실행 가능
- 호스트 OS를 사용 (별도 비용 없음)
- 단점
- 많은 수의 Docker Container를 관리하는 것은 쉽지 않음
- Host OS를 사용하기에 Cross-platform compatibility를 항상 지원하지 않음
- GUI 소프트웨어 개발에 적합치 않음
Docker 프로그램 개발 프로세스
하이레벨 Docker 사용 프로세스
- 먼저 대상 소프트웨어를 선택
- 다수의 컴포넌트로 구성되는 소프트웨어라면 각각이 Docker Image로 만들어져야할 수도 있음
- 이를 Docker Image로 빌드: Dockerization이라고 부름
- Dockerfile이란 텍스트 파일로 세부 정보를 기술
- 해당 소프트웨어를 이미지로 바꾸기 위한 Docker에게 주는 명령들을 포함
- Dockerfile에는 크게 3가지 컴포넌트가 있음
- 기본이 되는 소프트웨어가 무엇인가? (From)
- 어떤 소프트웨어를 설치할것인가? (Run)
- 이 프로그램을 어떻게 실행할 것인가?(Entry Point / CMD)
- Docker Image: 하나의 Docker Container안에서 실행됨
- Dockerfile을 기준으로 만들어지며 소프트웨어를 실행하기 위해 필요한 모든 것을 포함

Docker Image의 구성 요소
- 기본 OS (리눅스라면 우분투, 데비안 등등)와 같은 소프트웨어의 실행환경
- 소프트웨어 자체 (코드)
- 소프트웨어가 필요로 하는 라이브러리
- 파일 시스템 스냅샷: 이는 스택화된 형태로 구현됨 (뒤에서 더 설명)
- 환경 설정 변수: 빌드할 때 변수와 실행 때 변수 두 가지가 존재 (ENV, ARG)
- 메타 데이터: 이미지 자체에 대한 정보 (버전, 작성자, 설명 등등)
- 명시하지 않으면 'latest' 가장 최근 데이터를 가져옴)
위 정보와 설치 관련 실행 순서등이 Dockerfile에 기술됨
Docker Image는 다수의 파일로 구성됨 (“docker image ls”)
Docker Image의 실행
- Container를 통해 Docker Image안의 소프트웨어를 실행
- Container는 자체 파일 시스템을 가진 특수한 프로세스로 이미지의 파일 시스템이 로딩됨
- Image를 Container 안에서 실행

Docker Image의 등록: Docker Hub
- Docker Registry는 Docker Image들의 보관소
- On-prem registry와 Cloud registry가 존재
- docker hub이 가장 유명
- 여기에 등록을 하면 회사내 혹은 퍼블릭하게 이미지를 공유 가능
- docker pull, docker push 등 github과 유사한 점이 많음.

Docker Hub이란 무엇인가?

- Teams & Organizations
- Public과 Private Repo 제공
- Official Images
- Github과 연동을 통한 Automated Build 제공

