Updated:

5 minute read

개요

  • 사이트 / GitHub
  • 데이터, I/O 및 컴퓨팅 집약적인 워크로드에 초점을 맞춘 고성능 “서버리스” 프레임워크
  • Jupyter 및 Kubeflow와 같은 널리 사용되는 데이터 과학 도구와 잘 통합
  • CPU 및 GPU를 통한 실행을 지원
  • 단일 함수 인스턴스는 초당 수십만 개의 HTTP 요청 또는 데이터 레코드를 처리 가능
  • Kaniko와 통합되어 런타임에 Docker 이미지를 안전하게 구축할 수 있는 생산 준비 방식을 제공


설치

  • 컨테이너 레지스트리 준비(Gitea를 설치한다고 가정)
    • gitea-values.yaml
      •    service:
             http:
               type: NodePort
               nodePort: 30100
                    
           ingress:
             hosts:
               - host: gitea-http.gitea.svc.cluster.local:3000
                 paths:
                   - path: /
                     pathType: Prefix
        
    • 설치
      •    dnf install cryptsetup
           kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.6.1/deploy/prerequisite/longhorn-iscsi-installation.yaml
           kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.6.1/deploy/longhorn.yaml
           curl -sSfL https://raw.githubusercontent.com/longhorn/longhorn/v1.6.1/scripts/environment_check.sh | bash
                    
           helm repo add gitea-charts https://dl.gitea.com/charts/
           helm repo update gitea-charts
           helm install gitea gitea-charts/gitea --create-namespace --namespace gitea --values ./gitea-values.yaml
        
  • Nuclio
    • nuclio-values.yaml
      •    dashboard:
             containerBuilderKind: kaniko
             nodePort: 30200
                    
           registry:
             secretName: registry-credentials
             pushPullUrl: gitea-http.gitea.svc.cluster.local:3000
        
    • 설치
      •    helm repo add nuclio https://nuclio.github.io/nuclio/charts
           helm repo update nuclio
                    
           kubectl create namespace nuclio
           kubectl delete secret registry-credentials -n nuclio
           kubectl --namespace nuclio create secret docker-registry registry-credentials \
               --docker-username gitea_admin \
               --docker-password r8sA8CPHD9!bt6d \
               --docker-server gitea-http.gitea.svc.cluster.local:3000 \
               --docker-email gitea@local.domain
                    
           helm install nuclio nuclio/nuclio --namespace nuclio --values ./nuclio-values.yaml
        
    • 대시보드
      • 브라우저에서 ${cluster ip}:30200 접속


테스트

  • 함수
    1. NEW FUNCTION 클릭
    2. helloworld (golang) 선택 후 프로젝트 선택 및 함수 이름 작성 후 CREATE 클릭
    3. 코드 확인
      • 코딩 및 테스트 수행
    4. 설정 확인
      • Deployment, Service 설정
    5. 트리거 확인
    6. DEPLOY 클릭
    7. 상태 확인
    8. 동작 확인


