Knative是一款基于Kubernetes的开源Serverless应用编排框架,其目标是制定云原生、跨平台的Serverless应用编排标准。阿里云Knative基于ASK之上,在完全兼容社区Knaitve的同时对FC、ECI工作负载进行统一应用编排,支持事件驱动、自动弹性。本文通过一个弹幕服务Demo示例介绍如何通过Knative部署消息处理、事件驱动和Homepage,实现弹幕服务。

Demo介绍

弹幕服务Demo主要包括以下三部分:
  • HomePage:用于发送和接收弹幕,通过Knative Serving部署到函数计算FC。
  • 事件驱动:用于接收事件,并进行事件过滤、流转,通过Knative Serving部署到ECI。
  • 消息处理:用于处理弹幕消息,通过Knative Serving部署到ECI。

弹幕服务Demo实现弹幕功能的主要流程如下图所示。

Knative Demo
  1. 您通过前端发送弹幕消息到HomePage。
  2. HomePage接着将弹幕发送到Kafka,事件驱动接收弹幕消息,然后路由到消息处理进行加工。
  3. 待弹幕加工完之后,将弹幕结果发送到表格存储中。
  4. 页面展示前端获取的弹幕结果。

步骤一:部署消息处理

消息处理用于接收事件驱动发送的弹幕请求,并根据请求数进行自动扩缩容,待弹幕消息处理完成之后将结果发送到表格存储。部署之前,需要先确认当前无工作负载,以便观察部署之后的结果。

  1. 容器服务管理控制台确认当前无工作负载。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在集群管理页左侧导航栏中,选择工作负载 > 无状态
    5. 在顶部的命名空间下拉列表中,选择default,确认default命名空间下无工作负载。
      Knative Deployment.png
  2. 容器服务管理控制台通过Knative把消息处理部署到ECI类型的工作负载。
    1. 在集群管理页左侧导航栏中,选择应用 > Knative
    2. 在Knative页面,单击服务管理页签,然后单击使用模板创建
    3. 命名空间下拉列表中,选择default。从示例模板下拉列表中,选择自定义。复制以下YAML示例粘贴至模板,然后单击创建
      YAML示例如下。
      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        name: test-barrage-process
      spec:
        template:
          metadata:
            annotations:
              autoscaling.knative.dev/maxScale: "100"   #服务配置的最大Pod数。
              autoscaling.knative.dev/minScale: "0"     #服务配置的最小Pod数。
              k8s.aliyun.com/eci-image-snapshot-id: imc-uf636kjjx8xr4e75****
            labels:
              danmu.role: "manager"
          spec:
            containerConcurrency: 2          #配置的Pod最大请求并发数。
            serviceAccountName: barrage-install-sa
            containers:
              - args:
                  - /manager
                env:
                  - name: OTS_ENDPOINT      #配置的表格存储访问地址。
                    value: https://barrage.cn-hangzhou.tablestore.aliyuncs.com
                  - name: TABLE_NAME
                    value: barrage
                  - name: OTS_INSTANCENAME
                    value: barrage
                  - name: OTS_KEYID
                    value: xxx
                  - name: OTS_SECRET
                    value: xxx
                  - name: POD_NAME
                    valueFrom:
                      fieldRef:
                        fieldPath: metadata.name
                  - name: ROLE
                    value: manager
                  - name: POD_NAMESPACE
                    valueFrom:
                      fieldRef:
                        fieldPath: metadata.namespace
                  - name: TRACE_NAME
                    value: "process"
                  - name: PARENT_SPAN
                    value: "barrage-sender"
                  - name: SUB_SPAN
                    value: "process"
                  - name: TRACING       #配置的调用链地址。
                    value: "http://tracing-analysis-dc-sh.aliyuncs.com/adapt_g2it2kg78n@5cf06035aec2eb9_g2it2kg78n@53df7ad2afe****/api/traces"
                image: registry-vpc.cn-shanghai.aliyuncs.com/knative-sample/barrage-manager:forrester-****_4cd77c84-20210618215458
                name: user-container
                ports:
                  - containerPort: 8000
                    name: http1

步骤二:部署事件驱动

事件驱动用于接收事件并进行事件流过滤、流转。本文示例使用Kafka事件源作为事件驱动,用于从Kafka接收弹幕消息,然后把弹幕路由到消息处理。

  1. 在集群管理页左侧导航栏中,选择应用 > Knative
  2. 在Knative页面,单击服务管理页签,然后单击使用模板创建
  3. 命名空间下拉列表中,选择default。从示例模板下拉列表中,选择自定义。复制以下YAML示例粘贴至模板,然后单击创建
    YAML示例如下。
    apiVersion: sources.knative.dev/v1alpha1
    kind: KafkaSource
    metadata:
      annotations:
        k8s.aliyun.com/req-timeout: "60"
        k8s.aliyun.com/retry-count: "5"
        k8s.aliyun.com/retry-interval: "2"
      name: barrage
      namespace: default
    spec:
      bootstrapServers: 192.168.42.205:9092,192.168.42.204:9092,192.168.42.203:9092   #配置消息队列Kafka版实例的默认接入点。
      consumerGroup: barrage-info-consumer    #配置消息队列Kafka版实例消费组。
      sink:
        ref:
          apiVersion: serving.knative.dev/v1
          kind: Service
          name: test-barrage-process  #路由的目标消息处理。
          namespace: default
      topics: barrage-info     #配置消息队列Kafka版实例Topic的名称。
    消息处理和事件驱动都部署成功后,可以在集群管理页左侧导航栏中,选择工作负载 > 容器组,在容器组页面看到消息处理以及Kafka事件源实例的状态都是running

