본 기고문은 오픈소스 서버리스 플랫폼인 Apache OpenWhisk 를 소개한다. 먼저 서버리스와 OpenWhisk 에 대해 간단히 알아보고 OpenWhisk 이 어떻게 오픈소스로 개발되고 있는지 살펴본다. 그 다음 OpenWhisk 의 구체적인 동작방식을 통해 서버리스 아키텍처를 분석하고, 서버리스 플랫폼을 보다 빠르게 최적화한 방법을 찾아본다. 마지막으로 오픈소스 서버리스 플랫폼으로 Apache OpenWhisk 가 어떻게 발전했는지, 어떤 방향으로 개발되고 있는가 확인한다.

  1. Apache OpenWhisk – 소개 및 아키텍쳐
  2. Apache OpenWhisk – 실행 과정
  3. Apache OpenWhisk – 더 알아보기

Apache OpenWhisk 는 무엇인가?

Apache OpenWhisk 는 이벤트에 대해 함수를 실행시키는 오픈소스 클라우드 서버리스 플랫폼으로, 개발자를 코드를 실행하는 컨테이너의 관리나 운영으로부터 자유롭게 해 준다. Github 에 공개된지 1년 반 만에 400여번 포크되고, 1100여개의 이슈와 1500여개의 PR (Pull requests) 이 올라오는 활기찬 오픈소스 프로젝트이다. IBM 의 서버리스 서비스를 위한 내부 프로젝트로 초기 개발 후 2016년 2월 오픈소스로 공개되었고, 11월부터 아파치 인큐베이션을 시작하였다.

서버리스 (Serverless)란?

서버리스는 서버 없이 모든 규모의 이벤트에 대해 코드를 실행하여 응답하는 클라우드 컴퓨팅 방식이다. 서버가 없다는 표현이 약간 모호한데, 해당 이벤트에 대해 별도로 할당된 서버가 없어 사용자가 인프라 및 플랫폼 관리를 할 필요가 없다는 의미이다. 가상머신이나 베어메탈 처럼 서버나 네트워크, 스토리지 등 인프라를 서비스로 제공하는 것이 IaaS (Infrastructure as a Service), 웹 서비스를 코드만 올리면 플랫폼으로 실행시켜주는 것이 PaaS (Platform as a Service) 인 것처럼 서버리스는 FaaS (Function as a service) 라고 불리기도 한다. 이벤트가 발생했을 때 실행되는 코드가 함수 단위로 실행되기 때문이다.

가상화에 따른 IaaS 의 발전으로 물리 서버들이 가상 서버로 옮겨오면서 컴퓨팅 자원의 사용율 (Utilization) 은 급격히 높아질 수 있었다. 인프라와 플랫폼을 관리해주는 PaaS 를 사용하면 개발자가 인프라 및 플랫폼 관리에 들이는 수고까지 줄일 수 있다. 하지만 여전히 하루에 몇 번 호출되는 웹페이지 서버나 앱도 365일 24시간 대기하면서 필요 없는 자원을 점유하고 있고, 반대로 급격히 늘어나는 요청에 대해서는 오토스케일링 (Auto-scaling) 설정 등 대응 방법을 마련해야 한다. 서버리스 플랫폼에서는 요청이 있을 때만 필요한 해당되는 코드를 밀리초(ms) 단위로 실행하고, 요청이 많은 경우는 그에 비례하는 자원을 할당하여 동시에 처리하는 방법으로 사용율과 확장성을 극대화한다.

아파치 인큐베이터 (Apache Incubator)

현재 Apache OpenWhisk 는 아파치 소프트웨어 재단 (Apache Software Foundation) 의 인큐베이터 프로젝트로 승인을 받은 상태이다. 아파치 웹서버 (Apache httpd), Tomcat, Hadoop, Spark 처럼 아파치 프로젝트로 승인 받은 오픈소스 프로젝트는 특정 회사에 속한 오픈소스보다 개발자를 모아 생태계를 만들기 용이하다. IBM 은 OpenWhisk 를 Apache 프로젝트로 제안하여 프로젝트의 영속성, 투명함, 공정성을 알려 보다 넓은 개발 커뮤니티를 만들고 서버리스를 확장하는 방안을 택했다. 오픈소스 라이센스 검증이나 커미터 확충 등의 아파치 인큐베이팅이 완료되어 Apache OpenWhisk 가 정식 아파치 소프트웨어 재단의 Top-Level 프로젝트로 등록되면, 보다 많은 개발자가 Apache OpenWhisk 에 대한 신뢰를 가지고 개발에 참여할 수 있을 것으로 기대한다.

apache_podling.png

<그림> 아파치 인큐베이터에서 성장중인 Apache OpenWhisk

OpenWhisk 용어

어떤 이벤트가 발생했을 때 코드를 수행하여 결과를 돌려주는 것이 서버리스의 기본 실행 단위이다. 이러한 실행 과정에서 플랫폼마다 조금 다른 용어를 사용하기 때문에 OpenWhisk 에서 사용하는 용어들을 먼저 정리해본다.

openwhisk_overview.png

<그림> OpenWhisk 용어

트리거 (Triggers)

