AAAP – 작업환경 as a Service 개발기

안녕하세요. 테크블로그로 만나뵙게 되어서 반갑습니다. 저는 “데이터연구실>응용분석팀”의 dingo.kim이라고 합니다. 카카오에서 일한 지는 이제 막 1년이 지났고요, 입사한 거의 직후부터 팀 내 프로젝트인 “AAAP”의 주요 기여자로 활동해오고 있습니다.

이번 포스트의 주제가 되는 것도 바로 이 AAAP입니다. AAAP는 응용분석팀을 뜻하는 Application Analysis와, 업무의 시작점을 뜻하는 Access Point를 합한 축약어입니다. AAAP는 제목이 의미하는 대로 일종의 작업환경 서비스입니다. 

“작업환경 서비스”가 다소 모호하게 느껴지실 텐데요, 서비스가 제공하는 결과물로 설명해 드리자면, AAAP는 응용분석팀 팀원에게 업무에 필요한 여러 도구를 알맞게 설정한 “가상환경”과, 가상환경의 생성-정보-업데이트-갱신-제거(CRUD) 라이프사이클을 조작하기 위한 “인터페이스 도구”를 함께 제공하는 것을 말합니다. 이를 통해 AAAP는 단순히 “업무용 컨테이너 이미지를 제공”하는 수준에서, “작업환경 as a Service”로 한층 추상화되게 됩니다.

AAAP라는 구체적인 결과를 다룬 본 개발기를 통해, 작업환경 서비스가 왜 필요한지와 이를 통해 무엇을 할 수 있는지에 대한 힌트를 얻고, 필요성에 대한 이해가 확충되기를 기대합니다. 또, 카카오 사내의 여러 플랫폼을 두루 살펴보고, 이들이 업무 고도화에 어떻게 활용되고 있는지에 대한 이해를 얻어가셨으면 좋겠습니다.

 

작업환경 서비스?

작업환경 서비스는 왜 필요할까요? 본 질문은 “AAAP가 제공하는 응용분석팀용 작업환경”이 무엇인지 구체적으로 살펴보는 것에서부터 답할 수 있습니다. 또 이를 위해서는 먼저 응용분석팀에 대한 약간의 이해가 필요합니다.

 

응용분석팀

카카오는 카카오톡 이외에도 지도, 쇼핑, 다음 웹 등 다양한 서비스를 대규모 유저에게 제공하고 있습니다. 때문에 거대한 데이터가 매일 발생하며, 이를 소위 “빅데이터” 전문가가 아닌 서비스 개발자가 직접 사후 분석하는 일이 어렵습니다. 또한 특정 서비스단에서는 해당 서비스에 집중하기 때문에, 다른 서비스의 데이터와 연관성을 찾는 일도 어렵습니다. 응용분석팀은 이러한 배경에서 활동합니다. 

데이터 전문가 집단으로써, 응용분석팀은 다양한 카카오 서비스가 생성하는 다채로운 데이터 분석을 통해 서비스 현황 파악과 의사결정을 지원하며, 데이터 속에서 서비스 개선에 활용할 수 있는 정보인 “데이터 프로덕트”를 생산합니다. 요청받은 주제에 대한 단발성 리서치도 수행하고요, 특정 주제에 대해서는 주기적인 분석을 제공하기도 합니다. 이를 반영하듯 응용분석팀에는 다양한 배경의 직군 각자의 방법대로 컴퓨팅 리소스를 활용 중입니다. 저와 같은 엔지니어도 있고 머신러닝에 특화된 데이터 사이언티스트도 있습니다. 또 분석가와 기획자도 있습니다.

주요 데이터 소스로는 하둡을 사용 중입니다. 하둡 에코시스템에 속한 Hive, Spark, Hue 등의 소프트웨어를 사용 중이고 Jupyter, Zeppelin, RStudio Server와 같은 노트북 계열의 도구를 적극 사용합니다. 공통 언어의 지위를 갖는 Python 외에도 데이터 분석을 위해 R을 많이 사용 중이며, 사용되는 수많은 패키지는 일일이 열거하기 어려울 정도입니다.

 

응용분석 작업환경의 문제점

이러한 응용분석팀의 업무 스타일은 곧 다음과 같은 문제를 야기합니다.

 

  • 업무 환경의 뒤섞임: 다양한 업무를 처리하며 데이터가 섞이거나, 의존성 버전이 꼬이는 등의 문제가 발생합니다.
  • 컴퓨팅 리소스의 제한: 회사의 노트북 성능은 상당히 좋은 편이지만, 그럼에도 여러 업무를 처리하기 위해서는 더 많은 컴퓨팅 리소스가 필요합니다.
  • 도구 설치와 관리의 어려움: 앞서 설명했듯이 데이터 업무를 위해서 다양한 소프트웨어가 활용됩니다. 그리고, 활용되는 소프트웨어가 많기 때문에, 이를 하나의 신뢰성 있는 환경으로 통합 설치하는 일은 매우 어렵습니다. 공식 가이드를 따라 해도 설치되지 않거나, 두 소프트웨어가 하나의 의존성에 대해 서로 다른 버전을 원하며 충돌을 일으키기도 합니다. 혹은 환경변수가 꼬이는 일도 발생합니다. 모두 실제로 일어나는 일입니다.

 

