内容简介:多年来,人们已经创建了许多无服务器框架,这些框架都在Kubernetes之上运行,例如kubeless,OpenFaas和Fission,这些和Knative之间的区别在于,Knative由企业中的主要参与者支持,如RedHat,Pivotal,Google等。Knative本身分为三个部分:Knative的所有组件都基于Istio,可以单独安装。因此,需要已经运行的Istio安装,您可以使用Knative提供的清单文件来部署Istio。
多年来,人们已经创建了许多无服务器框架,这些框架都在Kubernetes之上运行,例如kubeless,OpenFaas和Fission,这些和Knative之间的区别在于,Knative由企业中的主要参与者支持,如RedHat,Pivotal,Google等。
Knative本身分为三个部分:
- 构建:允许在Kubernetes中轻松构建容器镜像的源。它允许轻松定义源代码的CI管道,并且具有许多已定义的构建模板。
- 服务:这是无服务器部分,用于执行,扩展和处理 Docker 容器的路由。它可以扩展到零,并具有自动缩放功能。
- 事件:允许定义订阅和交付模型以管理,发送和接收事件。
Knative的所有组件都基于Istio,可以单独安装。因此,需要已经运行的Istio安装,您可以使用Knative提供的清单文件来部署Istio。
在本教程中,我们将介绍Serving入门的详细信息。
将Knative服务部署到Kubernetes集群
在我的环境中,使用了没有LoadBalancer支持服务的Kubernetes集群,也使用了更新版本的Istio,然后按照Knative Serving安装说明中进行了安装,产生了一个错误:即Knative发现安装的Istio prometheus桥接在Istio 1.0.3版中被移除了。以下命令将安装Knative Serving并删除prometheus网桥连接:
$ curl -L https:<font><i>//github.com/knative/serving/releases/download/v0.2.3/serving.yaml \</i></font><font> | sed 's/LoadBalancer/ClusterIP/' \ | sed '/nodePort:/d' \ | sed '/--statsdUdpAddress/d' \ | sed '/istio-statsd-prom-bridge/d' \ | kubectl apply -f - </font>
这将在Knative-serving命名空间中安装Knative Serving组件:
$ kubectl get pods -n knative-serving NAME READY STATUS RESTARTS AGE activator-db5b7fd87-2vq7b 2/2 Running 0 24h activator-db5b7fd87-9xcgc 2/2 Running 0 24h activator-db5b7fd87-xlpxd 2/2 Running 0 24h autoscaler-5547f9f84d-zr8m8 2/2 Running 0 2d21h controller-59465dfb58-plzfg 1/1 Running 0 2d21h webhook-7bf4f5dc4-vmr6m 1/1 Running 0 2d21h
正如您所看到的,它在knative-serving命名空间中安装了4个不同的部署,这些部署是knative-serving正确运行所必需的。它还在istio-system命名空间中安装入口网关。
示例应用
我开发 了一个小示例应用程序 ,当一个新的jpg文件上传到一个名为images的存储桶时接收Minio Webhooks,然后它将生成一个具有可配置比例因子的较小版本,并将其再次存储到minio中名为thumbnail的另一个存储桶中。
部署示例应用程序
该应用程序是用 Java 编写的,它有一个名为/ webhook / image的端点,它接收带有由Minio生成的ImageEvents的POST消息。为了准备应用程序,我生成了一个 Dockerfile ,它有一个名为PORT的环境变量,默认值为8080.这个环境变量由Knative提供,它指定应用程序应该侦听流量的端口。
现在我们可以使用以下清单文件简单地部署应用程序:
apiVersion: v1 kind: Namespace metadata: name: simple-serving labels: istio-injection: enabled --- apiVersion: serving.knative.dev/v1alpha1 kind: Service metadata: name: simple-serving-java namespace: simple-serving spec: runLatest: configuration: revisionTemplate: metadata: annotations: spec: container: image: registry.gitlab.com/koudingspawn-<b>public</b>/knative/simple-serving-hello:latest env: - name: RESIZE_FACTOR value: <font>"0.2"</font><font> readinessProbe: exec: command: - /bin/sh - -c - curl localhost:8081/actuator/health initialDelaySeconds: 10 periodSeconds: 3 </font>
此清单文件生成名为simple-serving的命名空间,并为此命名空间启用Istio注入许可控制器。然后它应用Knative服务服务,指定Docker镜像和简单的Probe。为了使它更容易一点,我使用curl进行健康检查以绕过Istio mtls和策略的问题。
在此之后你应该看到,有一个新的Knative Service部署到集群:
$ kubectl get ksvc -n simple-serving NAME DOMAIN LATESTCREATED LATESTREADY READY REASON simple-serving-java simple-serving-java.simple-serving.example.com simple-serving-java-00001 simple-serving-java-00001 True
Knative Service就像部署高级资源一样,在后台Knative生成了一些额外的资源:
- 配置:管理应用程序的所需状态。
- 修订:对应用程序部署信息的每次更改(如环境变量或使用的映像)都将生成新的修订。在部署的情况下,它与ReplicaSet相当。
- 路由:负责将网络流量路由到一个或多个修订版。
- Knative Pod Autoscaler(kpa):负责根据容量进行缩放。
默认情况下,通过Istio中Ingress Gateway的传入流量的Knative域是example.com。该域由Knative Service名称和名称空间组成。通过对此域的简单curl 访问,可以将流量发送到我们的resizer-application。
因此,您必须配置一个dns条目,该条目指向istio-system命名空间中新生成的Knative Ingress Gateway。您可以通过以下命令找到服务的IP地址以指向dns条目:
$ kubectl describe service -n istio-system knative-ingressgateway
否则,您可以为Minio配置一个额外的/ etc / hosts条目,将dns条目指向knative-ingressgateway的ip。因此,您可以简单地使用 Kubernetes文档中 描述的 hostAliases 。
部署Minio
Minio的部署非常简单且前进,只需要配置Webhook。因此,请参阅minio deployment.yaml 文件的第12行。它指向新生成的Knative Service,以便将应用程序通知新文件及其元数据。为了允许我们使用Knative部署的应用程序与Minio通信,我们必须为此服务禁用Istio MTLS,因为我们在Istio之外部署了Minio。因此,请简单地应用以下DestionationRule:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: <font>"minio-ext"</font><font> namespace: simple-serving spec: host: </font><font>"minio-service.minio.svc.cluster.local"</font><font> trafficPolicy: tls: mode: DISABLE </font>
这允许我们的应用程序在不使用mTLS的情况下与minio通信。
作为最后一步,我们必须配置minio:
$ kubectl port-forward -n minio -l app=minio 9000:9000 & $ mc config host add minio http:<font><i>//120.0.0.1:9000 minio minio123</i></font><font> $ mc mb minio/images $ mc mb minio/thumbnail $ mc event add minio/images arn:minio:sqs::1:webhook --event put --suffix .jpg </font>
第三个和第四个命令生成两个称为images 和thumbnail的桶,最后一个命令为* .jpg文件创建webhook。
在此之后,您可以简单地将jpg文件复制到images 存储桶,并将消息发送到我们的应用程序以生成调整大小的版本:
$ mc cp demo.jpg minio/images/demo.jpg $ mc ls minio/thumbnail/demo.jpg
路由到不同的版本
第一个可缩放版本生成缩略图,其大小为原始文件大小的20%。但是,如果我们计划仅调整大小的50%并希望慢慢迁移到新版本,该怎么办?
因此,我们可以简单地应用新的Knative Service版本,将50%的流量路由到新的,并将50%的minio事件路由到我们的旧版本:
apiVersion: serving.knative.dev/v1alpha1 kind: Service metadata: name: simple-serving-java namespace: simple-serving spec: release: revisions: [<font>"simple-serving-java-00001"</font><font>, </font><font>"simple-serving-java-00002"</font><font>] rolloutPercent: 50 configuration: revisionTemplate: metadata: spec: container: image: registry.gitlab.com/koudingspawn-<b>public</b>/knative/simple-serving-hello:latest env: - name: RESIZE_FACTOR value: </font><font>"0.5"</font><font> readinessProbe: exec: command: - /bin/sh - -c - curl localhost:8081/actuator/health initialDelaySeconds: 10 periodSeconds: 3 </font>
重要的部分是“修订版”和“rolloutPercent”参数。数组中的第一个版本是当前版本,第二个版本是接收50%minio事件的候选版本,仅将图像大小调整为50%。
$ kubectl get revision -n simple-serving NAME SERVICE NAME READY REASON simple-serving-java-00001 simple-serving-java-00001-service True simple-serving-java-00002 simple-serving-java-00002-service True
您只需运行以下命令即可看到此信息:
$ kubectl get route -n simple-serving apiVersion: serving.knative.dev/v1alpha1 kind: Route metadata: creationTimestamp: <font>"2018-12-23T21:29:27Z"</font><font> generation: 11 labels: serving.knative.dev/service: simple-serving-java name: simple-serving-java namespace: simple-serving ownerReferences: - apiVersion: serving.knative.dev/v1alpha1 blockOwnerDeletion: <b>true</b> controller: <b>true</b> kind: Service name: simple-serving-java spec: generation: 2 traffic: - name: current percent: 50 revisionName: simple-serving-java-00001 - name: candidate percent: 50 revisionName: simple-serving-java-00002 - configurationName: simple-serving-java name: latest percent: 0 status: address: hostname: simple-serving-java.simple-serving.svc.cluster.local conditions: - lastTransitionTime: </font><font>"2018-12-23T21:31:54Z"</font><font> status: </font><font>"True"</font><font> type: AllTrafficAssigned - lastTransitionTime: </font><font>"2018-12-23T21:29:57Z"</font><font> status: </font><font>"True"</font><font> type: IngressReady - lastTransitionTime: </font><font>"2018-12-23T21:31:54Z"</font><font> status: </font><font>"True"</font><font> type: Ready domain: simple-serving-java.simple-serving.example.com domainInternal: simple-serving-java.simple-serving.svc.cluster.local traffic: - name: current percent: 50 revisionName: simple-serving-java-00001 - name: candidate percent: 50 revisionName: simple-serving-java-00002 - name: latest percent: 0 revisionName: simple-serving-java-00002 </font>
根据容量和比例范围进行缩放
默认情况下,Knative配置为在几分钟内没有流量时将应用程序缩放到零(此参数是可配置的)。这可能会产生冷启动问题,因为第一次调用服务需要很长时间,因为应用程序必须启动。要更改此项或允许的最大副本数,您只需添加以下两个注释即可:
apiVersion: serving.knative.dev/v1alpha1 kind: Service metadata: name: simple-serving-java namespace: simple-serving spec: runLatest: configuration: revisionTemplate: metadata: annotations: autoscaling.knative.dev/maxScale: <font>"5"</font><font> autoscaling.knative.dev/minScale: </font><font>"1"</font><font> spec: containerConcurrency: 2 container: image: registry.gitlab.com/koudingspawn-<b>public</b>/knative/simple-serving-hello:latest env: - name: RESIZE_FACTOR value: </font><font>"0.5"</font><font> readinessProbe: exec: command: - /bin/sh - -c - curl localhost:8081/actuator/health initialDelaySeconds: 10 periodSeconds: 3 </font>
现在,如果没有新流量,应用程序将不会关闭,并且将缩放到最大大小为5。
此外,在此示例中,配置了容器Concurrency of two,这意味着此容器可以处理两个并行请求。如果有更多请求,autoscaler将调整应用程序的容量以并行处理请求。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- TiDB入门(四):从入门到“跑路”
- MyBatis从入门到精通(一):MyBatis入门
- MyBatis从入门到精通(一):MyBatis入门
- Docker入门(一)用hello world入门docker
- 赵童鞋带你入门PHP(六) ThinkPHP框架入门
- 初学者入门 Golang 的学习型项目,go入门项目
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Tales from Facebook
Daniel Miller / Polity Press / 2011-4-1 / GBP 55.00
Facebook is now used by nearly 500 million people throughout the world, many of whom spend several hours a day on this site. Once the preserve of youth, the largest increase in usage today is amongst ......一起来看看 《Tales from Facebook》 这本书的介绍吧!