初探 Knative 基本功能與概念(上)

初探 Knative 基本功能與概念(上)

Knative 是基於 Kubernetes 平台建構、部署與管理現代 Serverless 工作負載的開源專案,其目標是要幫助雲端供應商與企業平臺營運商替任何雲端環境的開發者、操作者等提供 Serverless 服務體驗。Knative 採用了 Kubernetes 概念來建構函式與應用程式,並以 Istio 實現了叢集內的網路路由,以及進入服務的外部連接,這讓開發者在部署或執行變得更加簡單。而目前 Knative 元件專注在解決許多平凡但困難的事情,例如以下:

  • 在 Kubernetes 上編排 Source-to-URL 的工作流程
  • 使用 Blue/Green 部署來路由與管理流量
  • 按需自動擴展與調整工作負載的大小
  • 將運行服務(Running services)綁定到事件生態系統(Eventing ecosystems)
  • 利用原始碼建構應用程式與函式
  • 讓應用程式能夠零停機升級
  • 自動增減應用程式與函式實例
  • 透過 HTTP request 觸發函式的呼叫
  • 為函式、應用程式與容器建立事件

而 Knative 的設計考慮了不同的工作角色使用情境:

然而 Knative 不只使用 Kubernetes 與 Istio 的功能,也自行開發了三個元件以提供更完整的 Serverless 平台。而下節將針對這三個元件進行說明。

Knative 元件與概念

目前 Knative 提供了以下幾個元件來處理不同的功能需求,本節我們將針對這些元件進行說明。

Build

Build 是 Knative 中的自定義資源,並提供了 Build API object 來處理從原始碼(Sources)建構容器的可插拔(Pluggable)模型,這是基於 Google 的容器建構服務(Container Build Service) 而來,這允許開發者定義容器的來源來打包,例如 Git、Registery(ex: Docker hub),另外也能將 Buildpacks 當作一種建構的插件來使用,這使 Knative 在建構功能上有更靈活的擴展。

除了 Buildpacks 外,也能夠將 Google Container Builder、Bazel、Kaniko 與 Jib 等等當作建構插件使用。

而一個 Knative builds 的主要特性如下:

  • 一個Build可以包含多個 step,其中每個 step 會指定一個Builder
  • 一個Builder是一種容器映像檔,可以建立該映像檔來完成任何任務,如流程中的單一 step,或是整個流程本身
  • Build 中的 steps 可以推送(push)到一個儲存庫(repository)
  • 一個BuildTemplate可用在定義重用的模板
  • 可以定義Build中的source來將檔案或專案掛載到 Kubernetes Volume(會掛載成/workspace)。目前支援:
  1. Git 儲存庫
  2. Google Cloud Storage
  3. 任意的容器映像檔
  • 利用 Kubernetes Secrets 結合 ServiceAccount 進行身份認證

這邊的step可以看作是 Kubernetes 的 init-container                                         以下是一個提供使用者身份認證的 Build 範例,該範例包含多個 step 與 Git repo:

apiVersion: build.knative.dev/v1alpha1 kind: Build metadata: name: example-build spec: serviceAccountName: build-auth-example source: git: url: https://github.com/example/build-example.git revision: master steps: - name: ubuntu-example image: ubuntu args: ["ubuntu-build-example", "SECRETS-example.md"] steps: - image: gcr.io/example-builders/build-example args: ['echo', 'hello-example', 'build']

Serving

Serving 以 Kubernetes 與 Istio 為基礎,實現了中介軟體原語(Middleware Primitives)來達到自動化從容器到函式執行的整個流程,另外也支援了快速部署容器並進行伸縮的功能,甚至能根據請求來讓容器實例降到 0,而 Serving 也會利用 Istio 在修訂版本之間路由流量,或是將流量傳送到同一個應用程式的多個修訂版本中,除了上述功能外, Serving 也能實現了不停機更新、Bule/Green 部署、部分負載測試,以及程式碼回滾等功能。

從上圖,可以得知 Serving 利用了 Kubernetes CRD 新增一組 API 來定義與控制在 Kubernetes 上的 Serverless 的行為,其分別為以下:

  • Service:該資源用來自動管理整個工作負載的生命週期,並提供單點控制。它控制了其他物件的建立,以確保應用程式與函式具備每次 Service 更新的 Route、Configuration 與 Revision,而 Service 也可以定義流量路由到最新 Revision 或固定的 Revision。
apiVersion: serving.knative.dev/v1alpha1 kind: Service metadata: name: service-example spec: runLatest: configuration: revisionTemplate: spec: container: image: gcr.io/knative-samples/helloworld-go env: - name: TARGET value: "Go Sample v1"
  • Route:該資源將網路端點映射到一個或多個 revision,並且能透過多種方式來管理流量,如部分的流量(fractional traffic)、命名路由(named routes)。
apiVersion: serving.knative.dev/v1alpha1 kind: Route metadata: name: route-example spec: traffic: - configurationName: stock-configuration-example percent: 100
  • Configuration:該資源維護部屬所需的狀態,它提供了程式碼與組態檔之間的分離,並遵循 Twelve-Factor App 方法,若修改 Configuration 會建立新 revision。
apiVersion: serving.knative.dev/v1alpha1 kind: Configuration metadata: name: configuration-example spec: revisionTemplate: metadata: labels: knative.dev/type: container spec: container: image: github.com/knative/docs/serving/samples/rest-api-go env: - name: RESOURCE value: stock readinessProbe: httpGet: path: / initialDelaySeconds: 3 periodSeconds: 3
  • Revision:該資源是記錄每個工作負載修改的程式碼與組態的時間點快照,而 Revision 是不可變物件,並且只要它還有用處,就會被長時間保留。
apiVersion: serving.knative.dev/v1alpha1 kind: Revision metadata: labels: serving.knative.dev/configuration: helloworld-go name: revision-example namespace: default spec: concurrencyModel: Multi container: env: - name: TARGET value: Go Sample v1 image: gcr.io/knative-samples/helloworld-go generation: 1 servingState: Active

撰文: 白凱仁 迎棧科技資深工程師

訂閱電子報

Select list(s)*

 

Loading