步骤三:部署HomePage

HomePage用于接收前端弹幕消息,并将弹幕消息发送到Kafka,同时从表格存储中接收弹幕结果。HomePage通过Knative函数方式部署之后,会自动在FC中创建服务、函数、自定义域名。部署HomePage之前需要先确认FC中无弹幕服务、函数以及自定义域名。

  1. 函数计算控制台确认无弹幕服务、函数以及自定义域名。
    1. 登录函数计算控制台
    2. 在左侧导航栏单击服务及函数
    3. 在顶部菜单栏,选择地域。

      本文选择华东2(上海)。

    4. 服务列表页面,单击目标服务。在函数管理页面,确认无弹幕服务及函数。
    5. 函数计算控制台左侧导航栏,选择高级功能 > 域名管理。在域名管理页面,确认无自定义域名。
  2. 在容器服务管理控制台,通过Knative把HomePage部署到FC类型的工作负载。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在集群管理页左侧导航栏中,选择应用 > Knative
    5. 在Knative页面,单击服务管理页签,然后单击使用模板创建
    6. 命名空间下拉列表中,选择default。从示例模板下拉列表中,选择自定义。复制以下YAML示例粘贴至模板,然后单击创建
      YAML示例如下。
      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        name: demo-barrage
        annotations:
          workload.serving.knative.aliyun.com/class: "fc"   #部署FC类型的工作负载。
      spec:
        template:
          metadata:
            annotations:
              fc.revision.serving.knative.aliyun.com/code-space: "image"                          #指定镜像类型。
              fc.revision.serving.knative.aliyun.com/role-arm: "acs:ram::xxxx:role/knative-fc"    #输入ARN绑定权限策略。
              fc.revision.serving.knative.aliyun.com/domain: '{"domain":"barrage.demo.knative.top","path":"/*"}'  #指定访问域名barrage.demo.knative.top。
          spec:
            containers:
              - image: registry.cn-shanghai.aliyuncs.com/knative-sample/barrage-main:forrester-****_4cd77c84-20210618214527
                env:
                  - name: OTS_ENDPOINT     #配置表格存储访问地址为OTS_ENDPOINT。
                    value: https://barrage.cn-hangzhou.ots.aliyuncs.com
                  - name: TABLE_NAME
                    value: barrage
                  - name: OTS_INSTANCENAME
                    value: barrage
                  - name: OTS_KEYID
                    value: xxx
                  - name: OTS_SECRET
                    value: xxx
                  - name: KAFKA_SERVER     #配置Kafka服务地址。
                    value: "106.15.XX.XX:9093,47.100.XX.XX:9093,47.102.XX.XX:9093"
                  - name: KAFKA_USER
                    value: "alikafka_pre-cn-xxx"
                  - name: KAFKA_PWD
                    value: "xxx"
                  - name: KAFKA_TOPIC     #配置弹幕消息Topic。
                    value: "barrage-info"
                  - name: TRACING         #配置调用链地址。
                    value: "http://tracing-analysis-dc-sh.aliyuncs.com/adapt_g2it2kg78n@5cf06035aec****_g2it2kg78n@53df7ad2afe8301/api/traces"
                  - name: TRACE_NAME1
                    value: "sender"
                  - name: TRACE_NAME2
                    value: "receiver"
                  - name: TRACE_NAME3
                    value: "result"
                  - name: PARENT_SPAN
                    value: "barrage-sender"
                  - name: SUB_SPAN1
                    value: "sender"
                  - name: SUB_SPAN2
                    value: "result"
    验证结果

    部署完成后,在函数计算控制台验证服务是否部署成功。

    1. 登录函数计算控制台
    2. 在左侧导航栏中,选择高级功能 > 域名管理。然后在顶部菜单栏,选择地域,本文示例选择华东2(上海)。在域名管理页面,可以查看到配置成功的域名。Knative 域名管理.png
    3. 在左侧导航栏,单击服务及函数,然后在服务列表页面,单击目标服务。在函数管理页面,可以查看到HomePage已经部署完成。Knative homepage.png

步骤四:访问服务

  1. 通过在函数计算控制台域名管理页面得到的自定义域名,访问服务。
    本文示例为http://barrage.demo.knative.top
  2. 设置弹幕的参数,单击Send
    • Message:具体发送的弹幕消息。
    • Concurrency:弹幕的并发数。
    • Duration:弹幕的持续时间。

    本文使用默认配置发送弹幕。

    执行结果
    可以看到不断有弹幕消息展示出来,如下图所示。Knative弹幕.png