본문 바로가기
서버구축 (WEB,DB)

서버리스(Serverless) 환경에서 애플리케이션 빌드 및 실행 개발 모델

by 날으는물고기 2024. 6. 13.

서버리스(Serverless) 환경에서 애플리케이션 빌드 및 실행 개발 모델

GitHub - openfaas/faas-netes: Serverless Functions For Kubernetes

Kubernetes(K8s) 기반의 서버리스 환경을 구성하는 것은 개발자가 애플리케이션의 스케일링과 인프라 관리에 대해 신경 쓸 필요 없이 애플리케이션과 서비스를 배포할 수 있게 해줍니다. 여기서는 Kubernetes 상에서 서버리스 환경을 구성하는 몇 가지 일반적인 방법과 도구에 대해 설명하겠습니다.

1. Knative

Knative는 Kubernetes 위에서 서버리스 워크로드를 구축, 배포 및 관리할 수 있는 프레임워크입니다. Knative는 두 가지 주요 구성 요소로 이루어져 있습니다: Serving과 Eventing.

  • Serving: 자동 스케일링(수평 및 수직), 트래픽 라우팅, 블루/그린 배포 등을 지원합니다.
  • Eventing: 이벤트 기반의 트리거를 통해 서비스 간의 커뮤니케이션을 관리합니다.

 

Knative 설치

  1. Kubernetes 클러스터가 설치되어 있어야 합니다.
  2. Istio 또는 기타 네트워킹 레이어를 설치합니다.
  3. Knative Serving과 Eventing을 설치합니다.

2. Kubeless

Kubeless는 Kubernetes 네이티브 방식으로 설계된 서버리스 프레임워크로, AWS Lambda와 유사한 사용자 경험을 제공합니다. Kubeless를 사용하면 Kubernetes 리소스를 활용하여 함수를 직접 관리할 수 있습니다.

 

Kubeless 설치

  1. Kubernetes 클러스터 준비
  2. Kubeless 바이너리를 다운로드하고 설치합니다.
  3. CLI를 통해 함수를 배포하고, 트리거할 수 있습니다.

3. OpenFaaS (Open Function as a Service)

OpenFaaS는 쉽게 사용할 수 있는 서버리스 프레임워크로, Docker 컨테이너를 통해 함수를 관리하고, Kubernetes에서 자동으로 스케일링이 가능합니다.

 

OpenFaaS 설치

  1. Kubernetes 클러스터 설치
  2. OpenFaaS CLI와 서버 사이드 컴포넌트 설치
  3. 게이트웨이를 통해 함수를 배포하고 관리합니다.

4. Fission

Fission은 Kubernetes 위에서 서버리스 함수를 빠르게 생성하고 실행할 수 있는 프레임워크입니다. Fission은 코드를 즉시 실행 가능한 함수로 변환하여 대기 시간을 줄이고, 확장성을 높입니다.

 

Fission 설치

  1. Kubernetes 클러스터 준비
  2. Fission 설치
  3. Fission CLI를 사용하여 함수를 생성하고 관리합니다.

종합적인 접근

서버리스 아키텍처를 설계할 때, 비즈니스 요구사항과 기술적 요구사항을 꼼꼼히 분석하여 가장 적합한 도구를 선택해야 합니다. Knative, Kubeless, OpenFaaS, Fission 외에도 많은 다른 옵션이 있으므로 각각의 특징을 잘 이해하고 필요에 맞게 선택하는 것이 중요합니다.

 

Kubernetes 기반 서버리스 환경 구축은 기업의 IT 인프라를 현대화하는 데 매우 유용하며, 클라우드 네이티브 애플리케이션의 민첩성과 효율성을 높일 수 있습니다. Kubernetes(K8s) 상에서 서버리스 환경으로 웹 기반 IDE를 제공하고 GitLab과 연계하여 사용할 수 있는 대표적인 도구로는 Eclipse CheGitpod가 있습니다. 이 도구들은 클라우드 네이티브 개발 환경을 제공하여 웹 브라우저를 통해 코드를 작성, 실행, 디버그할 수 있게 해주며, GitLab과 같은 버전 관리 시스템과 통합하여 협업과 코드 관리를 간편하게 할 수 있습니다.

1. Eclipse Che