아키텍처

  • Function processors
    • Processor architecture
    • Event-source listeners
      • 소켓 및 메시지 대기열을 수신하거나 외부 이벤트 또는 데이터 소스에서 주기적으로 이벤트를 가져오는 역할
      • 이벤트 리스너는 정확히 한 번 또는 최소한 한 번 이벤트 실행을 보장하고 오류를 처리
    • Runtime engine
      • 함수 환경(변수, 컨텍스트, 로그, 데이터 바인딩 등)을 초기화하고, 이벤트 객체를 함수 워커에 공급하고, 이벤트 소스에 응답을 반환
      • 여러 개의 독립적인 병렬 작업자를 가질 수 있음
      • 세 가지 유형의 프로세서 런타임 구현을 지원
        • Native
          • 실시간 및 인라인 Go 또는 C 기반 루틴
        • SHMEM
          • Python, Java 및 Node.js와 같은 공유 메모리 언어
          • 프로세서는 제로 복사 공유 메모리 채널을 통해 SHMEM 함수 런타임과 통신
        • Shell
          • 바이너리 혹은 커맨드 라인 실행 함수
          • 이벤트를 수신하면 프로세서는 관련 커맨드 및 환경 변수를 사용하여 커맨드 라인 셸에서 실행 파일을 실행
          • 실행 파일의 표준 출력(stdout) 또는 표준 오류(stderr) 로그를 함수 결과에 매핑
          • 파일 데이터 바인딩만 지원
    • Data bindings
      • 외부 파일, 개체, 데이터베이스 또는 메시징 시스템에 대한 지속적인 데이터 연결
      • 함수 사양에 지정된 유형, URL, 속성 및 자격 증명을 기반으로 데이터 서비스 연결을 초기화
      • 컨텍스트 개체를 통해 함수에 제공
      • SDK와 통합하거나 연결 및 자격 증명을 관리할 필요가 없어 개발이 단순화
      • 동일한 클래스의 다양한 데이터 서비스가 동일한 API를 사용하여 함수에 매핑되므로 함수 재사용 및 이식성이 가능
      • 데이터 프리패치, 캐싱, 마이크로 배치 측면을 처리하여 실행 대기 시간을 줄이고 I/O 성능을 향상
      • 특별한 함수 코드 없이도 실시간 성능을 지원
        • 데이터 바인딩 및 이벤트 소스는 복사 없음, 직렬화 없음 및 비차단 작업으로 설계
    • Control framework
      • 다양한 프로세서 구성 요소 초기화 및 제어
      • 프로세서 및 함수에 대한 로깅을 제공
      • 실행 통계 모니터링
      • 원격 관리를 위한 미니 포털 제공
      • 추상 인터페이스를 통해 기본 플랫폼과 상호 작용
        • 다양한 IoT 장치, 컨테이너 오케스트레이터 및 클라우드 플랫폼 간의 이식성을 허용
      • 플랫폼별 프로세서 구성은 작업 디렉터리의 processor.yaml 파일을 통해 수행
        • 함수 개발자는 이 파일을 수정해서는 안됨
      • 플랫폼 서비스에 대한 Function processors의 기본 인터페이스는 서로 다른 배포 유형 간에 동일한 Function processor를 포팅할 수 있는 방식으로 모두 추상화
  • Event sources and mapping
    • 함수는 이벤트 중심
    • 이벤트 소스에서 승인되어 함수 런타임 엔진으로 푸시되는 이벤트 트리거, 데이터 메시지 또는 레코드에 응답
    • 이벤트 소스는 동작 및 흐름 관리에 따라 클래스로 나뉨
      • https://docs.nuclio.io/en/stable/_images/event-src.png
        1. Synchronous Request/Response
        • 클라이언트는 요청을 보내고 즉각적인 응답을 기다림
        • HTTP requests, Remote Procedure Calls (RPCs) 2. Asynchronous Message-Queue Request
        • 메세지를 게시되고 구독자에게 배포
        • RabbitMQ, MQTT, emails, or scheduled events 3. Message or Record Streams
        • 순서가 지정된 메시지 세트 또는 레코드 업데이트가 순차적으로 처리
        • Kafka, AWS Kinesis or Iguazio V3IO streams 4. Record or Data Polling (ETL)
        • 필터링된 레코드 세트 또는 데이터 개체는 외부 데이터 소스 또는 데이터베이스에서 검색
        • 검색은 주기적으로 수행되거나 데이터 변경에 의해 트리거
      • 새로운 이벤트 클래스와 이벤트 소스를 프로세서 프레임워크에 추가 가능
    • Event-source mapping
      • 이벤트 소스는 특정 함수 버전에 매핑
        • 예시) URL “/”는 “프로덕션” 버전에 매핑하고 “/beta”는 동일한 함수의 “베타” 버전에 매핑
      • 사용자는 함수 사양에서 이벤트 매핑을 지정하거나 이벤트 매핑 CRUD API 호출 또는 CLI 명령을 사용하여 지정
      • 여러 이벤트 소스를 동일한 함수에 연결 가능
      • 동일한 이벤트가 여러 함수의 호출을 트리거 가능
      • 이벤트 소스 매핑은 정확한 함수 버전이나 해당 별칭을 활용
      • 매핑에는 함수 이름, 클래스, 유형, 자격 증명, 클래스별 속성과 같은 정보도 포함
    • Event load-balancing, sharding, and dealers
      • 일부 작업에는 여러 Function processor 인스턴스에 걸쳐 데이터 또는 작업 항목을 배포하는 작업이 포함
        • Kafka 스트림은 여러 파티션으로 나눌 수 있으며 각 파티션은 주어진 시간에 단일 프로세서에 의해서만 처리되어야 함수
        • 샤딩된 데이터세트의 경우 여러 처리 요소에 걸쳐 데이터세트 처리를 확장
        • 이를 위해서는 데이터 파티션을 사용 가능한 프로세서에 배포하고 실행 및 완료를 추적하는 리소스 예약 엔터티가 필요
      • Nuclio에는 N 리소스(샤드, 파티션, 작업 등)를 M 프로세서에 동적으로 배포할 수 있는 “딜러” 엔터티가 포함되어 있으며 장애 측면을 처리하고 리소스 및 프로세서의 확장 또는 축소를 수행
    • Event object (used by the function)
      • 함수는 컨텍스트 개체와 이벤트 개체라는 두 가지 요소로 호출
      • 이벤트 개체는 들어오는 이벤트의 데이터와 메타데이터를 설명
        • 실제 이벤트 소스를 함수에서 분리하는 방식으로 일반화
      • 단일 함수은 여러 유형의 이벤트 소스에 의해 구동될 수 있음
      • 함수는 단일 이벤트 또는 이벤트 배열(예: 스트림)을 허용
      • 이벤트 객체는 인터페이스(메서드)를 통해 액세스
        • EventID, Body, ContentType, Headers, Fields 및 AsJson과 같은 일반적인 이벤트 개체 인터페이스
        • 클래스별 이벤트 객체 인터페이스도 존재
      • JSON 객체로 사용 가능
        • 제로 복사를 활성화하고 직렬화 오버헤드를 제거하고 견고성을 추가
        • 이로 인해 직렬화 및 역직렬화 오버헤드가 추가될 수 있음
  • Function build and deployment flow
    • 다이어그램
      • https://docs.nuclio.io/en/stable/_images/build-deploy.png
    • 각 함수에는 버전별 함수 사양(“spec”)이 존재
    • 함수 사양은 코드, 데이터 바인딩, 환경 리소스, 자격 증명, 이벤트 소스 등 함수의 다양한 측면을 정의
    • 함수 사양은 YAML 또는 JSON으로 작성할 수 있음
    • 명령줄 옵션을 사용하여 정의하거나 덮어쓰기 가능
    • 빌더는 컴파일 단계에서 함수 사양을 사용하고 컨트롤러는 해당 사양을 사용하여 함수의 작동 요구 사항을 식별
    • 사용자는 단일 작업으로 기능을 구축하고 배포할지, 아니면 각 단계를 별도로 수행할지 여부를 제어 가능
    • build 명령은 함수를 컴파일하고 아티팩트를 빌드하므로 나중에 하나 이상의 함수 배포에서 사용 가능
    • run 명령은 소스를 수락할 수 있으며 함수를 빌드하고 배포하거나 빌드를 건너뛰고 기존 아티팩트 배포 가능
    • 사용자는 함수 소스와 동일한 디렉터리에 있는 선택적 build.yaml 파일을 통해 정확한 빌드 플래그 제어 가능
  • Function versioning
    • 함수의 새 버전을 게시하고 함수 참조를 위한 별칭으로 태그 지정 가능
    • 동일한 기능의 여러 버전을 동시에 실행할 수 있는 기능을 제공(예: 프로덕션 버전과 베타 버전)
    • 이벤트 소스 매핑은 정확한 함수 버전을 지정하거나 정의된 별칭을 활용
      • 최신 버전의 함수가 게시될 때 매핑을 변경할 필요가 없음


