Serverless之Knative部署应用实例

1.什么是Knative?

  1. Knative是Google2018的Google Cloud Next大会上发布的一款基于kubernetes的Serverless框架。
  2. knative的目的是在kubernetes之上提供一个简单、一致的层,以解决在开发人员和平台之间创建更牢固的边界,使得开发人员可以专注他们的业务逻辑。knative是建立在kubernetes和Istio平台之上的,使用了kubernetes提供的容器管理组件(deployment、service、Pod、ConfigMap等)以及Istio提供的网络管理组件(Ingress、LB);
  3. Knative中有两个重要的组件,分别是为其提供流量的Serving(服务)组件以及确保应用程序能够轻松消费事件的Eventing组件;
  4. 部署、升级和路由。
    应用部署应该是全部部署或者全部不部署吗?knative支持渐进式交付,并不是所有的HTTP请求都会到达生产环境系统中的一个软件版本上,而是所有的HTTP请求都会到达整个分布式系统上,由该软件的多个版本共同响应,在系统中可以同时运行多个版本,并在这些版本之间分配流量,这意味着部署可以按请求而不是实例的粒度进行;
  5. 自动扩/缩容
    系统中的流量是不固定的,有时没有流量,有时候流量过大,当没有流量时,系统的部分资源是浪费的,当流量过大时,系统就会承受过大的压力。Knative使用Knative Pod自动缩放器(KPA)进行扩/缩容,它是一种基于请求指标的自动缩放器,已与Knative的路由、缓冲和指标组件深度集成。自动缩放器无法解决所有问题,但是可以解决大部分流量的问题。

2. 什么是Serving?

2.1 Serving服务

  1. Serving模块提供了一组特定的对象,包括Service(服务)、Configuration(配置)、Revision(修订版本)、Route(路由)。Knative通过kubernetes CRD(自定义资源)的方式实现了这些对象。
  2. 在kubernetes创建一个应用的时候需要定义什么?
    APP->Deployment->Service->ConfigMap->Secrets甚至我们还需要定义一个Ingress;但是在Knative当中,一个Service就可以搞定。这里的Service不是kubernetes的Service,而是Knative中的service,可以简写为kvc,在资源规范里可以看见;
[root@knative-k8s-master-139 ~]# kubectl api-resources | grep "knative"services                          kservice,ksvc   serving.knative.dev/v1                      true         Service
  1. 创建一个Service(kservice)的时候会自动生成一个Configuration,基于Configuration创建Revision,再创建Route,客户端请求的流量也是由Route发给Revision;

2.2 Serving组件;

  1. Configuration: 配置是待运行软件的期望状态,包含所需的容器镜像、环境变量等详细信息。Knative将此信息转换为底层的Kubernetes概念,例如部署。实际上,那些熟悉kubernetes的人可能知道Knative到底在做什么。即使没有Knative,开发人员也可以自己创建和提交一个部署;
  2. Revision: 修订版本是配置的快照,每次更改配置时,Knative都会创建一个修订版本,实际上修订版本还会转换为底层Kubernetes资源。如果单纯只是保存修订版本,则有些浪费资源,毕竟Git就可以进行版本控制,为什么用Knative?因为Knative并不只是支持蓝/绿部署,实际上,Knative还支持多版本之间更详细的流量配置规则;
  3. Route: Knative中的Route提供了一种将流量路由到正在运行代码的机制,它将一个HTTP可寻端点映射到一个或者多个Revision。可以做流量的切割和金丝雀发布;

3. 部署一个应用;

3.1 安装Knative的CLI

  1. 这里已经确保安装了kn,kn是Knative的"官方"客户端,但它不是官方的第一个客户端。在kn出现之前,Knative已经有了很多可选的客户端,比如knctl。这些工具有助于探索Knative客户端的不同使用体验;
  2. kn有两个作用。(1)客户端本身是专门给Knative设计的,你不需要详细了解kubectl;kn淘汰了Knative的Golang API,让knative的Golang API尽在其他使用Go语言编写的和Knative交互的工具使用;
  3. Knative CLI官方文档:https://knative.dev/docs/client/
  4. 我的上一篇博文有部署文档Knative Serving安装

