필자가 직접 그린 이미지
Big Picture
OpenFaaS 설치 in K8s Cluster
•
K8s Cluster에 OpenFaaS를 설치하면
◦
위와 같이 Alert Manager, Gateway, NATS, Prometheus, Queue-worker가 각각 Pod 형태로 실행된다.
◦
또한, Namespace가 2개 생성되는데, 하나는 위와 같은 컴포넌트들이 담기는 openfaas 이고 다른 하나는 여러 함수들이 포함되는 openfaas-fn이다.
OpenFaas Architecture
필자가 직접 그린 이미지
•
위의 이미지와 같이 크게 openfaas와 openfaas-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에 배포된 함수를 호출하려면 위와 같이 활용할 수 있게 된다.