대부분의 서버리스(Serverless) 솔루션은 클라우드 환경에서 실행하죠. 그런데 온프레미스 환경에서도 서버리스를 실행할 수 있다는 거 알고 계셨나요? 이 글에서는 클라우드 서버리스와 온프레미스 서버리스 특징을 살펴보고, 서버리스 프레임워크인 OpenFaaS로 온프레미스 환경에서 서버리스를 실행하는 방법을 알아보겠습니다.

서버리스란?

서버리스(Serverless)란 클라우드 서비스 제공업체가 관리하는 환경에서 애플리케이션을 개발하고 배포하는 방식입니다. 이 용어는 ‘서버를 관리할 필요가 없다’는 의미에서 유래했는데요. 서버리스에서는 클라우드 서비스 제공업체가 서버를 관리하고, 인프라 확장과 유지보수 업무를 자동 처리하기에 개발자는 서버 관리에 신경 쓰지 않아도 됩니다. 개발자는 코드를 빠르게 작성하며, 개발에 더 집중할 수 있죠.

과거에는 애플리케이션을 실행하려면 물리적 서버를 구입하고 유지 관리해야 했습니다. 대부분의 서버는 구입한 하드웨어 리소스의 지극히 일부만 사용해 비용이 많이 들었죠. 클라우드 컴퓨팅이 등장하면서 물리적 서버를 구입하는 과정은 짧아졌습니다. 그러나 여전히 가상 서버를 프로비저닝, 구성, 업데이트해야 하는 부담이 있었습니다.

클라우드 서비스 제공업체는 이 문제에 대응하기 위해 자사가 직접 서버풀(Serverful) 리소스를 가져가 서버리스 기술을 제공하기 시작했습니다. 서버풀*이란 기존 서버 기반 컴퓨팅 방식으로, 애플리케이션을 배포하는 전통적인 접근 방식인데요. 서버풀 아키텍처에서는 개발자를 비롯한 사용자가 애플리케이션을 실행하는 서버를 관리할 책임이 있죠.

그러나 클라우드 서비스 제공업체가 서버풀 리소스를 갖고 서버리스 기술을 공급하면서 개발자는 서버 관리 부담을 덜었습니다. 또 편리하게 코드를 실행하고, 데이터를 관리하며, 애플리케이션을 통합할 수 있게 됐고요.

클라우드 기반 서버리스에는 다음 장점이 있습니다.

  1. 인프라 관리 복잡성 해소: 개발자가 인프라 구성에 시간을 쓰지 않고 코드 작성에 집중할 수 있음
  2. 비용 최적화: 사용한 리소스만큼 비용을 지불하고, 유휴 리소스에 자원을 낭비하지 않음
  3. 리소스 효율화: 리소스가 트래픽 변동에 따라 자동으로 확장돼 리소스를 효율적으로 관리할 수 있음

*서버풀 아키텍처에서는 사용자가 인프라를 더 많이 제어할 수 있음. 여기서는 서버 프로비저닝, 운영 체제 업데이트 관리, 수요에 맞는 리소스 확장이 가능함. 또 고가용성과 내결함성이 보장됨.

클라우드 서버리스 vs 온프레미스 서버리스

서버리스는 클라우드 환경에서 많이 실행합니다. 이에 클라우드는 일반적으로 서버리스 아키텍처 구축 핵심 요소로 취급되죠. 그런데 로컬, 온프레미스 인프라를 사용해 서버리스를 실행할 수도 있습니다.

온프레미스 서버리스 동작 방식은 이렇습니다. 사용자는 자체 데이터 센터에서 실행되는 로컬 서버에 애플리케이션 코드를 배포합니다. 그다음, 외부 이벤트나 트리거에 대응해 코드를 온디맨드로 실행합니다.

클라우드 서버리스와 온프레미스 서버리스 특징을 비교하면 다음과 같습니다.

