Serverless Function
Last updated
Last updated
AWS 람다, Azure 펑션 등 플랫폼에서는 CLI를 통해 코드를 업로드하면 클라우드 속 어디선가 코드가 실행된다.
따라서 사용자가 직접 애플리케이션을 컴파일하고 컨테이너 이미지를 빌드하고 YAML파일로 리소스를 정의하지 않아도 된다.
Kubeless를 사용하면 소스 코드 파일을 펑션으로 배치하면 이를 컨트롤러가 관리해주게 된다. (현재는 Kubeless를 maintain 하고 있지 않아 다른 도구를 사용해야 할 것이다.)
펑션 실행은 CLI를 통해 직접 제어할 수도 있고, 트리거를 만들어 HTTP 요청을 받아 실행할 수도 있고, 메시지 큐를 구독하게 하거나 주기적으로 실행할 수 있다.
코드를 입력받고 컨테이너로 패키징한 후 코드를 실행할 여러 트리거들을 만든다.
구체적인 과정은 다음과 같다.
kubeless 리소스를 배치하여 컨트롤러를 파드로 배치하고, 펑션 정의, 펑션을 실행하는 트리거 정의를 CRD로 등록한다.
kubeless CLI를 파드로 실행한다.
서버리스 펑션을 배치하면 컨트롤러가 컨피그맵과 파드를 하나씩 가진 디플로이먼트를 생성한다.
서버리스 펑션은 이벤트의 상세 정보, 펑션 자체의 컨텍스트 정보를 인자로 받고, 수행이 끝나면 문자열을 반환한다.
서버리스 펑션을 만들 때에는 전체 프로젝트 구조를 압축한 zip 파일 혹은 단일 파일을 업로드하면 된다.
Kubeless는모든 런타임 플랫폼에 빌드 도구가 들어있는 초기화 컨테이너 이미지를 만들어두어, 컨피그맵 볼륨에서 소스 코드를 가져와 애플리케이션을 빌드하고 빌드된 바이너리를 공디렉토리 볼륨에 복사한다. 이후 애플리케이션 컨테이너가 바이너리를 실행한다.
트리거를 생성하면 트리거가 파드에 대응하는 서비스에 요청을 보내준다. 이 때 트리거는 HTTP 요청, 메시지 큐, 스케줄 등이 해당된다.
애플리케이션 파드와 동일하게 스케일링이 가능하며, 파드 간 로드밸런싱도 이뤄진다. 이 파드는 평범한 쿠버네티스 리소스이므로 별도의 계층이 관리할 필요가 없이 기존 쿠버네티스에 잘 융합되어 동작한다.
프록시를 배치해 HTTP 요청으로 펑션을 호출하도록 할 수도 있고, 직접 명령어를 이용해 펑션을 호출할 수도 있다.
인그레스 규칙과 인그레스 컨트롤러를 사용해 파드에서 실행되는 웹 애플리케이션과 서버리스 파드를 외부에 노출시키면, 언뜻 보면 같은 시스템에서 돌아가는 것 처럼 제공할 수 있다.
서버리스 펑션을 많이 사용하면 펑션 하나하나가 각각 언어 런타임을 읽어들이는 데에 메모리를 소모하므로 파드 축출이 발생하기 쉽다.
Serverless 프로젝트를 이용하면 서버리스 펑션의 정의를 추상화하고 다른 서버리스 플랫폼과 쉽게 통합할 수 있다.
펑션과 트리거를 YAML 파일에 한 번에 정의할 수 있다.
Serverless의 CLI는 서버리스 펑션의 실제 실행을 프로바이더에게 맡긴다.
서버리스 펑션이 정의된 YAML파일을 배치하면 kubeless 펑션과 트리거가 생성된다. 그리고 kubeless 컨트롤러가 파드를 실행하여 사용자 정의 리소스를 관리하게 된다.