Eclipse Che는 Kubernetes를 기반으로 하는 웹 기반 IDE입니다. 이 플랫폼은 개발자가 자신의 브라우저에서 직접 개발 환경을 설정하고 관리할 수 있도록 해주며, 다중 사용자 지원과 Docker 컨테이너를 사용하여 개별 개발 워크스페이스를 제공합니다.

 

특징

  • 워크스페이스: Docker 컨테이너 또는 Kubernetes 포드로 격리된 개발 환경.
  • 버전 관리 통합: GitLab을 포함한 주요 Git 호스팅 서비스와 쉽게 통합.
  • 멀티 유저 지원: 팀원들과 함께 워크스페이스를 공유하고 협업할 수 있습니다.

설치 및 사용

  • Che를 Kubernetes 클러스터에 설치하고, 웹 브라우저를 통해 접근하여 사용합니다.

2. Gitpod

Gitpod는 개발자가 GitLab, GitHub 또는 Bitbucket과 같은 SCM(소스 코드 관리) 시스템과 통합되는 웹 기반 IDE입니다. Gitpod는 개발 환경을 완전히 자동화하고, 각각의 프로젝트에 대해 사전 구성된 개발 환경을 제공합니다.

 

특징

  • 자동화된 개발 환경: 프로젝트의 .gitpod.yml 파일을 통해 환경을 사전 구성할 수 있습니다.
  • 서버리스 아키텍처: Kubernetes 상에서 동적으로 관리되는 환경을 제공하며, 사용하지 않을 때는 자원을 해제합니다.
  • 직접적인 SCM 통합: GitLab과의 깊은 통합을 통해 프로젝트에 즉시 접근하고 수정할 수 있습니다.

설치 및 사용

  • Kubernetes 클러스터에 Gitpod를 설치하고, SCM과 연동하여 웹 브라우저를 통해 접근할 수 있습니다.

 

이러한 도구들은 특히 개발 팀이 원격으로 협업할 때 매우 유용하며, 개발 환경의 표준화와 자동화를 통해 생산성을 크게 향상시킬 수 있습니다. 또한, 서버리스 환경에서의 운영으로 인프라 관리의 복잡성이 줄어들고, 개발자는 코드 작성과 프로젝트 개발에 더 집중할 수 있습니다.

 

OpenFaaS (Open Function as a Service)는 Docker와 Kubernetes를 기반으로 하는 서버리스 프레임워크로, 쉽게 사용할 수 있는 API 게이트웨이와 요청 수에 따른 자동 스케일링 기능을 제공합니다. 여기서는 OpenFaaS를 설치하고 구성하는 단계별 방법을 자세히 안내하겠습니다.

1. 사전 준비

  1. Kubernetes 클러스터: OpenFaaS는 Kubernetes 클러스터 상에서 작동합니다. Minikube, k3s, Google Kubernetes Engine, Amazon EKS 또는 기타 Kubernetes 환경 중 하나를 준비하세요.
  2. kubectl: Kubernetes 클러스터를 관리하는 도구입니다. 설치 및 클러스터와의 연결을 설정하세요.
  3. Docker: 로컬 개발 환경에서 함수를 빌드하기 위해 필요합니다.
  4. Helm: Kubernetes 패키지 매니저로, OpenFaaS 설치를 간소화합니다. Helm v3를 설치하세요.

2. OpenFaaS 설치

  1. faas-cli 설치
    curl -sSL https://cli.openfaas.com | sudo sh
    이 CLI 도구는 OpenFaaS 함수를 배포하고 관리하는 데 사용됩니다.
  2. Helm을 이용한 OpenFaaS 설치
    • Helm 리포지토리 추가
      helm repo add openfaas https://openfaas.github.io/faas-netes/
    • 네임스페이스 생성
      kubectl create namespace openfaas
      kubectl create namespace openfaas-fn
    • OpenFaaS 설치
      helm upgrade openfaas --install openfaas/openfaas \
          --namespace openfaas  \
          --set functionNamespace=openfaas-fn \
          --set generateBasicAuth=true
    • 기본 로그인 정보 가져오기
      PASSWORD=$(kubectl -n openfaas get secret basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode; echo)
      echo "Password: $PASSWORD"
  3. 포트 포워딩 설정
    • 관리용 포트와 게이트웨이 포트를 로컬 시스템으로 포워딩
      kubectl port-forward -n openfaas svc/gateway 8080:8080 &
    • 이제 http://127.0.0.1:8080을 통해 OpenFaaS 게이트웨이에 접근할 수 있습니다.

