Knatives实战之Knative-Serving

Knative是google主导的一个opensource项目,主要面向的领域是serverless。今年的google大会基于Knative,google发布了google could run,这也令knative变得炙手可热了。

最近玩了玩,总结下,以供后查。

项目地址:https://github.com/knative

Knatives实战之Knative-Serving_第1张图片

可以看到Knative分了六个子项目,不少了,我们逐一认识:

Docs: 就是docs,没什么好说的,初学者必刷。

Serving是本篇的主要内容了。

这个项目主要是关于部署的,支持了serverless的一些理念: 如replicate为0。

另外还有流量控制方面的,如蓝绿测试 另外还实现了版本的管理和快照, 还有路由等等, 内容还是非常充实的。

我们看看设计,

在Knative serving中,引入了一个新的CRD: Service (注意区别于k8s Service), 后文称该CRD为KService。

Kservice被创建后,会生成若干新的CRD, 如Configuration, Route, Revision, 当然还有若干k8s的resource,如Service, pod等等,我们接下来详细讲讲。

先用一张管网图镇楼:

Knatives实战之Knative-Serving_第2张图片

  • 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"

注意,这里面有很多信息:

  1. runLatest: 这个意思是说Route总是会把外部请求导向最新的Revision
  2. revisionTemplate: 这个部分是定义了Revision, 你可以看到有image, env等等,这个image会在收到http请求后打出”Hello Go Sample v1”的字样.

Knatives实战之Knative-Serving_第3张图片

这是部署以后的情形,这么多CRD, 当然还会有k8s内置的如service等等,对了我们看看pod:

没有,是啊,没请求就不会起pod,就是replicate为0,这也是Knative serving的关键特性.

我们试着发个request:

Knatives实战之Knative-Serving_第4张图片

因为我的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

发个请求试试:

Knatives实战之Knative-Serving_第5张图片

变了哈, 确实把所有的请求都路由到了最新的Revision, 我们在Route的配置中找找端倪

Knatives实战之Knative-Serving_第6张图片

这是在Route中找到的, 嗯, 好像有点奇怪。请求100%被导入到Configuration: hellowold-go中了, 看看该Configuration:

Knatives实战之Knative-Serving_第7张图片

虽然有点怪,但是是对的。

但是如果我们想要控制请求的去向呢,如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

Knatives实战之Knative-Serving_第8张图片

基本上是50:50

去Route找找端倪吧:

Knatives实战之Knative-Serving_第9张图片

符合我们的猜想。

 

Knative serving基本就是这样,当然不限于这样。

你可能感兴趣的:(Cloud)