데이터베이스, 장치, 웹 등에서 발생한 이벤트를 트리거라고 한다.

액션 (Actions)

액션은 지원되는 프로그래밍 언어의 단일 함수로 구현된 코드로, 트리거가 발생했을 때 실행되어 결과를 반환한다.

룰 (Rules)

룰은 트리거에서 발생한 이벤트 대해 어떤 액션이 실행될지 정의한다.

시퀸스 (Sequences)

액션을 연결하는 조합을 만들어 실행하는 것을 시퀸스라고 한다.

패키지 (Packages)

트리거와 액션을 모아 하나의 패키지로 공개할 수 있다. 패키지로 정의된 외부 서비스를 사용할 수도 있고, 직접 만든 패키지를 외부에 공개할 수도 있다.

OpehWhisk 에서 사용 가능한 프로그래밍 언어

액션에 실행 가능한 언어로는 Node.js v6, Swift v3, Python, Java, PHP 가 기본 지원된다. 실제 액션이 컨테이너에서 실행되기 때문에 도커 (Docker) 이미지도 액션으로 지정이 가능하니, 사실상 Linux 에서 실행 가능한 모든 언어가 지원된다. Go, Haskell, Scala, Kotlin 등을 OpenWhisk 에서 사용하는 예제를 쉽게 잧아볼 수 있다.
Node.js 와 Express.js 프레임워크가 익숙하다면 openwhisk-expressjs npm 패키지를 사용할 수 있다. Express.js 기반으로 OpenWhisk 액션을 작성하거나, 기존 Express.js 프레임워크를 사용한 앱을 OpenWhisk 에서 구동할 수 있다.

Apache OpenWhisk 아키텍처

OpenWhisk 는 오픈소스 플랫폼답게 오픈소스 컴포넌트와 프레임워크로 구성되어 있다. OpenWhisk 는 동기 (Sync), 비동기(Async) 실행방식을 모두 지원하는데, HTTP 로 간단한 비동기 요청을 한다면 다음과 같은 순서로 요청이 진행된다.

openwhisk_execution_architecture.png

<그림> OpenWhisk 실행 아키텍처

  1. 시스템의 첫 관문: nginx
    OpenWhisk 는 REST API 로 동작한다. wsk-CLI 로 명령을 내렸을 때 도 HTTP 요청으로 변환된다. 시스템에 들어온 REST HTTP 요청은 nginx 에서 받아 SSL 을 처리하고 실제 요청을 다음 단계인 컨트롤러에게 전달한다.
  2. 실제 시스템의 시작: 컨트롤러
    실제 REST 요청을 다루는 컨트롤러는 Scala 로 구현되어 있는데, Spray 와 Akka 프레임워크를 사용하여 고성능 비동기 REST 요청을 처리할 수 있게 되어 있다.
  3. 인증과 권한: CouchDB
    사용자 인증과 사용 권한 확인을 위해 OpenWhisk 는 NoSQL 데이터베이스인 CouchDB 를 사용한다. OpenWhisk 액션을 요청한 사용자가 실제 존재하는지, 해당 액션에 대한 권한이 있는지 CouchDB 에서 확인한다.
  4. 액션 가져오기: CouchDB
    인증된 사용자가 액션을 실행할 권한이 있다면, 실제 실행할 액션의 코드와 기본 파라메터를 CouchDB 에서 가져온다.
  5. 액션 실행할 대상 찾기: Consul
    액션 실행에 필요한 정보가 준비되었으니 액션을 수행할 대상인 인보커(Invoker)를 찾아야 한다. OpenWhisk 는 Consul 을 통해 운영중인 인보커를 관리하고 정상 상태인지 파악한다. 컨트롤러는 Consul 에 현재 사용 가능한 인보커 목록을 받아 실행할 대상을 결정한다.
  6. 줄 세우기: Kafka
    클라우드 설계에서는 언제나 장애에 대비해야 한다. OpenWhisk 는 큐(Queue) 시스템으로 빠르고 안정적인 Kafka 를 사용한다. 현재 예제는 비동기 방식이기 때문에 Kafka 가 실행 요청을 성공적으로 받았다면, 마치 번호표처럼 ActivationId 를 생성해서 사용자에게 돌려주고 HTTP 세션을 끝낸다.
  7. 액션을 실제로 실행: 인보커 (Invoker)
    준비된 액션의 코드를 인보커가 실제로 실행한다. 인보커는 스칼라로 짜여 있으며, 도커 컨테이너에 코드를 올려 실행하게 된다.
  8. 결과 저장하기: CouchDB
    인보커는 액션을 실행한 결과와 도커 로그를 CouchDB 데이터베이스에 저장하고 컨트롤러에 돌려준다. 사용자는 6번에서 받은 ActivationId 를 사용해서 실행 결과를 확인할 수 있다.

다음 글: Apache OpenWhisk – 실행 과정


본 글은 마이크로소프트웨어 390호에 기고된 글입니다.

에 대한 댓글이 1건 있습니다"Apache OpenWhisk – 소개 및 아키텍쳐"

  1. […] 원문보기 :  Apache OpenWhisk – 소개 및 아키텍쳐 […]

토론 참가

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.