3. 함수 배포

  1. 새 함수 템플릿 생성
    faas-cli template pull
    faas-cli new hello-python --lang python3 --prefix="<your-docker-username>"
    여기서 <your-docker-username>은 도커 허브 사용자 이름입니다. 함수 코드는 생성된 hello-python/handler.py 파일에 작성합니다.
  2. 함수 빌드 및 배포
    faas-cli up -f hello-python.yml
    faas-cli up 명령은 빌드, 푸시, 배포를 순차적으로 수행합니다.

4. 자동 스케일링 설정

OpenFaaS는 HPA(Horizontal Pod Autoscaler)를 사용하여 요청 수에 따라 자동으로 스케일할 수 있습니다.

  1. HPA 설정
    apiVersion: autoscaling/v2beta2
    kind: HorizontalPodAutoscaler
    metadata:
      name: hello-python
      namespace: openfaas-fn
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: hello-python
      minReplicas: 1
      maxReplicas: 10
      metrics:
      - type: Resource
      resource:
         name: cpu
         target:
           type: Utilization
           averageUtilization: 50
    이 설정은 CPU 사용률이 50%를 초과하면 자동으로 파드를 스케일 아웃합니다.
  2. HPA 리소스 적용
    bash
       kubectl apply -f hpa.yaml

이제 Kubernetes 상에서 OpenFaaS를 사용하여 서버리스 환경을 구축하고 관리할 수 있습니다. OpenFaaS의 API 게이트웨이를 통해 함수를 쉽게 관리하고, 자동 스케일링 기능을 활용하여 리소스 사용을 최적화할 수 있습니다.

 

사용자가 별도의 인프라 준비 없이 즉시 ChatGPT를 사용할 수 있는 웹 기반의 대화형 개발 환경을 제공하기 위한 시스템은 GitLab Web-IDE와 Jupyter Hub를 통합하고, Kubernetes(K8s) 상에서 서버리스 아키텍처를 기반으로 구축되어야 합니다. 또한, 사용자 인증, 보안, 효율적인 운영 및 로깅 기능도 포함되어야 합니다. 아래는 이러한 요구사항을 충족하는 시스템을 구축하기 위한 단계별 계획입니다.

 

1. 시스템 설계

  • 서버리스 아키텍처: OpenFaaS를 활용하여 ChatGPT와 관련된 함수들을 Kubernetes 클러스터 위에 배포합니다. 이는 확장성과 유지 관리의 편의성을 제공합니다.
  • 개발 환경: GitLab Web-IDE와 Jupyter Hub를 통합하여 코드 작성, 테스트, 디버깅을 웹에서 직접 수행할 수 있는 환경을 제공합니다.

2. Kubernetes 클러스터 구축

  • 인프라 선택: 클라우드 제공업체(AWS, GCP, Azure 등)에서 관리형 Kubernetes 서비스를 선택합니다.
  • 클러스터 구성: 필요한 노드와 리소스를 설정하고 클러스터를 생성합니다.

3. OpenFaaS 설치 및 설정

  • OpenFaaS 설치: 앞서 설명한 단계에 따라 OpenFaaS를 설치합니다.
  • 서버리스 함수 배포: ChatGPT 관련 기능을 함수로 개발하고 OpenFaaS를 통해 배포합니다.

4. GitLab Web-IDE 및 Jupyter Hub 설치

  • GitLab 설치: Kubernetes 클러스터에 GitLab을 설치하고 구성합니다.
  • Jupyter Hub 설치: 데이터 과학 및 알고리즘 테스트에 사용될 Jupyter Hub를 설치합니다.
  • 통합: GitLab Web-IDE와 Jupyter Hub 간의 연동을 구성하여 원활한 개발 환경을 제공합니다.

5. 인증 및 보안 설정

  • 인증 시스템: OAuth 또는 OpenID Connect를 사용하여 사용자 인증을 설정합니다.
  • API 보안: API 게이트웨이를 사용하여 API 인증 및 권한 부여를 관리합니다.
  • 개인 정보 보호: 데이터 암호화 및 GDPR, CCPA 등의 규정 준수를 위한 정책을 적용합니다.