이전부터 이러한 문제를 해결하기 위한 방편으로, 가상화된 작업환경을 사용해 왔습니다. 먼저 팀 공용 서비스의 리소스를 일부 유용하는 방법이 있었습니다. 사내의 클라우드 플랫폼을 이용해 직접 가상 환경을 구성하는 방법도 많이 사용되어 왔습니다. 그러나 앞선 방법들은 암묵적이어서 위험하거나(팀 서비스 자원을 개인적 목적으로 사용), 구조적이지 않은(개인이 일회성으로 구성) 약점을 가지고 있습니다. 

또 다른 시각에서 바라보자면, 작업환경을 세팅하는 일은 업무를 보기 위해 선행해야 하는 어쩔 수 없는 골치 아픈 일이었습니다. 팀에 새로 합류한 팀원은 업무 환경을 구성하기 위해, 노하우(know-how)의 영역에서 구전된 “이렇게 해봐”, 혹은 언제 업데이트됐는지 의심스러운 긴 문서를 한줄 한줄 따라해 보아야 했습니다.

 

Know-how to service

작업환경 서비스 개발은 좁은 관점에서는 특수한 목적을 가진 컨테이너 이미지와, 컨테이너 조작 인터페이스를 제공하는 일입니다. 그러나 거시적인 관점에서는 암묵적인 팀 내 지식을 하나의 서비스로 명시화하는 일이기에 더 중요해집니다. 왜냐하면 작업환경 서비스를 제공하는 일은 궁극적으로 작업환경 구성에 대한 사용자의 지적 부담을 덜어내고, 그만큼의 자원을 필요한 업무에 더 집중할 수 있도록 돕는 일이기 때문입니다.

따라서 작업환경 서비스를 통해 바라는 바는 분명합니다.

  • 불필요한 중복 작업 제거: 개개인이 작업환경 구성에 사용했던 시간과 노동력을 제거합니다. 앞서 언급해 드렸던, 전승되어 왔던 구성 방법을 익히고, 전사 하둡 클라이언트 사용법을 이해하고, 전사 클라우드 플랫폼에서 인스턴스를 할당받고, SSH 접근을 설정하고, 필요한 노트북(예: Jupyter)을 설치하고, 외부 접근을 위해 프록시 설정을 하고, 데이터를 저장할 볼륨을 마운팅하는⋯, 그 모든 노력과 시간을 제거합니다.
  • 안정적인 작업환경 제공: 시간과 사용자 피드백으로부터 검증된 가상환경을 제공함으로써 불필요한 에러 핸들링을 제거합니다.
  • 추가 기능 제공: 일반적인 컨테이너 이미지로 제공될 수 없는, 작업환경 관리와 업무에 유용한 여러 추가 기능을 제공합니다.

 

사내 플랫폼을 이용해 서비스 만들기

그렇게 문제와 목표는 정의되었습니다. 어떻게 만들었을까요? 멋지게도 카카오에서는 다양한 사내 플랫폼이 제공되고, 사용법이 잘 정리되어 있습니다. 이를 통해 풍부한 기능을 비교적 빠르게 개발할 수 있었습니다. 사내 플랫폼으로 아웃소싱된, 즉, 사내 플랫폼을 활용해 별도 개발이 필요 없었던, 주요 기능들을 다음과 같이 정리할 수 있습니다.

  • 컨테이너 실행환경 
  • 저장소
  • 알람
  • 모니터링

 

사내 플랫폼 활용의 시점에서 그린 전체 구조는 위와 같습니다. 사용자는 명령줄 인터페이스인 AAAP-CLI를 통해 필요한 요청을 묘사합니다. 이때, 필요할 경우 자원 가용 상태에 대한 검사가 이루어지고, 쿠버네티스(DKOS)를 통해 작업환경에 대한 CRUD 액션이 수행됩니다. 이때 컨테이너 이미지는 사내 도커 이미지 저장소(D2Hub)에서, 컨테이너에 부착할 영속적인 데이터 저장소(Tenth2)도 사내 플랫폼으로 제공됩니다. 필요한 알람은 WatchTower(워치타워)라는 사내 메시지 봇을 통해 팀원의 카카오톡으로 전송됩니다.