특징클라우드 서버리스온프레미스 서버리스
호스팅 위치클라우드 호스팅로컬(사무실, 데이터 센터 등) 호스팅
비용사용량 기반 요금제로 비용 효율적임워크로드(Workload) 사용 비용이 클라우드보다 더 적게 들 수 있음
데이터 보안동일한 공간에 다른 클라우드 사용자의 애플리케이션도 호스팅되므로 애플리케이션 보안에 부정적 영향을 미칠 수 있음자체 인프라로 데이터 보안 강화
공급업체 의존성클라우드 서비스 제공업체가 지원하는 언어에 의존하며, 비용도 의존적임의존성 없음
운영 복잡성운영 관리가 간편함인프라 유지 관리가 필요함

클라우드 서버리스는 ‘비용, 선택 언어가 클라우드 서비스 제공업체에 의존적임’을 제외하면 이점이 많습니다. 그러나 대부분의 클라우드 서비스 제공업체는 멀티 테넌트(Multi-Tenant, 논리적으로 같은 물리 서버에서 그룹/사용자 간 리소스 격리) 환경에서 서버리스를 실행하는데요. 민감한 데이터를 많이 취급하는 기업은 사내 데이터 보안 정책을 고려해 온프레미스 서버리스를 클라우드 서버리스 대안으로 활용해도 좋습니다.

참고

‘워크로드(Workload)’란?

컴퓨팅 시스템이 처리해야 할 작업의 양. 리소스 관점에서 워크로드 유형은 아래와 같음.

  1. CPU 사용량: 연산 처리에 필요한 프로세서 능력
  2. 메모리 사용량: 데이터 처리, 저장에 필요한 RAM
  3. 스토리지 I/O: 데이터 읽기/쓰기 작업에 필요한 저장 공간과 처리 속도
  4. 네트워크 대역폭: 데이터 전송에 필요한 네트워크 자원

온프레미스 서버리스 구현 방법

온프레미스 서버리스 플랫폼에는 Knative, Fission, Oracle Fn, Apache OpenWhisk 등 많은 프레임워크가 있습니다. 이 글에서는 GitHub에서 약 2만5100 스타(2024년 10월 기준)를 얻은 OpenFaaS를 활용한 온프레미스 서버리스 실행 방법을 살펴보겠습니다.

OpenFaaS 아키텍처

