什么是 Knative?
knative 是谷歌開源的 serverless 架構(gòu)方案,旨在提供一套簡(jiǎn)單易用的 serverless 方案,把 serverless 標(biāo)準(zhǔn)化。目前參與的公司主要是 Google、Pivotal、IBM、Red Hat,2018年7月24日才剛剛對(duì)外發(fā)布,當(dāng)前還處于快速發(fā)展的階段。
這是 Google Cloud Platform 宣布 knative 時(shí)給出的介紹:
Developed in close partnership with Pivotal, IBM, Red Hat, and SAP, Knative pushes Kubernetes-based computing forward by providing the building blocks you need to build and deploy modern, container-based serverless applications.
可以看出,knative 是為了解決容器為核心的 serverless 應(yīng)用的構(gòu)建、部署和運(yùn)行的問題。
serverless 的概念已經(jīng)出現(xiàn)蠻久了,為了理解 serverless 可以從應(yīng)用開發(fā)者的角度來看,使用 serverless 框架之后,應(yīng)用開發(fā)者的整個(gè)操作流程就變成了:
可以看到用戶只需要編寫代碼(或者函數(shù)),以及配置文件(如何 build、運(yùn)行以及訪問等聲明式信息),然后運(yùn)行 build 和 deploy 就能把應(yīng)用自動(dòng)部署到集群(可以是公有云,也可以是私有的集群)。
其他事情都是 serverless 平臺(tái)(比如這里的 knative)自動(dòng)處理的,這些事情包括:
- 自動(dòng)完成代碼到容器的構(gòu)建
- 把應(yīng)用(或者函數(shù))和特定的事件進(jìn)行綁定:當(dāng)事件發(fā)生時(shí),自動(dòng)觸發(fā)應(yīng)用(或者函數(shù))
- 網(wǎng)絡(luò)的路由和流量控制
- 應(yīng)用的自動(dòng)伸縮
和標(biāo)準(zhǔn)化的 FaaS 不同,knative 期望能夠運(yùn)行所有的 workload : traditional application、function、container。
knative 是建立在 kubernetes 和 istio 平臺(tái)之上的,使用 kubernetes 提供的容器管理能力(deployment、replicaset、和 pods等),以及 istio 提供的網(wǎng)絡(luò)管理功能(ingress、LB、dynamic route等)。
為了實(shí)現(xiàn) serverless 應(yīng)用的管理,knative 把整個(gè)系統(tǒng)分成了三個(gè)部分:
- Build:構(gòu)建系統(tǒng),把用戶定義的函數(shù)和應(yīng)用 build 成容器鏡像
- Serving:服務(wù)系統(tǒng),用來配置應(yīng)用的路由、升級(jí)策略、自動(dòng)擴(kuò)縮容等功能
- Eventing:事件系統(tǒng),用來自動(dòng)完成事件的綁定和觸發(fā)
Build 構(gòu)建系統(tǒng)
build 的功能是把用戶的代碼自動(dòng)化構(gòu)建成容器鏡像,初次聽起來很奇怪,有了 docker 之后有一個(gè) Dockerfile 不就能構(gòu)建容器了嗎?為什么還需要一個(gè)新的 Build 系統(tǒng)?
Knative 的特別之處在于兩點(diǎn):一是它的構(gòu)建完成是在 kubernetes 中進(jìn)行的,和整個(gè) kubernetes 生態(tài)結(jié)合更緊密;另外,它旨在提供一個(gè)通用的標(biāo)準(zhǔn)化的構(gòu)建組件,可以作為其他更大系統(tǒng)中的一部分。
正如官方文檔中的說的那樣,更多是為了定義標(biāo)準(zhǔn)化、可移植、可重用、性能高效的構(gòu)建方法:
The goal of a Knative build is to provide a standard, portable, reusable, and performance optimized method for defining and running on-cluster container image builds.
Knative 提供了 Build CRD 對(duì)象,讓用戶可以通過 yaml 文件定義構(gòu)建過程。一個(gè)典型的 Build 配置文件如下:
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'] 復(fù)制代碼
其中,serviceAccountName 是構(gòu)建過程中需要用到的密碼和認(rèn)證信息(比如連接到 git repo 的 SSH keys、push 鏡像到 registry 的用戶名和密碼等);source 是代碼信息,比如這里的 git 地址和分支;steps 是真正運(yùn)行過程中的各個(gè)步驟,這個(gè)示例中的步驟只是作為 demo,真正的構(gòu)建過程一般是 pull 代碼、 build 鏡像和 push鏡像到 registry 等邏輯。
因?yàn)榇蟛糠值臉?gòu)建過程都是一致的,因此 knative 還提供了 Build template 的概念,Build template 封裝了預(yù)先定義好的構(gòu)建過程(就是封裝了上面的 steps 過程),并提供了非常簡(jiǎn)單的配置參數(shù)來使用。
使用 build template 構(gòu)建容器鏡像就更簡(jiǎn)單了,只需要提供代碼的地址和鏡像名字即可,比如下面是使用 Google kaniko 模板構(gòu)建 github 源碼的 yaml 文件(需要在代碼根目錄存在 Dockerfile 文件):
apiVersion: build.knative.dev/v1alpha1 kind: Build metadata: name: kaniko-build spec: serviceAccountName: build-bot source: git: url: https://github.com/my-user/my-repo revision: master template: name: kaniko arguments: - name: IMAGE value: us.gcr.io/my-project/my-app復(fù)制代碼