自动缩放

Knative提供了基于 Kubernetes 的自动缩放功能,根据指标(如CPU利用率、内存使用量等)自动调整Pod的副本数,以实现弹性和高可用性。 Knative的Knative Serving的组件,用于管理应用程序的生命周期,在Knative Serving中,可以配置自动缩放规则,以指定应用程序的缩放行为。通过配置自动缩放规则,可以定义应用程序的最小副本数、最大副本数以及触发缩放的指标阈值。当应用程序的负载超过或低于指定的阈值时,Knative会自动调整应用程序的副本数,以适应当前的负载情况。

您可以使用集群控制台修改服务的每个修订设置,或者使用 kn CLI 修改服务。

扩展范围

缩放范围决定了可在任意给定时间为应用程序服务的最小和最大副本数。最小扩展范围表示为应用程序提供服务的最小副本数量由 min-scale 注解决定。最大范围由max-scale表示。如果不设置min-scale 注解,扩展到0,使用类KPA则都会使min-scale的值默认设置为0。

带有 min-scale 注解的 service 示例

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  annotations:
    serving.knative.dev/creator: kubeadmin
    serving.knative.dev/lastModifier: kubeadmin
  ...
  name: my-serverless-app-1
  namespace: syx
  ...
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/min-scale: '1'


使用kn CLI 设置 min-scale /max-scale注解

$ kn service create <service_name> --image <image_uri> --scale-min <integer>

您可以使用带 --scale-min 标志的 kn service 命令为服务创建或修改 min-scale 值或者--scale-max 修改max-scale注解。

示例命令

$ kn service create example-service --image docker.io/sunyuxuan/serverless-test:latest --scale-min 1

OpenShift Knative Serving 配置服务(1)_自动缩放

可看到上述服务的pod扩展为两个

流量管理

在 Knative 应用程序中,可以通过创建流量分割来管理流量。应用程序流量分割是一种将入站流量分配到不同的版本或实例的过程,以便测试新版本或逐步将流量转移到新版本。Knative的流量分割功能可以帮助开发人员轻松地将流量分配到不同的版本或实例,以便进行测试、回归测试或逐步发布新版本。

配置路由允许将请求发送到服务的不同修订版本。此路由由Service 对象的 traffic spec 决定。

traffic 规格声明由一个或多个修订版本组成,每个修订版本负责处理整个流量的一部分。路由到每个修订版本的流量百分比必须添加到 100%,由 Knative 验证确保。

traffic 规格示例

以下示例显示了一个 traffic 规格,其中 100% 的流量路由到该服务的最新修订版本。在 status 下,您可以看到 latestRevision 解析为的最新修订版本的名称:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: example-service
  namespace: default
spec:
...
  traffic:
  - latestRevision: true
    percent: 100
status:
  ...
  traffic:
  - percent: 100
    revisionName: example-service

以下示例中 100% 的流量路由到当前标记为 current 修订版本,并且该修订版本的名称指定为 example-service。标记为 latest 的修订版本会保持可用,即使没有流量路由到它:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: example-service
  namespace: default
spec:
...
  traffic:
  - tag: current
    revisionName: example-service
    percent: 100
  - tag: latest
    latestRevision: true
    percent: 0

以下示例演示了如何扩展 traffic 规格中的修订版本列表,以便在多个修订版本间分割流量。这个示例将 50% 的流量发送到标记为 current 修订版本,50% 的流量发送到标记为 candidate 的修订版本。标记为 latest 的修订版本会保持可用,即使没有流量路由到它:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: example-service
  namespace: default
spec:
...
  traffic:
  - tag: current
    revisionName: example-service-1
    percent: 50
  - tag: candidate
    revisionName: example-service-2
    percent: 50
  - tag: latest
    latestRevision: true
    percent: 0
使用Knative CLI创建流量分割

使用带有kn service update 命令的 --traffic 标签指定服务修订版本以及您要路由到它的流量百分比

示例命令

$ kn service update <service_name> --traffic <revision>=<percentage>

其中:

<service_name> 是您要为其配置流量路由的

<revision> 是您要配置为接收流量百分比的修订版本。您可以使用 --tag 标志指定修订版本的名称,或指定分配给修订版本的标签。

<percentage> 是您要发送到指定修订版本的流量百分比。

--traffic 标志可在一个命令中多次指定。

$ kn service update example-service --traffic @latest=20,stable=80

上边示例命令表示为latest修订版本分配20%流量,为stable分配80%流量

如果您有多个修订版本,且没有指定应分割到最后一个修订版本的流量百分比,--traffic 标志可以自动计算此设置。例如,如果您有一个第三个版本名为 example,则使用以下命令:

$ kn service update example-service --traffic @latest=10,stable=60

剩余的30%流量则会分配给example。

使用控制台控制流量分割

OpenShift Knative Serving 配置服务(1)_流量管理_02

观察上图的服务,我们可以看到有三个修订版本my-serverless-app-1-00003 、my-serverless-app-1-00002 、my-serverless-app-1-00001 点击设置流量分配按钮

在分割页面中为三个修订分别设置流量比

添加标签test1、test2、test3来区分后面生成的自定义URL

OpenShift Knative Serving 配置服务(1)_无服务器_03

点击保存后等待更新完成

OpenShift Knative Serving 配置服务(1)_无服务器_04

上图便是更新完成后流量分割的示意图,且每个修订版本的URL根据标签已经修改


参考《https://access.redhat.com/documentation/zh-cn/red_hat_openshift_serverless/1.31