Docker와 K8s 필요성 (예시 : Airflow 운영상의 어려움)
데이터 품질이나 데이터 리니지 이슈 이외에도 다양한 이슈들이 발생
- Dag 간의 사용하는 라이브러리/모듈 충돌
- Worker의 부족
- Wordker 서버들의 관리와 활용도 이슈
1. Dag간의 사용하는 라이브러리 / 모듈 충돌
이로 인해 DAG 혹은 Task별로 별도의 독립공간을 만들어주는 것이 필요
- Docker to the rescue
- Dag 혹은 Task 코드를 Docker Image로 만들고 이를 독립된 공간(Docker Container)안에서 실행
2. Worker의 부족
- Scale Up : 컨테이너 서버의 사양을 늘리기
- Scale Out : 컨테이너 서버를 추가하기 (이걸 고민하는 시점에서 cloud airflow 고려해볼만함)
- K8s와 같은 컨테이너 기술 사용 : 필요한대로 서버 요청
3. 낮은 Server Utilization 이슈
- airflow 전용 하드웨어를 지정했는데 서버들이 항상 바쁘지 않다면..??
- 서비스별로 전용 서버를 할당하는 것은 여러가지로 이슈를 만들어냄
- 서비스별로 Capacity관리를 해야함
- 각 서비스에 속한 서브들을 보면 utilization이 낮은 이슈 발생
- 이 역시 K8s와 같은 컨테이너 기술의 도입으로 해결 가능
해결책
- 태스크나 DAG코드를 Docker Image로 만들어서 Docker Container형태로 실행
- 라이브러리 / 모듈 충돌을 방지
- 개발 환경과 프로덕션 환경을 동일하게 유지
- Airflow Worker를 K8s에서 필요한 대로 동적으로 할당하여 사용
- 전용 서버를 Airflow에 할당하지 않고 Container Orchestration 서비스를 통해 할당해서 사용하고 리턴
- Airflow에서 이를 해결하는 방법은 3가지
- Airflow Operator로 KubernetesPodOperator를 사용
- Airflow Operator로 DockerOperator를 사용
- Airflow Executor로 아래를 사용
- KubernetesExecutor
- CeleryKubernetesExecutor
- LocalKubernetesExecutor
- Executor란?
- Task들을 관리하고 실행하는 역할을 수행
- 병렬 혹은 일렬 실행이나 어느 Worker에서 실행할지 등등
- 다양한 수의 Executor 타입이 존재
- Sequential Executor: 디폴트로 설치되며 Sqlite와 같은 싱글스레드 DB에서만 사용가능
- Local Executor: taks들을 Airflow 마스터 노드안에서 실행
- Celery Executor: 다수의 Wordker 노드가 있는 경우 사용되며 Celery큐를 사용해 task들을 worker노드로 분산하여 실행
- Kubernetes Executor는 K8s 클러스터를 사용하여 task들을 독립된 환경에서 사용
- Local Kubernetes Executor와 Celery Kubernetes Executor도 존재
- Task들을 관리하고 실행하는 역할을 수행
Docker란
Docker Image: 독립적으로 완전하게 만들어지는 패키지
Docker Container: Docker Image를 독립된 환경에서 실행한 것
Docker의 목표 : 소프트웨어를 일관되게 빌드하고 실행하고 배포
Virtual machines vs. Docker Containers
Virtual Machine
- AWS의 EC2가 대표적인 Virtual Machine(VM)
- 하드웨어를 추상화하여 한 컴퓨터 위에 가상 컴퓨터를 올리는 것 (즉, 컴퓨터 하드웨어 단의 가상화)
- 장점
- 독립적이고 분리된 공간 제공
- 다ㅅ의 소프트웨어를 각 VM단에서 독ㄹ립적으로 실행가능
- 단점
- 각 VM은 자신만의 OS를 필요로 함
- 유료 OS라면 라이센스 비용 필요
- 시작하는데 오래 걸림
- 자원을 많이 사용함(VM들끼리 자원을 나눠써야함)
Docker Containers
- 소프트웨어를 실행하기 위한 독립적이고 분리된 공간
- 자체 파일 시스템을 갖고 있음 (Volume이라고 부름)
- 장점
- 소프트웨어를 실행하기 위한 독립적이고 분리된 공간을 제공
- 다수의 소프트웨어를 각 컨테이너단에서 독립적으로 실행가능
- 자원 소비가 적음
- 몇 십개에서 몇 백개의 Container를 실행 가능
- 호스트 OS를 사용(별도 비용 없음)
- 따라서 빠르게 실행됨
- 단점
- 많은 수의 Doccker Container를 관리하는 것은 쉽지 않음
- Host oS를 사용하기에 Cross-platform compatibility를 항상 지원하지 않음
- GUI소프트웨어 개발에 적합치 않음
'Programmers TIL' 카테고리의 다른 글
[Docker] Docker 명령 정리_TIL (0) | 2023.06.14 |
---|---|
[Docker] Docker 개발 프로세스_TIL (3) | 2023.06.12 |
[DataWearhouse] Snowflake_TIL (4) | 2023.05.25 |
[DataWearhouse] Redshift 고급 기능_TIL (1) | 2023.05.24 |
[Web] Django(Serializer)_TIL Day13 (2) | 2023.04.26 |