使用Knative on ASM部署Serverless应用

服务网格ASM与容器服务ACK及ACK Serverless的Knative Serving能力紧密结合,简化在多种集群环境中部署和管理Serverless应用服务的过程。针对快速构建、部署以及管理基于容器的应用场景,尤其是涉及自动扩缩容、按需计费需求的情况,Knative on ASM提供了一站式的解决方案,帮助您实现Serverless应用程序的快速部署与灵活扩展,提升开发效率并增强业务弹性。本文介绍如何使用Knative on ASM创建Knative服务。

前提条件

  • 已创建1.16.3.50及以上版本的ASM实例,并已将一个ACK或ACK Serverless集群添加到该实例中。具体操作,请参见创建ASM实例添加集群到ASM实例

    重要
    • 创建ASM实例时,请确保在资源配置区域,启用数据面集群KubeAPI访问Istio资源已勾选(默认勾选),即已启用数据面KubeAPI访问Istio资源。

    • 目标ACK或ACK Serverless集群已开启公网API Server,以便快速接入。

    • ASM实例和ACK或ACK Serverless集群需处于同一VPC、同一地域并使用同一交换机。

  • 已为集群添加入口网关。本实例使用ASM入口网关作为集群网关。具体操作,请参见创建入口网关

    说明
    • 1.21.6.84版本以上的ASM实例不再需要手动创建入口网关

    • ASM网关支持为Knative提供Knative Revisions流量分发,支持gRPC服务、超时和重试、TLS证书和外部认证授权等功能。详细信息,请参见ASM网关概述

步骤一:安装Knative

ASM实例版本为1.18.2.104以下

  1. 在ACK或ACK Serverless集群中部署Knative Serving组件,服务网关选择Kourier

    • 关于如何在ACK上安装Knative,请参见部署Knative

    • 关于如何在ACK Serverless上安装Knative,请参见开启Knative

      重要

      在组件成功安装后,请单击组件管理页签,在add-on 组件区域的列表卸载Kourier组件。

  2. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  3. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择生态集成中心 > Knative on ASM

  4. Knative on ASM页面,单击启用Knative on ASM

ASM实例版本为1.18.2.104~1.21.6.83

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择生态集成中心 > Knative on ASM

  3. Knative on ASM页面,按需选择Knative版本,单击启用Knative on ASM

  4. 在ACK或ACK Serverless集群中部署Knative,服务网关选择ASM

    • 关于如何在ACK上安装Knative,请参见部署Knative

    • 关于如何在ACK Serverless上安装Knative,请参见开启Knative

ASM实例版本为1.21.6.84及以上

重要

1.21.6.84版本以上的ASM实例不再需要单独在ASM控制台开启Knative on ASM功能。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Knative

  3. Knative页面的组件管理页签下,单击一键部署Knative,然后在服务网关处选择ASM,然后单击一键部署

    部署成功后,即可在Knative中使用服务网格ASM。

    说明

    页面提示部署完成后,请确认入口网关已经创建完成并正常运行后再进行Kantive服务的部署。

步骤二:部署Knative服务

Knative on ASM支持通过ACK控制台和YAML配置文件两种方式部署Knative服务。您可以按需选择。

方式一:通过ACK控制台部署

  1. 登录容器服务管理控制台,在左侧导航栏单击集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Knative

  3. Knative页面,单击服务管理页签,在右上角单击创建服务,配置相关信息,然后单击创建

    关于配置项的更多信息,请参见快速部署Serverless应用

    配置项

    说明

    示例值

    命名空间

    选择该服务所属的命名空间。

    default

    服务名称

    自定义该服务的名称。

    helloworld-go

    镜像名称

    单击选择镜像,在弹出的对话框中选择所需的镜像并单击确定。支持填写私有Registry,填写的格式为domainname/namespace/imagename:tag。

    registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go

    镜像版本

    单击选择镜像版本,在弹出的对话框选择目标版本,单击确定

    73fbdd56

    访问协议

    支持HTTPgRPC两种访问协议。

    HTTP

    容器端口

    设置暴露的容器访问端口,端口号必须介于1~65535。

    8080

    环境变量

    单击高级设置,然后在环境变量右侧单击新增,通过键值对的形式配置环境变量。

    类型:自定义

    变量名称:TARGET

    变量/变量引用:Knative

方式二:通过YAML配置文件部署

  1. 将以下内容保存为helloworld-go.yaml。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: helloworld-go
      annotations:
        knative.k8s.alibabacloud/tls: "false"
    spec:
      template:
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/acs/helloworld-go:160e4dc8
              ports:
                - containerPort: 8080
              env:
                - name: TARGET
                  value: "Knative"
  2. 使用kubectl连接到ACK集群,执行以下命令创建Knative Service,并等待Knative Service创建成功。

    kubectl apply -f helloworld-go.yaml
  3. 执行以下命令,查看Knative服务列表。

    kubectl get ksvc

    预期输出:

    NAME            URL                                        LATESTCREATED         LATESTREADY           READY   REASON
    helloworld-go   http://helloworld-go.default.example.com   helloworld-go-00001   helloworld-go-00001   True

方式三:使用模板创建

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Knative

  3. Knative页面的服务管理页签下,选择命名空间default,然后单击使用模板创建,将以下YAML示例粘贴至模板,最后单击创建。创建一个名为helloworld-go的服务。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: helloworld-go
    spec:
      template:
        spec:
          containers:
          - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56 # 请将{REGION-ID}替换为您集群所在地域。
            env:
            - name: TARGET
              value: "Knative"

步骤三:获取访问网关地址

方式一:通过ACK控制台获取

  1. 登录容器服务管理控制台,在左侧导航栏单击集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Knative

  3. 单击服务管理页签,然后在服务列表中单击目标服务名称,进入Knative服务详情页面。在基本信息区域,查看并获取访问网关默认域名

方式二:通过ASM控制台获取

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择ASM网关 > 入口网关

  3. 入口网关页面的服务地址区域,查看并获取访问网关地址。

步骤四:访问服务

Knative服务创建完成后,通过绑定Host域名与访问网关,可以直接访问服务地址。

  1. 服务管理页面的访问网关列,获取helloworld-go服务的网关地址。

  2. 执行以下命令,访问helloworld-go服务。

    curl -H "host: helloworld-go.default.example.com" http://39.XX.XX.XX # 网关的IP和域名请以您的实际数据为准。

    预期输出:

    Hello Knative!

    输出结果表明服务访问成功。

相关文档

  • Knative默认服务域名为example.com。Knative on ASM支持使用自定义域名作为默认域名。具体操作,请参见在Knative on ASM中使用自定义域名

  • ASM网关支持HTTPS协议和动态加载证书功能。在使用Knative on ASM时,您可以通过ASM网关来实现HTTPS访问。具体操作,请参见使用ASM网关实现HTTPS访问Knative服务

  • Knative on ASM提供基于流量的灰度发布能力。创建Knative服务时,Knative会为服务自动创建第一个修订版本Revision。后续每当Knative服务的配置发生变化时,Knative都会创建一个新修订版本,通过修改流量发往不同修订版本的分配比例来实现灰度发布功能。具体操作,请参见在Knative on ASM中基于流量灰度发布服务

  • Knative Serving为每个Pod注入QUEUE代理容器(queue-proxy)。该容器负责向Autoscaler报告业务容器的并发指标。接收到这些指标之后,Autoscaler会根据并发请求数及缩放算法,调整Deployment的Pod数量,从而实现自动扩缩容。具体操作,请参见基于流量请求数实现服务自动扩缩容