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等等,我们接下来详细讲讲。
先用一张管网图镇楼:
他们一起提供了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"
注意,这里面有很多信息:
这是部署以后的情形,这么多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基本就是这样,当然不限于这样。