6. 캐싱 및 로깅

  • 캐싱 메커니즘: Redis 또는 Memcached를 사용하여 자주 요청되는 데이터의 응답 속도를 개선합니다.
  • 로그 및 모니터링: ELK 스택(Elasticsearch, Logstash, Kibana) 또는 Prometheus와 Grafana를 사용하여 로그를 수집하고 시스템의 상태를 모니터링합니다.

7. 운영 및 유지보수

  • 자동 스케일링: Kubernetes의 Horizontal Pod Autoscaler를 활용하여 트래픽 변동에 따라 자동으로 리소스를 조정합니다.
  • 지속적인 업데이트 및 배포: CI/CD 파이프라인을 구축하여 코드 변경 사항을 자동으로 배포하고, 시스템 업데이트를 쉽게 관리합니다.

 

이러한 계획을 통해 사용자가 별도의 설정 없이도 웹 브라우저를 통해 즉시 ChatGPT를 사용할 수 있는 환경을 제공할 수 있습니다. 이 시스템은 효율적인 개발과 운영, 높은 보안성을 갖추고 있어 다양한 사용자와 조직에 적합할 것입니다.

 

비개발자를 위한 손쉬운 개발 환경을 제공하는 서비스를 구축하는 데에는 몇 가지 주요 구성 요소가 필요합니다. Python을 사용하여 Jupyter Notebook에서 작성된 코드를 자동으로 Flask 웹 서비스로 변환하고, 이를 GitLab에 푸시하여 CI/CD 파이프라인을 통해 자동 빌드하는 기능을 구현하기 위한 각 단계별로 필요한 설정과 코드입니다.

1. Jupyter Notebook 환경 설정

Jupyter Notebook을 사용하여 코드를 작성하고 테스트합니다. 이 환경을 설치하려면 다음과 같이 합니다.

# Jupyter Notebook 설치
pip install notebook

# Jupyter Notebook 시작
jupyter notebook

2. Flask 웹 서비스로 변환하는 스크립트