Kubernetes Ingress를 사용하여 이름으로 함수 호출


플랫폼 설정

  • 별도로 저장되어 플랫폼을 공유하는 모든 함수 간에 공유
  • 플랫폼은 클러스터 혹은 네임스페이스와 같은 해당 클러스터의 하위 리소스
  • Kubernetes의 경우 함수의 네임스페이스에 platform-config라는 ConfigMap으로 저장
  • 구성 요소
    • Log sinks, Metric sinks, Webadmin, Health check, Cron-trigger creation mode, Runtime, Sensitive fields


함수

  • 두 개의 인수를 받는 진입점으로부터 시작
    • Context
      • 함수 호출 전반에 걸쳐 상태를 유지하는 오브젝트
      • 로거, 데이터 바인딩, 워커 정보 및 사용자 지정 데이터와 같은 오브젝트가 포함
    • Event
      • 함수를 트리거한 이벤트에 대한 헤더, 본문, 트리거 정보 등의 정보가 포함된 오브젝트
  • 설정


트리거

  • Kafka
  • RabbitMQ
  • NATS
  • Cron
  • Azure Event Hubs
  • HTTP
  • V3IO stream
  • Kinesis
  • MQTT


API Gateway

  • 함수를 웹 서비스로 노출할 수 있는 서비스
  • 요청을 함수에 전달하고 응답을 반환하는 프록시
  • 함수 호출, 인증, 카나리아 배포 및 기타 기능을 제공
  • UI, HTTP, Nuctl를 이용하여 생성/삭제


Runtime engines


Dashboard HTTP API