[Docker] Docker와 K8s_TIL

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도 존재

 

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소프트웨어 개발에 적합치 않음