[cloud native][platform] Nuclio
Updated:
개요
- 사이트 / 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
-
- 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
접속
- 브라우저에서
- nuclio-values.yaml
테스트
- 함수
- NEW FUNCTION 클릭
helloworld (golang)
선택 후 프로젝트 선택 및 함수 이름 작성 후 CREATE 클릭- 코드 확인
- 코딩 및 테스트 수행
- 설정 확인
- Deployment, Service 설정
- 트리거 확인
- DEPLOY 클릭
- 상태 확인
- 동작 확인
- NEW FUNCTION 클릭
아키텍처
- Function processors
- Event-source listeners
- 소켓 및 메시지 대기열을 수신하거나 외부 이벤트 또는 데이터 소스에서 주기적으로 이벤트를 가져오는 역할
- 이벤트 리스너는 정확히 한 번 또는 최소한 한 번 이벤트 실행을 보장하고 오류를 처리
- Runtime engine
- 함수 환경(변수, 컨텍스트, 로그, 데이터 바인딩 등)을 초기화하고, 이벤트 객체를 함수 워커에 공급하고, 이벤트 소스에 응답을 반환
- 여러 개의 독립적인 병렬 작업자를 가질 수 있음
- 세 가지 유형의 프로세서 런타임 구현을 지원
- Native
- 실시간 및 인라인 Go 또는 C 기반 루틴
- SHMEM
- Python, Java 및 Node.js와 같은 공유 메모리 언어
- 프로세서는 제로 복사 공유 메모리 채널을 통해 SHMEM 함수 런타임과 통신
- Shell
- 바이너리 혹은 커맨드 라인 실행 함수
- 이벤트를 수신하면 프로세서는 관련 커맨드 및 환경 변수를 사용하여 커맨드 라인 셸에서 실행 파일을 실행
- 실행 파일의 표준 출력(stdout) 또는 표준 오류(stderr) 로그를 함수 결과에 매핑
- 파일 데이터 바인딩만 지원
- Native
- 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
- 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)
- 필터링된 레코드 세트 또는 데이터 개체는 외부 데이터 소스 또는 데이터베이스에서 검색
- 검색은 주기적으로 수행되거나 데이터 변경에 의해 트리거
- 새로운 이벤트 클래스와 이벤트 소스를 프로세서 프레임워크에 추가 가능
- https://docs.nuclio.io/en/stable/_images/event-src.png
- Event-source mapping
- 이벤트 소스는 특정 함수 버전에 매핑
- 예시) URL “/”는 “프로덕션” 버전에 매핑하고 “/beta”는 동일한 함수의 “베타” 버전에 매핑
- 사용자는 함수 사양에서 이벤트 매핑을 지정하거나 이벤트 매핑 CRUD API 호출 또는 CLI 명령을 사용하여 지정
- 여러 이벤트 소스를 동일한 함수에 연결 가능
- 동일한 이벤트가 여러 함수의 호출을 트리거 가능
- 이벤트 소스 매핑은 정확한 함수 버전이나 해당 별칭을 활용
- 매핑에는 함수 이름, 클래스, 유형, 자격 증명, 클래스별 속성과 같은 정보도 포함
- 이벤트 소스는 특정 함수 버전에 매핑
- Event load-balancing, sharding, and dealers
- 일부 작업에는 여러 Function processor 인스턴스에 걸쳐 데이터 또는 작업 항목을 배포하는 작업이 포함
- Kafka 스트림은 여러 파티션으로 나눌 수 있으며 각 파티션은 주어진 시간에 단일 프로세서에 의해서만 처리되어야 함수
- 샤딩된 데이터세트의 경우 여러 처리 요소에 걸쳐 데이터세트 처리를 확장
- 이를 위해서는 데이터 파티션을 사용 가능한 프로세서에 배포하고 실행 및 완료를 추적하는 리소스 예약 엔터티가 필요
- Nuclio에는 N 리소스(샤드, 파티션, 작업 등)를 M 프로세서에 동적으로 배포할 수 있는 “딜러” 엔터티가 포함되어 있으며 장애 측면을 처리하고 리소스 및 프로세서의 확장 또는 축소를 수행
- 일부 작업에는 여러 Function processor 인스턴스에 걸쳐 데이터 또는 작업 항목을 배포하는 작업이 포함
- 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를 사용하여 이름으로 함수 호출
- Traefik 이용
플랫폼 설정
- 별도로 저장되어 플랫폼을 공유하는 모든 함수 간에 공유
- 플랫폼은 클러스터 혹은 네임스페이스와 같은 해당 클러스터의 하위 리소스
- Kubernetes의 경우 함수의 네임스페이스에 platform-config라는 ConfigMap으로 저장
- 구성 요소
- Log sinks, Metric sinks, Webadmin, Health check, Cron-trigger creation mode, Runtime, Sensitive fields
함수
- 두 개의 인수를 받는 진입점으로부터 시작
- Context
- 함수 호출 전반에 걸쳐 상태를 유지하는 오브젝트
- 로거, 데이터 바인딩, 워커 정보 및 사용자 지정 데이터와 같은 오브젝트가 포함
- Event
- 함수를 트리거한 이벤트에 대한 헤더, 본문, 트리거 정보 등의 정보가 포함된 오브젝트
- Context
- 설정
트리거
- Kafka
- RabbitMQ
- NATS
- Cron
- Azure Event Hubs
- HTTP
- V3IO stream
- Kinesis
- MQTT
API Gateway
- 함수를 웹 서비스로 노출할 수 있는 서비스
- 요청을 함수에 전달하고 응답을 반환하는 프록시
- 함수 호출, 인증, 카나리아 배포 및 기타 기능을 제공
- UI, HTTP, Nuctl를 이용하여 생성/삭제