Jupyter Notebook 내 특정 태그가 지정된 셀을 찾아 Flask 웹 앱으로 변환하는 스크립트를 Python으로 작성합니다. 이 스크립트는 다음과 같은 기능을 수행합니다.

  • Jupyter Notebook 파일을 읽어 들입니다.
  • 특정 태그(예: # web_service)가 포함된 셀을 추출합니다.
  • 추출된 셀로부터 Flask 앱을 생성합니다.
  • 생성된 Flask 앱을 GitLab 저장소에 푸시합니다.
import nbformat
from nbconvert import PythonExporter

def extract_cells_with_tag(notebook_path, tag):
    with open(notebook_path) as f:
        nb = nbformat.read(f, as_version=4)
        exporter = PythonExporter()
        code, _ = exporter.from_notebook_node(nb)

        # 태그가 지정된 셀만 필터링
        tagged_code = "\n".join([cell for cell in code.split("# In[") if tag in cell])
        return tagged_code

def create_flask_app(code, app_name="app.py"):
    flask_template = f"""
from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/')
def home():
    return jsonify({{ 'message': 'Hello from Flask!' }})

{code}

if __name__ == '__main__':
    app.run(debug=True)
    """
    with open(app_name, 'w') as f:
        f.write(flask_template)

# 예시 사용
code = extract_cells_with_tag('example_notebook.ipynb', '# web_service')
create_flask_app(code)

3. GitLab 저장소로 푸시

생성된 Flask 앱을 GitLab 저장소에 푸시하는 기능을 구현합니다. 이를 위해 GitPython 라이브러리를 사용할 수 있습니다.

pip install GitPython
from git import Repo

def push_to_gitlab(repo_path, remote_name='origin'):
    repo = Repo(repo_path)
    repo.git.add(update=True)
    repo.index.commit("Automatic commit of Flask app")
    origin = repo.remote(name=remote_name)
    origin.push()

# 사용 예
push_to_gitlab('/path/to/your/repo')

4. CI/CD 파이프라인 설정

GitLab에서 Flask 앱의 자동 빌드와 배포를 위해 .gitlab-ci.yml 파일을 구성합니다.

stages:
  - build
  - deploy

build_app:
  stage: build
  script:
    - echo "Building Flask app"
    - pip install -r requirements.txt
    - pytest # 테스트 실행

deploy_app:
  stage: deploy
  script:
    - echo "Deploying to production"
    - deploy_script_here

5. 사용자 인터페이스 구성

HTML과 JavaScript를 사용하여 사용자가 Git 저장소 정보를 입력할 수 있는 간단한 웹 인터페이스를 만듭니다.

<!DOCTYPE html>
<html>
<head>
<title>Upload Notebook</title>
</head>
<body>
    <form action="/submit" method="post">
        <label for="repo">GitLab Repository URL:</label>
        <input type="text" id="repo" name="repo"><br><br>
        <label for="file">Notebook File:</label>
        <input type

="file" id="file" name="file"><br><br>
        <input type="submit" value="Submit">
    </form>
</body>
</html>

이 웹 페이지는 사용자로부터 GitLab 저장소 URL과 변환할 Jupyter Notebook 파일을 받아 위에서 설명한 스크립트를 실행합니다.

 

GitLab의 Web IDE를 사용하여 코드를 작성하고, CI/CD 파이프라인을 통해 OpenFaaS 함수로 자동 변환 및 배포하는 과정을 설정하는 것은 개발자들에게 효율적인 워크플로우를 제공합니다. 이 과정은 코드 작성, 자동 빌드, 테스트, 배포까지의 전체 사이클을 자동화합니다. 아래는 이를 구성하는 단계별 방법입니다.

1. 필요 조건

  • GitLab 계정 및 적절한 권한이 있는 프로젝트.
  • OpenFaaS가 설치된 Kubernetes 클러스터.
  • faas-cli의 설치 및 설정.

2. GitLab 설정

  • GitLab에서 새 프로젝트 생성: 프로젝트를 생성하고 초기 코드를 커밋합니다.
  • 리포지토리 클론: 로컬 환경으로 리포지토리를 클론하고 필요한 파일들을 추가합니다.
  • CI/CD 파이프라인 설정: gitlab-ci.yml 파일은 CI/CD 파이프라인의 설정을 담당합니다. OpenFaaS에 함수를 배포하기 위해 다음과 같은 스테이지를 설정합니다.
    stages:
      - build
      - deploy
    
    build_function:
      stage: build
      script:
        - echo "Building function"
        - faas-cli build -f ./stack.yml
    
    deploy_function:
      stage: deploy
      script:
        - echo "Deploying function"
        - faas-cli up -f ./stack.yml
    여기서 stack.yml는 OpenFaaS 함수의 설정 파일입니다.

3. OpenFaaS 함수 설정

OpenFaaS에서 함수를 구성하기 위한 stack.yml 파일을 작성합니다. 이 파일은 함수의 구성을 정의하고, 이미지 빌드 및 배포 설정을 포함합니다.

provider:
  name: openfaas
  gateway: http://<OPENFAAS_GATEWAY_URL>

functions:
  your-function:
    lang: python3
    handler: ./handler
    image: <YOUR_DOCKER_HUB_USERNAME>/your-function:latest

4. 함수 코드 작성

GitLab Web IDE를 사용하여 함수의 코드를 작성합니다. 예를 들어 Python 함수의 경우 handler.py 파일에 로직을 구현합니다.

def handle(req):
    print("Hello! You said: " + req)

5. GitLab Web IDE에서 작업

GitLab의 Web IDE를 사용하여 코드를 직접 수정하고 커밋할 수 있습니다. 변경 사항을 커밋하면 CI/CD 파이프라인이 자동으로 트리거되어 함수가 빌드되고 배포됩니다.

6. OpenFaaS에 배포

CI/CD 파이프라인에 의해 자동으로 함수가 OpenFaaS에 배포됩니다. faas-cli up 명령은 빌드, 푸시, 배포의 전체 과정을 자동으로 처리합니다.

7. 보안 및 접근 관리

  • OpenFaaS의 게이트웨이에 접근 권한을 설정합니다.
  • GitLab에서 필요한 경우 프라이빗 레포지토리를 사용하고, 접근 권한을 제한합니다.

8. 모니터링 및 로깅

  • OpenFaaS 대시보드나 Prometheus를 사용하여 함수의 실행을 모니터링합니다.
  • 로그 관리를 위해 ELK 스택이나 Fluentd를 구성할 수 있습니다.

 

이렇게 설정하면 GitLab의 Web IDE에서 코드를 작성하고 커밋하는 것만으로 OpenFaaS에 함수를 자동으로 빌드하고 배포할 수 있어, 개발자가 서버리스 아키텍처를 효과적으로 활용할 수 있게 됩니다.

728x90

댓글