Knative是google主导的一个opensource项目,主要面向的领域是serverless。今年的google大会基于Knative,google发布了google could run,这也令knative变得炙手可热了。
最近玩了玩,总结下,以供后查。
项目地址:https://github.com/knative
可以看到Knative分了六个子项目,不少了,我们逐一认识:
Docs: 就是docs,没什么好说的,初学者必刷。
Serving是本篇的主要内容了。
这个项目主要是关于部署的,支持了serverless的一些理念: 如replicate为0。
另外还有流量控制方面的,如蓝绿测试 另外还实现了版本的管理和快照, 还有路由等等, 内容还是非常充实的。
我们看看设计,
在Knative serving中,引入了一个新的CRD: Service (注意区别于k8s Service), 后文称该CRD为KService。
Kservice被创建后,会生成若干新的CRD, 如Configuration, Route, Revision, 当然还有若干k8s的resource,如Service, pod等等,我们接下来详细讲讲。
先用一张管网图镇楼:
- Kservice: 包含了所有的信息, 在一个Kservice建立以后它要负责建立Route, Configuration和至少一个Revision
- Route: 是这个Kservice小系统的入口, 会生成一个Hostname: 像这样:helloworld-go.servingk.example.com 并注册到Istio中, Istio负责将对改hostname的请求抓发到Route。Route接收到外部流量后根据Route的路由配置把流量导入到相应的Revision.
- Revision: 就是字面意思, 版本,每一次对Kserevice的改动都会生成一个新的版本.
- Configuration: 负责记录版本的历史信息,并且所有的配置信息。
他们一起提供了serverless的功能,拿一个case举例:
先定义一个Kservice:
apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
name: helloworld-go
namespace: servingk
spec:
runLatest:
configuration:
revisionTemplate:
spec:
container:
image: vincentpli/knative-serving-helloworld:latest
env:
- name: TARGET
value: "Go Sample v1"
注意,这里面有很多信息:
- runLatest: 这个意思是说Route总是会把外部请求导向最新的Revision
- revisionTemplate: 这个部分是定义了Revision, 你可以看到有image, env等等,这个image会在收到http请求后打出”Hello Go Sample v1”的字样.
这是部署以后的情形,这么多CRD, 当然还会有k8s内置的如service等等,对了我们看看pod:
没有,是啊,没请求就不会起pod,就是replicate为0,这也是Knative serving的关键特性.
我们试着发个request:
因为我的Istio在31380端口,注意Hostname
在看看pod:
有了哈!
还记的之前提起的, runLatest会自动把请求导向最新的一个Revision,我们继续试验: 修改之前的Kservice, 注意看最后部分:
apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
name: helloworld-go
namespace: servingk
spec:
runLatest:
configuration:
revisionTemplate:
spec:
container:
image: vincentpli/knative-serving-helloworld:latest
env:
- name: TARGET
value: "Go Sample v2"
部署之。两个Revision
发个请求试试:
变了哈, 确实把所有的请求都路由到了最新的Revision, 我们在Route的配置中找找端倪
这是在Route中找到的, 嗯, 好像有点奇怪。请求100%被导入到Configuration: hellowold-go中了, 看看该Configuration:
虽然有点怪,但是是对的。
但是如果我们想要控制请求的去向呢,如Revision #1 50%, Revision #2 50%要怎么实现呢,我们试试啊。
之前说到runLatest是把所有的请求导向最新的Revision, 如果要分流量,我们要用到:release
看看新改的kservice:
apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
name: helloworld-go
namespace: servingk
spec:
release:
revisions: ["helloworld-go-6gznq", "helloworld-go-z6z8d" ]
rolloutPercent: 50
configuration:
revisionTemplate:
spec:
container:
image: vincentpli/knative-serving-helloworld:latest
env:
- name: TARGET
value: "Go Sample v2"
部署之: 记得,这次用 kubectl replace不能用kubectl apply
基本上是50:50
去Route找找端倪吧:
符合我们的猜想。
Knative serving基本就是这样,当然不限于这样。