OpenFaaS Gateway 아키텍처. 출처=OpenFaaS 공식 기술 문서 | 인포그랩 GitLab
OpenFaaS Gateway 아키텍처. 출처=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 이미지 형태로 된 서버리스 함수를 올리겠습니다.

  1. Docker를 설치한 상태에서 터미널을 열고, 아래 명령어를 입력해 faas-cli를 설치합니다.

    curl -sLSf https://cli.openfaas.com | sudo sh

    Windows를 사용한다면, Git Bash를 설치하고 명령어에서 sudo를 제외합니다.

    curl -sLSf https://cli.openfaas.com | sh
  2. faas-cli 설치가 정상적으로 완료되면 아래 명령어를 입력해 확인합니다.

    faas-cli version
    faas-cli 설치 후 버전을 확인하는 화면 | 인포그랩 GitLab
    faas-cli 설치 후 버전을 확인하는 화면

  3. 아래 명령어를 입력해 kubectl을 설치합니다.

    export VER=$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)
    export ARCH=$(uname -s | tr '[:upper:]' '[:lower:]')/$(uname -m | sed -e 's/x86_64/amd64/' -e 's/aarch64/arm64/')
    curl -LO https://storage.googleapis.com/kubernetes-release/release/$VER/bin/$ARCH/kubectl
    chmod +x kubectl
    sudo mv kubectl /usr/local/bin/

    Windows를 사용하면, $HOME/bin/ 디렉터리를 만들고 설치합니다.

    export VER=$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)
    curl -LO https://storage.googleapis.com/kubernetes-release/release/$VER/bin/windows/amd64/kubectl.exe
    chmod +x kubectl.exe
    mkdir -p $HOME/bin/
    mv kubectl $HOME/bin/
  4. kubectl 설치가 정상적으로 완료되면 아래 명령어를 입력해 확인합니다.

    kubectl version
    kubectl 설치 후 버전을 확인하는 화면 | 인포그랩 GitLab
    kubectl 설치 후 버전을 확인하는 화면

    현재 연결된 클러스터가 하나도 없어서 The connection to the server localhost:8080 was refused - did you specify the right host or port? 라는 메시지가 나오는데요. 이에 k3d를 이용해 클러스터를 만듭니다. k3d는 Rancher 사의 k3s 경량 Kubernetes 배포판을 컨테이너화한 프로젝트로, 로컬 클러스터를 쉽게 만드는 도구입니다.

  5. 아래 명령어를 입력해 k3d를 설치합니다.

    curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | sh
  6. k3d 설치가 정상적으로 완료되면 아래 명령어를 입력해 확인합니다.

    k3d version
    k3d 설치 후 버전을 확인하는 화면 | 인포그랩 GitLab
    k3d 설치 후 버전을 확인하는 화면

  7. 아래 명령어를 입력해 k3d로 로컬 클러스터를 만듭니다.

    k3d cluster create 클러스터이름
    k3d로 로컬 클러스터가 생성되고 Kubernetes 컨텍스트가 자동 이동된 모습 | 인포그랩 GitLab
    k3d로 로컬 클러스터가 생성되고 Kubernetes 컨텍스트가 자동 이동된 모습

  8. 아래 명령어를 입력해 Arkade를 설치합니다. Arkade는 Kubernetes 위에 각종 도구를 빠르게 설치하는 도구입니다.

    curl -sLS https://get.arkade.dev | sudo sh

    Windows를 사용하면, Git Bash를 설치하고 명령어에서 sudo를 제외합니다.

    curl -sLS https://get.arkade.dev | sh
  9. 아래 명령어를 입력해 Arkade로 OpenFaas 구동에 필요한 리소스를 배포합니다.

    arkade install openfaas
    [carbon.now.sh](http://carbon.now.sh/) 사이트를 이용해 터미널을 중략한 결과 | 인포그랩 GitLab
    carbon.now.sh 사이트를 이용해 터미널을 중략한 결과

  10. Kubernetes에 배포된 Gateway 부분의 서비스 포트를 로컬에 바인딩합니다.

    kubectl port-forward -n openfaas svc/gateway 8080:8080 &
  11. faas-cli가 바인딩 된 포트로 동작하도록 자격 증명을 넣습니다.

    PASSWORD=$(kubectl get secret -n openfaas basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode; echo)
    echo -n $PASSWORD | faas-cli login --username admin --password-stdin
  12. 아래 명령어를 입력해 OpenFaas의 admin 초기 비밀번호를 알아냅니다.

    echo $(kubectl -n openfaas get secret basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode)
  13. 아래 명령어를 입력해 faas-cli로 서버리스 함수를 생성하고 리스트를 확인합니다. figlet 서버리스 함수는 주어진 텍스트를 ASCII 로고로 응답하는 데모 이미지입니다.

    faas-cli store deploy figlet
    faas-cli list
    faas-cli로 서버리스 함수를 생성하고 리스트를 확인하는 화면 | 인포그랩 GitLab
    faas-cli로 서버리스 함수를 생성하고 리스트를 확인하는 화면

  14. 브라우저를 열고 http://127.0.0.1:8080/에 접속합니다. 그다음, 아이디에 admin, 위에서 알아낸 초기 비밀번호를 입력해 대시보드에 접속합니다.

    아래 이미지 왼쪽에 보이는 figlet을 클릭하고, 아무 텍스트나 입력한 다음, Invoke를 누릅니다. 그러면, 터미널에서 사용할 수 있는 ASCII 로고가 아래 이미지와 같이 응답합니다.

    터미널에서 사용할 수 있는 ASCII 로고 응답 결과를 확인하는 화면 | 인포그랩 GitLab
    터미널에서 사용할 수 있는 ASCII 로고 응답 결과를 확인하는 화면

제한 사항

OpenFaaS의 Community Edition 버전 기능은 제한적입니다. 그렇다고 라이선스 버전을 이용하기에는 라이선스 비용이 월 1200달러(약 165만원)라 부담될 수 있습니다.

이 부담을 덜고 싶은 기업은 Apache OpenWhisk를 사용하는 걸 권장합니다. 이는 무료로 사용할 수 있는 오픈 소스 서버리스 프레임워크인데요. Apache License 2.0 하에 배포돼 상업적 사용 등 다양한 용도로 자유롭게 활용할 수 있습니다.

기업은 조직 규모, 워크로드 특성, 예산, 기술 요구사항에 따라 OpenFaaS의 유료 버전을 선택하거나, Apache OpenWhisk와 같은 무료 대안을 선택하면 됩니다. 각 선택지의 장단점을 신중히 평가해 최적의 솔루션을 고르세요.

맺음말

지금까지 클라우드 서버리스와 온프레미스 서버리스 특징을 살펴보고, 온프레미스 서버리스 실행 방법을 알아봤습니다. 클라우드가 서버리스 시장을 주도하지만, 온프레미스 서버리스도 충분히 매력적인 대안입니다. OpenFaaS와 Apache OpenWhisk 같은 도구를 사용하면 자체 데이터 센터에서도 서버리스 아키텍처를 구축할 수 있습니다. 이는 비용 절감, 데이터 보안 강화, 클라우드 의존성 탈피 등 이점이 많습니다. 클라우드든, 온프레미스든, 서버리스는 여러분 조직의 IT 인프라 효율성과 유연성을 크게 높일 것입니다.

참고 자료

  1. “서버리스 컴퓨팅이란 무엇인가요?”, AWS, https://aws.amazon.com/what-is/serverless-computing/
  2. “Introduction to common serverless challenges”, Prisma’s Data Guide, https://www.prisma.io/dataguide/serverless/serverless-challenges
  3. Foti Sakellaropoulos, “Is On-Prem Serverless a good alternative to Cloud Serverless?”, LIMEPOINT, 2019.5.31, https://www.limepoint.com/blog/is-on-prem-serverless-a-good-alternative-to-cloud-serverless
  4. Daniel Oh, “7 open source platforms to get started with serverless computing”, Opensource.com, 2018.11.15, https://opensource.com/article/18/11/open-source-serverless-platforms
  5. Mehulce, “Understanding Serverless and Serverful Computing: A Comprehensive Guide”, Medium, 2024.3.10, https://medium.com/@mehulce90/understanding-serverless-and-serverful-computing-a-comprehensive-guide-40b9694ce57e
  6. OpenFaaS 홈페이지, https://www.openfaas.com/
  7. OpenFaaS 공식 기술 문서, https://docs.openfaas.com/
  8. OpenFaaS Workshop, https://github.com/openfaas/workshop
  9. OpenFaaS Plans & Pricing, https://www.openfaas.com/pricing/
  10. OpenFaaS Gateway 기술 문서, https://docs.openfaas.com/architecture/gateway/#openfaas-api-gateway-portal
  11. OpenFaaS Invocations 기술 문서, https://docs.openfaas.com/architecture/invocations/
  12. OpenFaaS Auto-scaling your functions 기술 문서, https://docs.openfaas.com/architecture/autoscaling/
  13. OpenFaaS Community Edition (Alert Manager Rule), https://github.com/openfaas/faas-netes/blob/master/chart/openfaas/templates/prometheus-cfg.yaml#L164
  14. Apache Openwhisk Quick Start, https://github.com/apache/openwhisk?tab=readme-ov-file#quick-start
  15. K8s Arkade, https://github.com/alexellis/arkade
  16. k3d, https://github.com/k3d-io/k3d
  17. “The What, Why and How of On-Premises Serverless Computing”, ITPro Today, 2019.1.2, https://www.itprotoday.com/cloud-native/the-what-why-and-how-of-on-premises-serverless-computing
  18. 사동환(Sabo), “서버리스 사용, 이것부터 주의하세요”, 인포그랩, 2024.4.3, https://insight.infograb.net/blog/2024/04/03/serverless-architecture/

지금 이 기술이 더 궁금하세요? 인포그랩의 DevOps 전문가가 알려드립니다.