Knative-基于k8s的平台即服务,无服务器支持


Kubernetes无疑已经成为容器部署的主要平台。 它提供了使用其API和通过用户资源扩展其API的用户控制器来管理几乎所有内容的能力。


但是,用户仍然必须做出有关如何部署,配置,管理和扩展应用程序的详细决定。 根据用户的判断,关于扩展应用程序,保护,流量通道的问题仍然存在。 这将Kubernetes与传统的“平台即服务”(PaaS)(例如Cloud Foundry和Heroku)区分开来。


平台具有简化的用户界面,专注于最常参与定制单个应用程序的应用程序开发人员。 对用户透明的路由,部署和指标由基础PaaS系统管理。


PaaS通过创建自定义容器映像,进行部署,设置新路由和传入流量的DNS子域来处理源交付工作流程。 所有这些都是由git push命令触发的。


Kubernetes(有意地)仅提供了此类平台的基本构建块,使社区有机会自行完成这项工作。 正如Kelsey Hightower所说


Kubernetes是用于构建平台的平台。 最佳位置开始,但不结束。

结果,我们看到了一堆Kubernetes程序集,以及托管公司,它们试图为Kubernetes创建PaaS,例如OpenShift和Rancher。 在不断发展的Kube-PaaS市场的背景下,由Google和Pivotal于2018年7月创建的Knative正在进入市场。


Knative是Google和Pivotal之间的合作,很少有其他公司(例如IBM,RedHat和Solo.im)的合作。 它通过一流的无服务器计算应用程序支持为Kubernetes提供了类似的PaaS服务。 与Kubernetes程序集不同,Knative作为任何兼容Kubernetes集群的附件安装,并通过用户资源进行配置。


什么是基尼语?


Knative被描述为“一个基于Kubernetes的平台,用于通过现代无服务器计算交付和管理工作负载。” 通过声明自己是这样一个平台,Knative会主动根据与同时发生的HTTP请求成比例地自动缩放容器。 最终将未使用的服务缩放为零,以无服务器计算的方式提供按需缩放。


Knative由安装在任何Kubernetes集群中的一组控制器组成,并提供以下功能:


  • 从源代码(由Build组件提供)汇编容器化应用程序,
  • 提供对应用程序传入流量的访问(由Serving组件提供),
  • 按需交付和自动缩放应用程序(也由服务组件提供),
  • 确定导致应用程序启动的事件源(由Eventing组件提供)。

关键组件是服务,它为托管应用程序提供交付,自动扩展和流量控制。 安装Knative之后,仍会保留对Kubernetes API的完全访问权限,这使用户可以以通常的方式管理应用程序,并且还可以通过使用与这些服务使用的相同API原语(模块,服务等)来调试Knative服务。


服务还可以自动进行蓝绿色的流量路由,在用户交付应用程序的更新版本时,在应用程序的新版本和旧版本之间提供流量隔离。


Knative本身取决于兼容的入口控制器的安装。 在撰写本文时,支持Gloo API网关Istio Service Mesh 。 他将配置可用的入口,以将流量路由到Knative驱动的应用程序。


对于想要在不安装Istio控制面板的情况下尝试使用它的Knative用户,Istio Service Mesh可能会成瘾,因为Knative仅依赖网关。


因此,大多数用户更喜欢将Gloo用作Knative的网关,该网关提供了与Istio类似的功能集(如果我们谈论仅使用Knative的目的),并且使用的资源明显更少,并且运营成本更低。


让我们在展位上检查Knative的运行情况。 我将使用在GKE中运行的全新安装的集群:


 kubectl get namespace NAME STATUS AGE default Active 21h kube-public Active 21h kube-system Active 21h 

我们继续安装Knative和Gloo。 可以按任何顺序完成:


 #  Knative-Serving kubectl apply -f \ https://github.com/knative/serving/releases/download/v0.8.0/serving-core.yaml namespace/knative-serving created # ... #  Gloo kubectl apply -f \ https://github.com/solo-io/gloo/releases/download/v0.18.22/gloo-knative.yaml namespace/gloo-system created # ... 

