Kubernetes 환경에서 OpenFaaS 설치 및 연구

반응형

Kubernetes 환경에서 OpenFaaS 설치 및 연구

안녕하세요 김민욱입니다.

 

이번 포스팅에서는 Kubernetes 환경에서 OpenFaaS의 구조에 대해 알아보고, 설치를 통해 어떻게 서비스를 제공하는지 연구해보도록 하겠습니다. OpenFaaS 연구에 들어가기 앞서 먼저 Faas의 개념부터 간단하게 설명드리겠습니다. Faas는 Function as a service의 약자로 함수 자체를 서비스로 제공하는 것을 의미합니다. 인프라의 관점에서는 가상머신 -> 컨테이너 -> 함수의 순서로 진화하는 것으로 Faas를 이야기 하는 경우도 있고, 어플리케이션 개발 관점에서는 기존 모놀리틱 구조에서 마이크로서비스 구조, Faas 기반 구조로 진화한다고 보는 경우도 있습니다. 

 

따라서 Faas는 클라우드 위에서 하나의 어플리케이션으로 서비스를 제공하는 것이 아닌 이벤트 기반의 프로그래밍 함수를 제공하게 되므로써, 빠르고 가벼우며 이벤트를 기반으로 동작하기 때문에 리소스의 활용이 높습니다. 이렇게 클라우드 위에서 추상화 된 함수들은 API를 통해 언제 어디서든지 기능을 사용할 수 있어, 실제 개발자들의 개발 효율도 상승 할 수 있습니다.  

 

한마디로 기존 어플리케이션을 코드 레벨에서 작게 쪼게고 이를 가상화 시켜 특정 이벤트에 따라 함수 기능을 수행 할 수 있도록 합니다. Faas는 이미 상용 프로젝트로 AWS Lambda, Google 등에서 지원하고 있습니다. 하지만 이번 포스팅에서는 직접 오픈소스 프로젝트인 OpenFaaS를 구축해보고 직접 함수를 만들어 호출해보도록 하겠습니다.  ( 그림 1 출처 - [1])

 

그림 1. openFaas 로고

 

Architecture

그림 2에서는 OpenFaaS의 구조를 나타냅니다.(출처 : [2]) OpenFaaS는 크게 컨테이너 환경을 제공하는 Docker와 컨테이너에 대한 관리를 위해 Kuberntes, 모니터링을 위한 Prometheus, 외부로부터 이벤트를 송수신하기위한 OpenFaaS 게이트웨이 및 Watchdogs로 구성 됩니다. 

 

그림 2. OpenFaaS 구조

그림 2와 같은 구조가 나오기 위해서는 Kubernetes 환경은 이미 구축이 되어 있다고 가정합니다. 만약 구축 되어있지 않다면 "Kubernetes 설치하고 구성하기"를 참고하시면 될 것 같습니다. 그 이후 faas-netes라는 OpenFaaS를 오케스트레이션 해주는 별도의 툴을 이용하여 Kubernetes 환경에서 OpenFaaS를 배포하고 연동합니다.

 

그림 3. 워크플로우 

그림 3에서는 워크플로우를 나타냅니다.(출처 : [2]) 외부 관리자 혹은 사용자가 생성한 함수를 호출하기 위해 일종의 엔드포인트가 함수마다 지정 됩니다. ( e.g. /function/curl) 이에 따라 OpenFaaS 게이트웨이는 외부로부터 모든 함수 호출 및 라이프 사이클에 대한 요청을 수신하고, faas-netes를 통해 함수 호출 혹은 라이프 사이클을 진행합니다. 만약 함수 생성 요청이 오면, 함수를 컨테이너로 생성하고 이후 함수 기능을 제공합니다. 그림 3에서 Prometheus는 오토 스케일링을 위한 메트릭을 수집합니다. 

 

openFaas 설치 (by faas-netes)

먼저 faas-cli를 설치하기 위해 curl 명령어를 통합 스크립트를 수행합니다.

root@k8s-master:~$ curl -sL https://cli.openfaas.com | sudo sh

다음으로 OpenFaaS 깃헙으로 부터 faas-netes를 다운로드 합니다. 

root@k8s-master:~$ git clone https://github.com/openfaas/faas-netes

kubectl apply 명령어를 통해 yml 파일을 통해 yml에 작성 된 내용을 적용하도록 하는데 해당 파일에는 openfaas와 openfaas-fn 네임스페이스를 생성하는 구문이 들어가 있습니다. 

root@k8s-master:~# kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
namespace/openfaas created
namespace/openfaas-fn created

PASSWORD 구문은 OpenFaas 로그인시 사용 될 비밀번호를 랜덤하게 생성하고 저장합니다. 그 다음 아래 구문들을 통해 User와 password를 생성합니다. 

root@k8s-master:~# PASSWORD=$(head -c 12 /dev/urandom | shasum| cut -d' ' -f1)
root@k8s-master:~# export KUBECONFIG=/etc/kubernetes/admin.conf
root@k8s-master:~# kubectl -n openfaas create secret generic basic-auth \
--from-literal=basic-auth-user=admin \
--from-literal=basic-auth-password="$PASSWORD"

이제 OpenFaas를 서버를 실행하고 내부 포트를 연결해주면 웹에서 http://[IP]:31112의 주소로 그림 4와 같이 OpenFaas UI에 접속할 수 있게 됩니다. 

