대부분의 서버리스(Serverless) 솔루션은 클라우드 환경에서 실행하죠. 그런데 온프레미스 환경에서도 서버리스를 실행할 수 있다는 거 알고 계셨나요? 이 글에서는 클라우드 서버리스와 온프레미스 서버리스 특징을 살펴보고, 서버리스 프레임워크인 OpenFaaS로 온프레미스 환경에서 서버리스를 실행하는 방법을 알아보겠습니다.
서버리스란?
서버리스(Serverless)란 클라우드 서비스 제공업체가 관리하는 환경에서 애플리케이션을 개발하고 배포하는 방식입니다. 이 용어는 ‘서버를 관리할 필요가 없다’는 의미에서 유래했는데요. 서버리스에서는 클라우드 서비스 제공업체가 서버를 관리하고, 인프라 확장과 유지보수 업무를 자동 처리하기에 개발자는 서버 관리에 신경 쓰지 않아도 됩니다. 개발자는 코드를 빠르게 작성하며, 개발에 더 집중할 수 있죠.
과거에는 애플리케이션을 실행하려면 물리적 서버를 구입하고 유지 관리해야 했습니다. 대부분의 서버는 구입한 하드웨어 리소스의 지극히 일부만 사용해 비용이 많이 들었죠. 클라우드 컴퓨팅이 등장하면서 물리적 서버를 구입하는 과정은 짧아졌습니다. 그러나 여전히 가상 서버를 프로비저닝, 구성, 업데이트해야 하는 부담이 있었습니다.
클라우드 서비스 제공업체는 이 문제에 대응하기 위해 자사가 직접 서버풀(Serverful) 리소스를 가져가 서버리스 기술을 제공하기 시작했습니다. 서버풀*이란 기존 서버 기반 컴퓨팅 방식으로, 애플리케이션을 배포하는 전통적인 접근 방식인데요. 서버풀 아키텍처에서는 개발자를 비롯한 사용자가 애플리케이션을 실행하는 서버를 관리할 책임이 있죠.
그러나 클라우드 서비스 제공업체가 서버풀 리소스를 갖고 서버리스 기술을 공급하면서 개발자는 서버 관리 부담을 덜었습니다. 또 편리하게 코드를 실행하고, 데이터를 관리하며, 애플리케이션을 통합할 수 있게 됐고요.
클라우드 기반 서버리스에는 다음 장점이 있습니다.
- 인프라 관리 복잡성 해소: 개발자가 인프라 구성에 시간을 쓰지 않고 코드 작성에 집중할 수 있음
- 비용 최적화: 사용한 리소스만큼 비용을 지불하고, 유휴 리소스에 자원을 낭비하지 않음
- 리소스 효율화: 리소스가 트래픽 변동에 따라 자동으로 확장돼 리소스를 효율적으로 관리할 수 있음
*서버풀 아키텍처에서는 사용자가 인프라를 더 많이 제어할 수 있음. 여기서는 서버 프로비저닝, 운영 체제 업데이트 관리, 수요에 맞는 리소스 확장이 가능함. 또 고가용성과 내결함성이 보장됨.
클라우드 서버리스 vs 온프레미스 서버리스
서버리스는 클라우드 환경에서 많이 실행합니다. 이에 클라우드는 일반적으로 서버리스 아키텍처 구축 핵심 요소로 취급되죠. 그런데 로컬, 온프레미스 인프라를 사용해 서버리스를 실행할 수도 있습니다.
온프레미스 서버리스 동작 방식은 이렇습니다. 사용자는 자체 데이터 센터에서 실행되는 로컬 서버에 애플리케이션 코드를 배포합니다. 그다음, 외부 이벤트나 트리거에 대응해 코드를 온디맨드로 실행합니다.
클라우드 서버리스와 온프레미스 서버리스 특징을 비교하면 다음과 같습니다.
특징 | 클라우드 서버리스 | 온프레미스 서버리스 |
---|---|---|
호스팅 위치 | 클라우드 호스팅 | 로컬(사무실, 데이터 센터 등) 호스팅 |
비용 | 사용량 기반 요금제로 비용 효율적임 | 워크로드(Workload) 사용 비용이 클라우드보다 더 적게 들 수 있음 |
데이터 보안 | 동일한 공간에 다른 클라우드 사용자의 애플리케이션도 호스팅되므로 애플리케이션 보안에 부정적 영향을 미칠 수 있음 | 자체 인프라로 데이터 보안 강화 |
공급업체 의존성 | 클라우드 서비스 제공업체가 지원하는 언어에 의존하며, 비용도 의존적임 | 의존성 없음 |
운영 복잡성 | 운영 관리가 간편함 | 인프라 유지 관리가 필요함 |
클라우드 서버리스는 ‘비용, 선택 언어가 클라우드 서비스 제공업체에 의존적임’을 제외하면 이점이 많습니다. 그러나 대부분의 클라우드 서비스 제공업체는 멀티 테넌트(Multi-Tenant, 논리적으로 같은 물리 서버에서 그룹/사용자 간 리소스 격리) 환경에서 서버리스를 실행하는데요. 민감한 데이터를 많이 취급하는 기업은 사내 데이터 보안 정책을 고려해 온프레미스 서버리스를 클라우드 서버리스 대안으로 활용 해도 좋습니다.
‘워크로드(Workload)’란?
컴퓨팅 시스템이 처리해야 할 작업의 양. 리소스 관점에서 워크로드 유형은 아래와 같음.
- CPU 사용량: 연산 처리에 필요한 프로세서 능력
- 메모리 사용량: 데이터 처리, 저장에 필요한 RAM
- 스토리지 I/O: 데이터 읽기/쓰기 작업에 필요한 저장 공간과 처리 속도
- 네트워크 대역폭: 데이터 전송에 필요한 네트워크 자원
온프레미스 서버리스 구현 방법
온프레미스 서버리스 플랫폼에는 Knative, Fission, Oracle Fn, Apache OpenWhisk 등 많은 프레임워크가 있습니다. 이 글에서는 GitHub에서 약 2만5100 스타(2024년 10월 기준)를 얻은 OpenFaaS를 활용한 온프레미스 서버리스 실행 방법을 살펴보겠습니다.
OpenFaaS 아키텍처