각 아이콘에 대응하는 사내 플랫폼이 구체적으로 어떻게 사용되는지는 오는 단락을 통해 더욱 구체적으로 살펴보도록 하겠습니다.

 

DKOS – 쿠버네티스 클러스터 제공자

가장 핵심적인 도구는 사내의 쿠버네티스 서비스인 DKOS입니다. AAAP는 DKOS를 통해 개별 클러스터를 생성하고 이후 쿠버네티스 API 주소를 받아와 필요한 조작을 수행합니다. AAAP는 쿠버네티스 API를 통해 인스턴스, 즉 컨테이너를 담는 파드(Pod)를 생성합니다. 이때 파드만으로는 AAAP의 전체 기능을 구현할 수 없기 때문에, 컨피그맵(ConfigMap), 시크릿(Secret), PV(Persistent Volume)를 이용해 기반 여건을 구축합니다. 여기에서 쿠버네티스의 장점이 드러나는데요,  다양한 기능을 가진 쿠버네티스 오브젝트를 통해 컨테이너 기능을 간편하게 조작 및 확장할 수 있었습니다.

 

 

D2Hub, Tenth2 – 이미지 리포지토리, 영속적인 저장소

카카오 사내에는 여러 저장소가 제공되는데 AAAP는 그 중 컨테이너 이미지 저장소인 D2Hub와 일종의 분산 파일 시스템(DFS)인 Tenth2를 사용하고 있습니다. 

D2hub는 단순 저장소일 뿐 아니라 자동 빌드, 배포 기능까지 포함한 유용한 플랫폼입니다. AAAP에서는 작업환경 구현체인 AAAP-컨테이너 도커 이미지를 빌드하고 저장하는, 쿠버네티스에게 제공하는 저장소로 사용합니다. 

Tenth2는 컨테이너에 붙어, 일반적인 작업 데이터에 대한 영속적인 저장소로 사용됩니다. 영속적이라 하면, 컨테이너의 로컬 디렉토리(ephemeral storage, 휘발성의 임시 스토리지)와 달리 컨테이너가 삭제되어도 유지되는 저장소를 뜻합니다. 코드 외의 여러 데이터를 상시로 다루는 팀의 특성 상 데이터의 저장과 이동 또한 매우 큰 불편함을 야기하는 요소인데요, 사내 DFS를 마치 가상의 개인 NAS인 것처럼 제공해 여러 인스턴스를 옮겨가며 작업할 때도 데이터에 원활하게 접근할 수 있도록 구현했습니다.

 

Morpheus, Watchtower – 모니터링, 알림

그 외에도 관리자와 사용자 편의를 높이기 위해 모니터링 툴인 Morpheus(모피어스), 전사 알림 도구인 Watchtower(워치타워)를 사용 중입니다. 모니터링 툴을 이용해 방치 중인 유휴 작업환경을 탐지하고, 워치타워를 통해 삭제 요청 메시지 등을 전송합니다.

 

API를 이용한 커뮤니케이션

보시다시피 작업환경 서비스를 만드는데 수많은 사내 플랫폼이 이용되었음을 알 수 있습니다. 여러 플랫폼을 도입하고 서비스에 녹여낼 수 있었던 배경에는 사내의 플랫폼들이 안정적인 REST API를 서비스해, 전사 내에서 편리하게 사용할 수 있었기 때문입니다. 

만약 위에서 사용한 사내 플랫폼이 없거나 사용법이 복잡했다면 “작업환경 서비스를 만드는 어려움”이 “작업환경 관리의 어려움”보다 커져 AAAP는 만들어지지 않았거나, 기능이 축소되었을 것입니다. 그리고 그랬다면 개개인은 “작업환경 관리”라는, 업무를 수행하기 위한 업무에서 벗어날 수 없었을 것입니다.

 

고도화

다른 모든 서비스와 같이, 작업환경 서비스도 초기 기능이 배포된 후 많은 개선이 있었습니다. AAAP의 상세한 구현을 설명하는 대신, 서비스가 나아가는 방향을 이해할 수 있도록 몇 가지 요소들만 훑어보도록 하겠습니다.

 

컨테이너의 다양한 기능

앞서 언급해 드렸다시피 컨테이너는 다양한 기능을 포함하고 있습니다. 

먼저 저희 데이터 업무에서 가장 중요한 하둡 에코시스템의 클라이언트들이 제공됩니다. 즉, HDFS, Hive, Beeline 등의 클라이언트가 설치되고, 올바르게 설정되어 있어, 업무에 필요한 데이터를 조회, 취득할 수 있습니다. Python, R에 대해 선택된 패키지들이 기본적으로 설치되어 제공됩니다. 여기에는 앞서 언급한 하둡 에코시스템에 클라이언트에 대한 파이썬 래퍼 패키지들이 포함되고, 추가로 데이터 분석을 위해 많이 사용하는 Numpy, Pandas, Scikit-learn 등이 포함됩니다. 그 위에는 웹 환경에서 코드 편집, 실행을 쉽게 해주는 Jupyter, Zeppelin, RStudio Server 노트북들이 설치되어 제공됩니다. 

