Nuclio On Kubernetes (下)

Nuclio On Kubernetes (下)

Nuclio On Kubernetes (下)

Nuclio架構

綜上4點所述,Nuclio所提供的Services如上圖3所示,開發者可任意更換Event Sources和Data Sources,並且提供Event的模擬而不需更改到Function Code。每個Function會被Language Runtime包裝,可能是Python、Go、Java或C#等等。而Nuclio利用Processor Service整合Event和Data Sources,並透過支援的Platform API以進行Function的Logging、Monitoring和Configuration等功能,解決前述4點所提的Serverless Issues。

為了更清楚的解釋圖3的Nuclio剩餘Services,我們需要先了解Nuclio如何建構並佈署Function。圖4介紹了Nuclio的Function從開發者開發到佈署的整個CI/CD流程,以K8s為例,開發者開發的Function Code,首先會透過Nuclio的Builder Service,背後利用Nuclio的CLI結合Runtime的Yaml檔自動化運行Docker Build Image,將Function和Runtime Yaml結合Processor Base Image,Build成該Funtion的Processor-Function Image並傳送到指定的Repositary/Artifact,或是產生Binary File以提供Local的回歸測試。

考慮到CI/CD,當Image Build好並成功儲存於Repo後,後續會透過Controller Service,在此例如圖5,也就是K8s,自動化調用K8s CLI以產生K8s的deploy和svc,並透過K8s CRD自訂Function Type,讓使用者可直接透過K8s CLI管理Function,最後當該Pod Running後,便可直接使用Nuclio CLI觸發指定的K8s Function Pod,也就是圖4的Function Instance來運行Function。由於這些Function Pods運行在K8s上,因此Controller除了接收Event Source來Invoke Function外,也彈性的管理這些Function的Repica、Life Cycle和Version。

Function如圖1可能會接收各式各樣的Event Source,當來源是一組(Set)Task,如Batch Jobs或Kafka等Stream時,便需透過Dealer Service來分配這些Partitions,並確保所有的Task被成功完成。如圖5所示,Dealer將接收的Job或Stream切分成N個不同的Partitions,並將這些Partitions分配到Nuclio的Processor Service。

最後Nuclio也提供Dashboard Service,該Service為額外獨立的微服務,讓開發者透過HTTP利用Web GUI直接進行Function的撰寫和設定以及Event和Data Binding的設定等等,提供開發者友善的操作介面,進行Function的佈署和測試。

綜上所述,上述的紅字部份可分別對照到圖6,架構如下:

Nuclio安裝(On K8s)

事前準備:

  1. 安裝好K8s叢集(Version >= 1.7)
  2. 註冊Docker Hub

安裝環境:

  1. OS:Ubuntu Server 16.04 LTS
  2. K8s Version:1.9.6
  3. Docker Version:18.05.0-ce

Create Nuclio K8s namespace

Create a registry secret,可使用Local registry,修改掉底下的registry.hub.docker.com即可,此例的Registry為Docker hub,該Secret是後續Nuclio CLI要自動化上傳Image所需要的。請依個人Docker hub資訊修改username、password和email

Create the RBAC roles

佈署Nuclio

驗證佈署

為了方便讓外部機器開啟Nuclio Dashboard,在此Expose Dashboard SVC,將type: ClusterIP修改成type: NodePort後儲存離開

察看Dashboard被Expose的Port

瀏覽器開啟http://k8s-any-node-ip:32480

Nuclio Function佈署和觸發

下載最新的Nuclio CLI:Release Page

修改CLI讓Local可使用

驗證

由於測試發現若無先登入Docker hub,則Nuctl佈署Function時可能Image無法成功上傳到Docker hub上(denied: requested access to the resource is denied),此問題在先登入Docker hub後便可解決

佈署Hello World範例程式

Function佈署狀況

觸發Function

刪除Function

此外,同樣可透過Dashboard Deploy function,以下段程式碼取得Trigger event資訊為例(python3):

佈署完成如下圖

點擊Project name:test,察看Invoke URL的Port

或是察看kubectl該function的svc的NodePort,利用Http POST觸發Function,以下IP可為K8s Cluster任意Node的IP,Port為NodePort

該Function的Pod Log,可看出收到的Event body size以及context.logger.debug資訊

參考資料

https://thenewstack.io/whats-next-serverless/

https://github.com/nuclio

https://github.com/nuclio/nuclio

https://semaphoreci.com/blog/2017/07/27/what-is-the-difference-between-continuous-integration-continuous-deployment-and-continuous-delivery.html

https://support.goldenfrog.com/hc/en-us/articles/204691028-What-is-Verbosity-

https://thenewstack.io/tag/OpenTracing

https://zh.wikipedia.org/wiki/%E4%BA%8B%E4%BB%B6%E9%A9%85%E5%8B%95%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88

https://medium.com/@yaronhaviv/serverless-background-challenges-and-future-d0928df71758

http://blog.backand.com/serverless-shootout/

https://dotblogs.com.tw/berrynote/2016/08/18/200338

http://q.infoqstatic.com/ppt/serverlessminibook.pdf

http://goodspeedlee.blogspot.tw/2015/05/thread.html

https://docs.microsoft.com/zh-tw/azure/architecture/guide/architecture-styles/event-driven

https://ithelp.ithome.com.tw/articles/10193218

https://github.com/cncf/wg-serverless/blob/master/proposals/cloudevents/README.md

撰文:呂威廷 迎棧科技工程師