서버리스 컴퓨팅 개념이 등장한지는 꽤 오래되었습니다. (검색을 해 보니 2014년도에 등장했었다라고 하네요..)
'서버리스'라는 개념을 처음 접했을 때, 저는 '꽤 파격적이네..' 라고 인상깊게 생각했었던 기억이 납니다.
IT 워크로드를 수용하는 인프라가 계속 경량화되어 가는 흐름 속에서, 서버리스는 무언가 궁극의 종착점 같은 느낌이었다고 할까요.
(물리서버 -> 가상화 -> 클라우드 -> 컨테이너 -> 서버리스 -> Next?)
자신이 만든 애플리케이션(혹은 코드 덩어리)을 실행하기 위해서 '직접 서버를 관리할 필요가 없다'라는 컨셉이 뭐랄까, 미래 지향적인 느낌이었습니다.
- 서버리스도 사실은 코드를 실행하기 위한 런타임(컨테이너 환경과 같은)이 필요하고, 누군가(CSP등)는 그것을 관리해야한다라는 점을 지적하기도 합니다. 하지만 서버리스 서비스를 이용하는 '사용자' 입장에서는 런타임을 관리할 필요가 없고, 자신의 코드를 실행하기 위한 컴퓨팅 파워와 시간 만큼의 비용만 지불하면 되므로 분명 기존 인프라 대비 장점이 있다고 볼 수 있습니다.
들어서 알고는 있었지만 체험(사용)해 보지는 못하고 있었던, 서버리스를 직접 손으로 만져 보기로(hands-on) 마음 먹었습니다.
- AWS나 Azure등의 CSP가 제공하는 서버리스 서비스(람다,azure function 등) 보다는 오픈 소스 서버리스 플랫폼 직접 설치해 보는 쪽으로 정했습니다. 그편이 직접 손으로 만져보는 것에 가까울 테니까요.
오픈소스 서버리스 플랫폼 - OpenFaas 로 선택!
OpenFaaS?
- 서버리스 Function을 쉽게 만들어서, Kubernetes 환경에 간편하게 배포하도록 도와주는 것을 목표로 하고 있습니다.
- 그리고 Function을 구동하는 런타임을 도커로 가져가고 있어서, 특정한 Cloud 환경에 종속되지 않는다(CSP Lock-In 회피)는 장점이 있다고 주장하고 있습니다.
- 사실, 오픈소스 서버리스 플랫폼은 이외에도 꽤 있었습니다.(openwhisk, kubeless, knative 등)
. 사전 조사하다보니, kubernetes 환경에 설치가 상대적으로 간편해 보여서 OpenFaaS를 선택한 것 뿐입니다
사전 작업 - Kubernetes 설치
OpenFaaS를 체험하기에 앞서 우선 쿠버네티스(Kubernetes) 부터 깔아봐야겠죠~
요즈음 컨테이너 생태계의 대세가 Kubernetes이니만큼, 구글링을 해보니 많은 블로거들이 조언을 해주고 계셨습니다
저는 아래 블로그를 참조해봤습니다
- 참조 블로그 : https://medium.com/finda-tech/overview-8d169b2a54ff
설치 과정에 대한 요약
- 사전 준비 사항: kubernetes를 설치할 머신(저는 가상서버를 활용했습니다)
. 마스터 노드와 워커 노드로 사용할 가상서버를 1대씩 준비했습니다.
. 가상서버 스펙: 2vcore/4GB(메모리), 20GB HDD, ubuntu 18.04
- swap 메모리 비활성화
(kubernetes 가 메모리 스왑 상황을 고려하지 않고 설계되었다고 함)
. swapoff -a
. /etc/fstab 에서 swap 부분 #처리
- Docker 설치: 쿠버네티스가 관리하는 컨테이너 런타임
. 참조 블로그에 기술된 내용 그대로 설치했습니다.
. 해당 블로그 내용에는 도커 데몬의 드라이버를 교체(cgroupfs -> systemd)하는 부분이 있어서 따라 했습니다만.. 꼭 안해도 설치는 되는 것 같습니다.
- 쿠버네티스를 위한(클러스터 구성/관리 위한) 도구 설치
. 설치 대상: kubeadm, kubelet, kubectl
. 위의 3개 도구를 마스터/워커 노드에 모두 설치했습니다 (역시, 참조 블로그 내용대로 진행)
. 설치를 완료하고 각 도구에 대한 버전을 조회해 보면 아래와 같습니다.
- 마스터 노드 생성 및 설정
. 단 2줄의 명령어로 마스터 노드 set up 이 끝났습니다.
. 쿠버네티스 API 서버와 Pod 네트워크 구성을 위한 설정이 포함되어 있었습니다
(Pod Network을 위한 CIDR, Flannel 이라는 NW 구성위한 Add On 설정)
. 주의할 점은 쿠버네티스 API 서버 IP를 마스터노드의 eth0에 할당된 IP로 기재해야한다는 것입니다
. 또한, 쿠버네티스 설정 파일을 os 환경 변수로 등록을 해주어야 kubectl 의 사용이 가능했습니다.
~/.profile
위의 파일에서 아래 문구를 입력합니다.
export KUBECONFIG=/etc/kubernetes/admin.conf
source ~/.profile
- 워커 노드 설정
. 워커 노드는 마스터 노드에 조인(Join)해주는 명령어로 설정이 끝납니다.
. 주의할점은 마스터 노드 설정 완료시 확인할 수 있는 토큰 정보를 포함해서 join 요청해야 한다는 것입니다.
- 쿠버네티스 클러스터 구성 확인
. 워커 노드까지 설정되었으면, 아래와 같이 확인해 볼 수 있습니다.
설치 과정에 대한 느낌: 쿠버네티스 환경을 구성하는 것은 복잡하지 않았다(straightforward)
쿠버네티스를 구성하는 콤포넌트들의 의미와 설계 철학을 이해하는 데는 꽤 많은 시간이 필요할 수 있지만,
체험을 위한 환경을 구성하는 작업은 매우 간편했습니다. (참조 블로그의 내용을 거의 그대로 따라하면 되는 정도)
어쩌면 이러한 simple함이 쿠버네티스의 매력 중 하나가 아닐까? 라는 생각을 해봤습니다.
본 작업: OpenFaaS 설치
이제 드디어, OpenFaaS를 설치해 보기로 하겠습니다!
역시, 구글링을 해보니 여러 블로거들이 도움을 주고 계셨습니다. 아래 2개 블로그를 참조하여 진행했습니다.
- 참조 블로그
https://minhwan.kim/posts/openfaas/
https://delightwook.tistory.com/44
설치 과정에 대한 요약
OpenFaaS는 faas-netes라는 툴을 사용하여 설치가 진행됩니다.
(https://github.com/openfaas/faas-netes)
- OpenFaas용 CLI 설치: 설치시에 faas-cli라는 도구를 사용할 수 있게 됩니다.
curl -sL https://cli.openfaas.com | sudo sh
- faas-netes를 git clone 합니다.
git clone https://github.com/openfaas/faas-netes
- kubernetes에서 openfaas와 openfaas-fn이라는 네임스페이스를 만듭니다
kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
- OpenFaaS 에 로그인(웹 대쉬보드,faas-cli)할 패스워드를 랜덤 생성해서 저장합니다.
PASSWORD=$(head -c 12 /dev/urandom | shasum| cut -d' ' -f1)
kubectl -n openfaas create secret generic basic-auth --from-literal=basic-auth-user=admin --from-literal=basic-auth-password="$PASSWORD"
- OpenFaaS 서버를 실행하고, 외부 접속을 위해 포트포워딩을 진해하고, 로그인을 합니다
. faas-netes 디렉토리로 이동한 후에 yaml 파일 적용: kubectl apply -f ./yaml
. 포트포워딩(외부31112->내부8080): kubectl port-forward svc/gateway -n openfaas 31112:8080 &
. 로그인 진행
export OPENFAAS_URL=http://127.0.0.1:31112
echo -n $PASSWORD | faas-cli login --password-stdin
- 위 작업까지 진행하면, 웹 브라우저에서 OpenFaaS 대쉬보드에 접근이 가능합니다.
. 주의사항: CSP의 가상서버를 사용할 경우, OpenFaaS를 설치한 가상서버(마스터 노드)의 내부포트 31112번으로 포트포워딩 되도록 설정이 필요합니다 .
. 브라우저를 통해 접속하면 아래와 같은 화면이 보입니다.
OpenFaaS로 첫 Function 배포해 보기
OpenFaaS 설치가 끝났다면, 드디어 만져볼 시간이 되었습니다. 첫번째 Function을 배포해 보는 것이죠~!
OpenFaaS 홈페이지의 tutorial에 보면 '첫번째 Python Function' 배포하기가 있습니다.
. 참조: https://docs.openfaas.com/tutorials/first-python-function/
위의 튜토리얼을 그대로 따라해보면, 대체로 잘 진행이되지만... 제 경우에는 딱 한군데에서 막혀서 고생을 약간했습니다.
바로 Private 도커 레지스트리를 설정해주는 부분이었습니다.
이에 대한 트러블 슈팅 과정을 포함해서 첫번째 Python Function을 배포하는 방법을 소개해 보겠습니다.
First Python Function 작성 및 배포해 보기!
1) Python Function을 작성/배포하기 위한 디렉토리 생성하기
mkdir function_test && cd function_test
OpenFaaS Cli를 이용해서 Python Function을 만들기 위한 템플릿을 생성합니다.
(git 에서 내려받아서 디렉토리 구조를 만들어주는 것 같습니다.)
여기서 주의할 점은, 튜토리얼에 잘 설명되어 있지는 않지만..
OpenFaaS에 Function을 배포할 때에는 도커 레지스트리에 Function 관련 도커이미지를 push 했다가 pull하는 과정이 포함된다는 것입니다.
(즉, 마스터노드에서 Function에 대한 템플릿을 만들고 배포한다면, 밑단에서 쿠버네티스가 워커노드에 해당 Function의 Deployment를 배포하고, 그 과정에서 원격지 혹은 마스터 노드에 있을 도커 레지스트리를 참조한다는 의미)
따라서, 마스터 노드에 Private 도커 레지스트리를 만들어서 사용할 경우, OpenFaaS Function 용 컨테이너에서 해당 레지스트리를 참조할 수 있게 태깅(마스터노드의 IP포함)해야 한다는 것입니다.
자, 이제 위의 내용을 토대로 진행해 보겠습니다.
2) 마스터 노드에서 도커 레지스리 구동하기
docker run -d -p 5000:5000 --restart always --name registry registry:2
3) OpenFaaS Cli를 이용해서 Python Function을 만들기 위한 템플릿을 생성(with 도커 레지스트리 IP/Port 포함)
faas-cli new --lang python hello-python --prefix="172.27.0.98:5000"
4) Function 배포를 위한 정보 편집: hello-python.yaml
. openfaas gateway 가 리슨(external)하는 포트로 변경 -> 31112
5) Function 수행을 위한 코드를 편집: hello-python/handler.py
6) openfaas-cli를 이용해서, Function 컨테이너 이미지를 빌드하고, 푸쉬합니다.
faas-cli build -f ./hello-python.yml
faas-cli push -f ./hello-python.yml
7) 역시 openfaas-cli로 Function을 위한 쿠버니테스 배포를 실행합니다.
faas-cli deploy -f ./hello-python.yml
8) 배포가 제대로 되었다면, 쿠버네티스 명령어로 해당 Funciton에 대한 Deployment와 Pod 조회가 가능
* 사실, 저는 위의 과정 중에 하나의 문제를 더 겪었습니다. 바로.. 'insecure-registry..' 라는 메시지가 나오면서 도커 레지스트리에 접근이 이 안되었습니다. 이에 대한 해결책은 '/etc/docker/daemon.json'에 insecure-registries 부분을 추가해주는 것이었습니다.
그리고 컨테이너 데몬에 대한 재시작을 해주는 것이었죠..
(참조: https://docs.docker.com/config/daemon/systemd/)
드.디.어... 마지막으로 저의 첫 서버리스 Function을 호출해 보겠습니다!
curl 명령어로 인자값을 넘겨주면서 'hello-python' Function을 호출하는 것입니다
curl 127.0.0.1:31112/function/hello-python -d "it's steve here"
아래와 같이, handler.py에 코드를 편집해 두었던 대로.. 결과를 출력해서 보여주고 있습니다^^
'Tech-Cloud' 카테고리의 다른 글
Cloud 기반의 고가용성 아키텍처 #1 - DB 구성하기 (0) | 2021.03.23 |
---|---|
Cloud 기반의 가용성과 확장성을 고려한 웹 호스팅 환경 구성 (0) | 2021.03.17 |
Amazon에서 AWS가 가지는 의미,존재감 (0) | 2021.03.15 |
AWS Solution Architect (0) | 2021.02.23 |
MS Azure - Telco를 위한 Cloud 제안(경쟁인가 협력인가?) (0) | 2021.02.17 |
댓글