root@k8s-master:~# cd faas-netes && kubectl apply -f ./yaml
root@k8s-master:~/faas-netes# kubectl port-forward svc/gateway -n openfaas 31112:8080 &
root@k8s-master:~/faas-netes# export OPENFAAS_URL=http://127.0.0.1:31112 
root@k8s-master:~/faas-netes# echo -n $PASSWORD | faas-cli login --password-stdin

그림 4. OpenFaas 웹 UI

만약 USER 비밀번호의 확인이 필요하다면 아래 명령을 통해 확인하시면 됩니다. 

root@k8s-master:~# echo $PASSWORD

 

Test

지금부터는 실제로 간단한 함수를 호출하고 정상적으로 동작하는지 확인해보도록 하겠습니다. 본 테스트에서는 직접 함수를 작성하지않고, 기본적으로 제공되는 함수를 가지고 테스트를 진행해보도록 하겠습니다.

 

메인 화면에서 Deploy New Function 탭을 누르게 되면 그림 5와 같이 함수 리스트가 나타납니다. 해당 함수 중 Nodeinfo와 Curl을 각각 클릭하고 하단의 Deploy를 눌러줍니다. 

그림 5. 함수 추가 

그럼 메인 페이지 왼쪽 세션에 각각 함수가 추가 되고, 보시는 바와 같이 함수를 호출할 수 있는 url이 나타나게 됩니다.

 

그림 6. 추가 된 함수 정보

 

그럼 그림7에서 나타난 바와 같이 먼저 nodeinfo 함수부터 curl 명령어를 이용해 호출해 보도록하겠습니다. 

 

그림 7. HTTP를 이용한 함수 호출

HTTP를 이용해 정상적으로 해당 노드의 정보를 반환받고 띄우는 것을 확인 할 수 있습니다. 다음은 그림 8과 같이 curl 명령을 인자와 함께 호출하는 것을 진행해보겠습니다.

 

그림 8. curl 함수 호출

결론

이번 포스팅에서는 OpenFaaS에 대해서 알아보고 설치, 간단한 함수 호출까지 진행하였습니다. 추후에는 다양한 기능을 가지는 여러 함수들을 구현하고 이를 OpenFaaS를 기반으로 기능을 제공하는 포스팅을 진행하겠습니다. 해당 포스팅에 담기에는 내용이 너무 방대해져 불가피하게 구현한 함수 추가는 추후에 다루도록 하겠습니다.

 

혹 궁금한 사항이나 부족한 점이 있다면 언제든지 문의 주시면 답변드리겠습니다. 

인용글

[1] OpenFaaS Github : https://github.com/openfaas/faas

[2] OpenFaaS faas-netes: https://github.com/openfaas/faas-netes/

업데이트로그

------------------------------------------------------------------------------------------------------------------------------

해당 글은 스스로 연구한 내용을 통한 주관적인 이해를 바탕으로 작성 되었습니다. 수정 할 부분이 있거나, 다른 의견이 있으시다면 언제든지 말씀해주시면 반영하도록 하겠습니다. 읽어 주셔서 감사합니다. 끝으로 불법으로 복제하는 것은 금합니다.

 

반응형

댓글(10)

  • 2020.06.10 10:24

    비밀댓글입니다

    • 2020.06.11 09:02 신고

      안녕하세요 Q님
      잘보셨다니 다행입니다.

      결국에 Function이라는 것은 하나의 컨테이너(Pod) 입니다. 따라서 OpenFaaS를 이용해 Master에서 여러가지 Function을 만들게 되면 k8s의 스케줄러에 의해 자동적으로 적합한 Worker 노드에 분배되어 생성됩니다. :) 추가적으로 분배 된 Function들은 요청이 오게되면 Gateway에 의해 알맞은 Function에게 요청이 전달 됩니다.
      도움이 되셨으면 좋겠네요.
      좋은 하루 되세요 : )

    • 2020.06.11 14:19

      비밀댓글입니다

    • 2020.06.11 14:48 신고

      일반적으로 get pods를 통해 확인할 수 있는 것으로 알고 있는데, 좀 더 확인이 필요하지만 두가지의 경우가 있을 것으로 예상됩니다.
      1. FaaS의 특징인 Cold-Warm 상태로 인해 조회 전에 사라진 경우
      (Knative Cold-Warm 참조 https://delightwook.tistory.com/58 )
      2. Namespace 오류

      2번의 경우는 OpenFaaS에서 사용하는 Namespace 확인이 필요할 것 같습니다.
      문서에서는 아래와 같이 확인 됩니다.
      (By default all OpenFaaS functions and services are deployed to the openfaas and openfaas-fn namespaces.)

    • 2020.06.11 15:07

      비밀댓글입니다

  • Qqq
    2020.06.10 17:39

    master / worker node로 구성햇을때
    master에서 OpenFaas를 설치하고
    worker도 동일하게 설치후에
    export OPENFAAS_URL=https://[MASTER IP]:31112
    로 구성해서 해야하는걸까용?

    • 2020.06.11 09:09 신고

      안녕하세요 Qqq님

      k8s만 정상적으로 구축되어 있다면, Worker 노드에서는 별도의 작업이 필요없습니다 : )

      감사합니다.

    • Qqq
      2020.06.11 10:27

      빠른 답변감사합니다!

      별도의 작업이 필요없다 하심은

      본문에서처럼

      Master 에서만 Faas를 설치하면되고

      WorkerNode 에서는 Faas를 전혀 설치할 필요가 없다는 말씀이신가요?!

    • 2020.06.11 10:54 신고

      네 그렇습니다 : )

  • 2021.12.03 12:45

    비밀댓글입니다

Designed by JB FACTORY