检查所有Pod是否都处于“正在运行”状态:


 kubectl get pod -n knative-serving NAME READY STATUS RESTARTS AGE activator-5dd55958cc-fkp7r 1/1 Running 0 7m32s autoscaler-fd66459b7-7d5s2 1/1 Running 0 7m31s autoscaler-hpa-85b5667df4-mdjch 1/1 Running 0 7m32s controller-85c8bb7ffd-nj9cs 1/1 Running 0 7m29s webhook-5bd79b5c8b-7czrm 1/1 Running 0 7m29s kubectl get pod -n gloo-system NAME READY STATUS RESTARTS AGE discovery-69548c8475-fvh7q 1/1 Running 0 44s gloo-5b6954d7c7-7rfk9 1/1 Running 0 45s ingress-6c46cdf6f6-jwj7m 1/1 Running 0 44s knative-external-proxy-7dd7665869-x9xkg 1/1 Running 0 44s knative-internal-proxy-7775476875-9xvdg 1/1 Running 0 44s 

Gloo已准备好进行路由,让我们创建一个可自动扩展的Knative服务(我们将其称为kservice)并将流量定向到该服务。


与常规的Deployment + Service + Ingress模型相比,Knative服务提供了一种将应用程序交付到Kubernetes的简便方法。 我们将使用这样的示例:


 apiVersion: serving.knative.dev/v1alpha1 kind: Service metadata: name: helloworld-go namespace: default spec: template: spec: containers: - image: gcr.io/knative-samples/helloworld-go env: - name: TARGET Value: Knative user 

我将此复制到文件中,然后通过以下方式将其应用于我的Kubernetes集群:


 kubectl apply -f ksvc.yaml -n default 

交付'helloworld- go'kservice后,我们可以查看Knative在集群中创建的资源:


 kubectl get pod -n default NAME READY STATUS RESTARTS AGE helloworld-go-fjp75-deployment-678b965ccb-sfpn8 2/2 Running 0 68s 

部署kservice时,带有“ helloworld-go”映像的pod会启动。 如果没有流量,则窗格的数量将减少为零。 反之亦然,如果同时请求的数量超过某个自定义阈值,则窗格的数量将增加。


 kubectl get ingresses.networking.internal.knative.dev -n default NAME READY REASON helloworld-go True 

Knative使用Knative内部API中的特殊“入口”资源配置其入口。 Gloo使用此API作为其配置,以公开PaaS固有的属性,包括蓝绿色部署模型,自动TLS,超时和其他高级路由功能。


一段时间后,我们发现我们的广告连播消失了(因为没有传入流量):


 kubectl get pod -n default No resources found. kubectl get deployment -n default NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE helloworld-go-fjp75-deployment 0 0 0 0 9m46s 

最后,我们将尝试与他们联系。 使用glooctl可以轻松获得Knative代理的URL:


 glooctl proxy url --name knative-external-proxy http://35.190.151.188:80 

如果glooctl安装glooctl ,则可以在kube服务中监视地址和端口:


 kubectl get svc -n gloo-system knative-external-proxy NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE knative-external-proxy LoadBalancer 10.16.11.157 35.190.151.188 80:32168/TCP,443:30729/TCP 77m 

使用cURL运行一些数据:


 curl -H "Host: helloworld-go.default.example.com" http://35.190.151.188 Hello Knative user! 

Knative使用Gloo的高性能,功能齐全的API网关,在Kubernetes基于盒的基础上为开发人员提供了近乎PaaS的功能。 本说明仅触及了可用于自定义的大量Knative功能以及其他功能。 与Gloo同样!


尽管Knative仍是一个年轻项目,但他的团队每六周发布一次新版本,高级功能的实施已开始,例如自动TLS部署,控制面板的自动缩放。 由于众多云公司之间的合作以及Google提供的新Cloud Run产品的基础,Knative很有可能成为在Kubernetes中组织无服务器计算和PaaS的主要选择。 关注新闻!


从南桥
读者的意见对我们很重要,因此,请您参加一份与未来有关Knative,Kubernetes和无服务器计算的文章有关的小型调查:

Source: https://habr.com/ru/post/zh-CN475630/


All Articles