Knative Serving入门

栏目: 编程工具 · 发布时间: 5年前

内容简介:多年来,人们已经创建了许多无服务器框架,这些框架都在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的另一个存储桶中。

Knative Serving入门

部署示例应用程序

该应用程序是用 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 Serving入门

因此,我们可以简单地应用新的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将调整应用程序的容量以并行处理请求。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Effective JavaScript

Effective JavaScript

David Herman / Addison-Wesley Professional / 2012-12-6 / USD 39.99

"It's uncommon to have a programming language wonk who can speak in such comfortable and friendly language as David does. His walk through the syntax and semantics of JavaScript is both charming and h......一起来看看 《Effective JavaScript》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

html转js在线工具
html转js在线工具

html转js在线工具