이를 통해 상이한 프로그래밍 능력을 갖춘 응용분석팀의 모든 직군이 업무를 효율적으로 처리할 수 있도록 지원하고 있습니다.

 

인스턴스 타입의 분화

인스턴스 타입은 주로 컨테이너가 실행되는 워커 환경의 다변화에 의해 구분되는 작업환경 종류를 의미합니다. 처음에는 인스턴스 타입이라는 개념이 없이 하나의 타입만 제공되었는데요, 작업환경 서비스에 대한 이해가 높아지고 사용자가 많아지며, 요구에 맞추어 새로운 종류의 인스턴스 타입들을 추가하게 되었습니다.

 

  • private-workstation: 먼저 기본 인스턴스 타입인 private-desktop보다 더 많은 컴퓨팅 리소스가 필요할 때 사용할 수 있는 고사양 인스턴스를 제공합니다.
  • public-workstation: 그 후에는 굳이 개인 인스턴스를 필요로 하지 않은, 간단한 쿼리 등을 실행할 수 있도록 미리 생성해 놓은 공용 인스턴스인 public-workstation 타입을 제공하기 시작했습니다.
  • gpu-workstation: 마지막으로 추가된 타입은 이름 그대로 GPU가 장착된 인스턴스를 제공합니다. gpu-workstation은 기존에 개별적으로 관리하고 있던 팀의 GPU PM(physical machine: 독립적인 서버 장비)를 AAAP 내부로 통합한 작업의 결과물입니다. 이러한 통합을 통해 사용자가 하나의 인터페이스만 익히면 되도록 업무 환경을 개선하고 있습니다. gpu-workstation을 통해 앞으로 더 빈번해질 대용량 데이터를 이용한 머신러닝 등의 업무를 보다 쉽게 수행할 수 있습니다.

 

보시다시피 각각의 인스턴스 타입은 저마다의 장단점을 가지고 있습니다. 사용자는 필요에 따라 선택할 수 있습니다.

 

AAAP-CLI -> AAAP-WEB

가장 최근에는 AAAP를 더 쉽게 사용할 수 있도록 커맨드라인 인터페이스(CLI)를 웹으로 옮기는 작업을 진행했습니다. AAAP-CLI는 터미널을 사용하는 만큼 불편함도 있고, 어느 정도의 숙련을 요구했습니다. 예를 들어, CRUD 작업 시 명령어가 어떤 인자를 받는지 미리 알고 있어야 했고, 사용자 인증 정보도 매번 반복해서 제출해야 했습니다. 

웹으로 옮겨오며 그러한 허들은 사라졌습니다. 한 번의 로그인으로 AAAP가 제공하는 모든 정보와 기능을 시각적인 도움을 받아 사용할 수 있게 되었습니다. 앞으로도 작업환경을 더욱 편리하게 사용할 수 있도록 웹 환경을 여러모로 개선해나갈 생각입니다.

 

결론

사내 플랫폼을 활용해 작업환경 서비스를 구현했고, 지속적인 개선을 통해 작업환경을 개선하고 하나로 통합했습니다. 

사용자는 필요에 따라 작업환경 종류를 선택해 생성, 업데이트, 삭제할 수 있습니다. CLI에서 웹 환경으로 옮겨감에 따라 터미널이 익숙지 않은 팀원들도 손쉽게 가상환경에 접근할 수 있게 되었습니다. 팀원은 작업환경을 구성하는 고통에서 벗어나 업무 자체에 집중할 수 있습니다. 작업환경 서비스를 사용하며 버그 리포팅을 하면, 버그는 해결되어 새 버전으로 배포됩니다. 이후의 사용자는 동일한 버그에 부닥치지 않습니다. 

작업환경 서비스를 이용하면 개인의 문제를 해결하는 것이 팀 전체의 문제를 해결하게 됩니다.

카카오톡 공유 보내기 버튼

Latest Posts

대학생 멘토링: 우물 밖 내다보기

https://www.youtube.com/watch?v=LGdb4Q5t-gw 안녕하세요. 저는 카카오톡 톡플랫폼개발팀에서 백엔드 서버 개발자로 일하고 있는 nano.son(손은호)입니다. 2023년 1월 16일, 제 모교인 경북대학교의 학생들과 판교 아지트에서 멘토링을 진행했습니다.