Search

[OpenFaaS] 구조 및 아키텍처 분석

필자가 직접 그린 이미지

Big Picture

OpenFaaS 설치 in K8s Cluster

K8s Cluster에 OpenFaaS를 설치하면
위와 같이 Alert Manager, Gateway, NATS, Prometheus, Queue-worker가 각각 Pod 형태로 실행된다.
또한, Namespace가 2개 생성되는데, 하나는 위와 같은 컴포넌트들이 담기는 openfaas 이고 다른 하나는 여러 함수들이 포함되는 openfaas-fn이다.

OpenFaas Architecture

필자가 직접 그린 이미지
위의 이미지와 같이 크게 openfaasopenfaas-fn Namespace로 구별이 된다.
각 컴포넌트의 세부적인 내용과 역할을 아래에서 설명하겠다.

Components

1. Gateway

함수 호출 및 라우팅

동기 호출 (Synchronous Invocation)
클라이언트의 HTTP 요청에서 함수 이름(function_name) 확인
해당 이름의 Service로 HTTP 요청을 전달 (실제로는 각 노드의 kube-proxy가 처리)
비동기 호출 (Asynchronous Invocation)
해당 요청은 즉시 NATS 메시지 큐에 저장
Queue-worker가 NATS를 구독하다가 해당되는 메시지 처리
Ex) 대량의 데이터, 긴 실행시간 작업(PDF 생성, 비디오 인코딩 등), 웹훅 처리(외부 서비스에서 데이터 수신)

인증 및 보안

인증 정보는 K8s Secret 객체에 저장되며, 사용자 이름과 비밀번호를 통해 인증
인증된 사용자가 아니면 함수 호출 및 API 접근 불가능

2. Prometheus (+ Alert Manager)

메트릭 수집 방식

OpenFaaS의 Gateway가 제공하는 HTTP Endpoint(/metrics)에 주기적으로 접속하여 데이터를 가져옴(pull 방식)

데이터 저장

수직한 메트릭 데이터는 로컬 디스크에 저장
이러한 저장 방식은 효율적인 읽기 및 쿼리 작업이 가능하며 설치가 매우 쉬움

알람 기능

수집된 데이터를 기반으로 Alert Manager와 연동
이를 통해 사용자에게 알람 기능 제공

3. NATS & Queue-worker

NATS

오픈소스 메시지 큐 시스템이며
클라우드 네이티브 애플리케이션 및 분산 시스템에 메시지를 안정적이고 빠르게 전달하기 위해 설계됨
1.
발행/구독 모델(Publish-Subscribe): Gateway가 메시지를 특정 주제(subject)로 발행하면, 해당 주제를 구독한 Subscriber들이 수신
2.
Queue 그룹: 여러 Subscriber가 같은 Queue 그룹에 속하면, 메시지는 그룹 내 하나의 Subscriber에게만 전달

Queue-worker

NATS 큐에서 비동기 요청을 소비(consume)하고 이를 기반으로 OpenFaaS 함수를 호출
1.
메시지 소비(consume):
NATS 큐(faas-request)에 쌓인 요청을 가져옴
요청은 HTTP 형식으로 변환되어 함수 호출에 사용됨
2.
함수 호출: 해당 메시지를 소비하고, 이를 기반으로 함수를 호출함

Workflow

1. 함수 작성

faas-cli template store pull python3-http faas-cli new --lang python3-http my-function
Bash
복사
이 명령어는 my-function 디렉토리를 생성하고
기본 핸들러 파일(handler.py)과 설정 파일(my-function.yml)을 만듦

2. 함수 코드 수정

def handle(event, context): name = event.body or "World" return { "statusCode": 200, "body": f"Hello, {name}!" }
Python
복사
handler.py 파일을 수정하여 원하는 로직을 구현한다.
my-function.yml은 다음과 같다:
version: 1.0 provider: name: openfaas gateway: http://127.0.0.1:8080 functions: foo: lang: python3 # Python 템플릿 사용 handler: ./foo # 핸들러 디렉토리 경로 image: mydockerhub/foo:latest # Docker 이미지 이름 (Docker Hub에 업로드된 이미지) environment: # 환경 변수 설정 write_debug: true read_debug: true secrets: # OpenFaaS에서 관리하는 비밀 정보 사용 - db_password # 예시 비밀 이름
YAML
복사

3. 함수 빌드 및 배포

faas-cli build -f my-function.yml
Bash
복사
Docker 이미지 빌드 : 작성한 함수를 Docker 이미지로 빌드한다.
faas-cli push -f my-function.yml
Bash
복사
Docker 이미지 푸시 : 이미지를 Docker Hub에 업로드한다.

4. 함수 클러스터에 배포

faas-cli deploy -f my-function.yml
Bash
복사
배포된 이미지를 클러스터에 배포한다.
배포가 완료되면, OpenFaaS Gateway에서 해당 함수에 접근할 수 있다:
http://<gateway-ip>:8080/function/my-function

5. 함수 호출 및 테스트

HTTP 요청으로 함수 호출
curl -X POST http://<gateway-ip>:8080/function/my-function -d '{"name": "Alice"}'
Bash
복사
OpenFaaS UI에서 테스트

6. 함수 활용

async function callFunction() { const response = await fetch('http://<gateway-ip>:8080/function/my-function', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: 'Alice' }) }); const data = await response.json(); console.log(data.body); // 출력: Hello, Alice! } callFunction();
JavaScript
복사
웹사이트에서 OpenFaaS에 배포된 함수를 호출하려면 위와 같이 활용할 수 있게 된다.