faas-cli store deploy ${서버리스 함수}
명령어를 입력하면 CRD(Custom Resource Definition)가 배포되면서 Variables로 설정된 양식에 맞게 OpenFaaS Operator가 Secret, Deployment, Service, ReplicaSet을 프로비저닝해 생성합니다. 생성된 리소스는 OpenFaaS 리소스로 관리됩니다.
사용자가 API를 호출해 요청이 생성되고 이를 처리할 때는 ‘ReplicaSet을 오토스케일링하는 방식’으로 처리됩니다. 오토스케일링은 Community Edition과 라이선스(Pro) 버전이 다르게 동작하는데요. 그 차이는 아래와 같습니다.
Community Edition
이 버전에서는 Prometheus에서 requests per second(초당 요청 수) 메트릭을 활용한 단일 확장 구성으로만 오토스케일링을 구성할 수 있습니다. 초당 요청 수가 늘어나면 AlertManager에 명시된 규칙에 따라 OpenFaaS Gateway의 /system/alert
API를 호출해 Pod 수를 자동 조정합니다.
라이선스(Pro)
이 버전에서는 별도의 OpenFaaS Operator(이하 OpenFaaS Pro Autoscaler)가 배포돼 Prometheus에서 수집된 여러 메 트릭을 활용해 알고리즘 처리된 확장 구성으로 오토스케일링을 구성할 수 있습니다. 특히 사용하지 않는 서버리스 함수의 ReplicaSet의 Pod 수를 Scale-to-Zero(Pod 0개를 가지는 ReplicaSet 구성) 상태로 만들어 CPU, 메모리 자원 낭비를 획기적으로 줄일 수 있습니다.
OpenFaaS로 온프레미스 서버리스 실행하기
이제 OpenFaaS에서 공식 제공하는 워크숍 절차에 따라 온프레미스 서버리스 실행 방법을 실습하겠습니다.
OpenFaaS는 Docker 기반으로 실행되는 서버리스 프레임워크이므로 Docker가 필요합니다. 먼저 오토스케일링 구성을 위해 Kubernetes를 로컬에 설치하고 Kubernetes 위에 OpenFaaS Server를 설치하겠습니다. 그다음, Docker 이미지 형태로 된 서버리스 함수를 올리겠습니다.
-
Docker를 설치한 상태에서 터미널을 열고, 아래 명령어를 입력해 faas-cli를 설치합니다.
curl -sLSf https://cli.openfaas.com | sudo sh