3.2 部署一个简单的应用

在这里你必须有一个kubernetes集群并且安装了Knative;安装部署文档在我上篇博客有说明;

3.2.1 使用kn创建服务;

  1. 部署hello world实例;
# 可以使用--help来查看如何部署;[root@knative-k8s-master-139 ~]# kn service --help[root@knative-k8s-master-139 ~]# kn service  create --help# [root@knative-k8s-master-139 ~]# kn service create helloworld-example \  # name就叫做hello-example; --image gcr.io/knative-samples/helloworld-go \  # 引用的容器镜像,使用knative提供的简单应用;--env TRAGET="First"    # 注入示例应用需要的环境变量;Creating service 'helloworld-example' in namespace 'default':  # 未指定namespace,在默认的default名称空间下;  0.042s The Route is still working to reflect the latest desired specification.  0.050s ...  0.090s Configuration "helloworld-example" is waiting for a Revision to become ready.575.648s ...575.679s Ingress has not yet been reconciled.575.748s Waiting for load balancer to be ready575.951s Ready to serve.Service 'helloworld-example' created to latest revision 'helloworld-example-00001' is available at URL:http://helloworld-example.default.example.com
  1. 通过kn service list来查看;
[root@knative-k8s-master-139 ~]# kn service listNAME                 URL                                             LATEST                     AGE   CONDITIONS   READY   REASONhelloworld-example   http://helloworld-example.default.example.com   helloworld-example-00001   12h   3 OK / 3     True 

3.2.2观察knative到底做了什么?

1.首先它给我们创建了一个deployment,我们可以看到此时的Pod Ready是处于0的,这是Knative独有的冷启动,在后续会说明;

[root@knative-k8s-master-139 ~]# kubectl get deployNAME                                  READY   UP-TO-DATE   AVAILABLE   AGEhelloworld-example-00001-deployment   0/0     0            0           12htools-test                            1/1     1            1           12h

2.为我们创建了一个Service,所有的SVC都是要注册到isto-ingressgateway上面的。它提供了一个外部访问入口和一个集群内部的访问入口;Knative只需要某种入口网关的功能,而不需要网格功能;

[root@knative-k8s-master-139 ~]# kubectl get svchelloworld-example                 ExternalName             knative-local-gateway.istio-system.svc.cluster.local   80/TCP

3.我们为什么看不见创建的Pod呢?因为在没有人访问的情况下,Pod是无法启动会被置为0的状态;这就是Knative的KPA,Pod缩放至0;

[root@knative-k8s-master-139 ~]# kubectl get podsNAME                          READY   STATUS      RESTARTS   AGEtools-test-8444596cb5-rvpf9   1/1     Running     0          12h

3.2.3 应用测试访问;

1.我们启动一个终端访问这个Service是没有问题的;

[root@tools-test-8444596cb5-rvpf9 /]# curl helloworld-example.default.svcHello World![root@tools-test-8444596cb5-rvpf9 /]#  while true; do curl --connect-timeout 1 helloworld-example.default; sleep .2; doneHello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!

2.我们观察Pod的状态与deploy的状态,当我们持续访问的时候,Pod是会被拉起的;

[root@knative-k8s-master-139 ~]# kubectl get deployNAME                                  READY   UP-TO-DATE   AVAILABLE   AGEhelloworld-example-00001-deployment   1/1     1            1           12htools-test                            1/1     1            1           12h[root@knative-k8s-master-139 ~]# kubectl get podshelloworld-example-00001-deployment-7787f5cf4f-rfwhb   2/2     Running     0          12stools-test-8444596cb5-rvpf9                            1/1     Running     0          12h

我们一直奔跑在进步的旅途

文章来自https://www.cnblogs.com/xunweidezui/p/16551412.html

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章