1. 程式人生 > 其它 >帶你體驗雲原生場景下 Serverless 應用程式設計模型

帶你體驗雲原生場景下 Serverless 應用程式設計模型

簡介:阿里雲 Knative 基於 ASK 之上,在完全相容社群 Knaitve 的同時對 FC、ECI 工作負載進行統一應用編排,支援事件驅動、自動彈性,為您提供統一的 Serverless 應用程式設計模型。

背景

阿里雲 Serverless Kubernetes(ASK) 是阿里雲推出的無伺服器 Kubernetes 容器服務,底層基於 ECI(Elastic Container Instance)讓您無需購買 ECS 節點就能直接建立安全隔離的容器應用。 ASK 通過了 Kubernetes 的一致性測試,給您提供了完全相容社群 Kubernetes 的使用體驗。

Knative 是一款基於 Kubernetes 的開源 Serverless 應用編排框架,其目標是制定雲原生、跨平臺的Serverless應用編排標準。阿里雲 Knative 基於 ASK 之上,在完全相容社群 Knaitve 的同時對 FC、ECI 工作負載進行統一應用編排,支援事件驅動、自動彈性,為您提供統一的 Serverless 應用程式設計模型。

架構

接下來我們通過一個彈幕服務 demo 進行介紹。該 demo 主要包括 HomePage、事件驅動、訊息處理這 3 部分。

HomePage 主要用於傳送和接收彈幕。事件驅動用來接收事件,並進行事件過濾、流轉。訊息處理,用於處理彈幕訊息。其中 HomePage、訊息處理通過 Knative Serving 部署分別到 FC、ECI,事件驅動通過 Knative Eventing 部署到ECI。

彈幕服務 demo 主要流程如圖,使用者通過前端傳送彈幕訊息到 HomePage,HomePage 接著將彈幕傳送到 Kafka,事件驅動接收彈幕訊息,然後路由到訊息處理進行加工,待彈幕加工完之後,將彈幕結果傳送到表格儲存中,最後前端獲取彈幕結果在頁面展示。

接下來我們開始部署該彈幕服務 demo, 操作包括以下內容:

首先部署訊息處理,然後部署事件驅動,接著部署 HomePage,待部署完成之後進行彈幕服務訪問

第一步:部署訊息處理

該服務用於接收事件驅動傳送的彈幕請求,並根據請求數進行自動擴縮容,待彈幕訊息處理完成之後將結果傳送到表格儲存。部署之前,我們先確認當前無工作負載,以便觀察部署之後的結果。

  • 選擇 ask 叢集
  • 在叢集管理頁左側導航欄中,選擇工作負載 > 無狀態。選擇 default名稱空間,確認當前無工作負載

接著通過 Knative 把彈訊息處理部署到 ECI 型別工作負載。這裡我們通過yaml的方式進行部署,yaml內容如下:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: test-barrage-process
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/maxScale: "100"
        autoscaling.knative.dev/minScale: "0"
        k8s.aliyun.com/eci-image-snapshot-id: imc-uf636kjjx8xr4e75npex
      labels:
        danmu.role: "manager"
    spec:
      containerConcurrency: 2
      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@53df7ad2afe8301/api/traces"
          image: registry-vpc.cn-shanghai.aliyuncs.com/knative-sample/barrage-manager:forrester-yuanyi_4cd77c84-20210618215458
          name: user-container
          ports:
            - containerPort: 8000
              name: http1

主要引數說明:

  • minScale和maxScale:表示服務配置的最小和最大Pod數量
  • containerConcurrency:表示配置的Pod最大請求併發數
  • OTS_ENDPOINT:表示配置的表格儲存訪問地址
  • TRACING:表示配置的呼叫連地址

那麼接下來我們部署該服務。

  • 在叢集管理頁左側導航欄中,選擇應用 > Knative
  • 服務管理頁籤右上角,單擊【使用模版建立】。選擇default 名稱空間,將上面的 yaml 內容貼上到模版,點選建立。

第二步:部署事件驅動

事件驅動用於接收事件並進行事件流過濾、流轉。這裡我們使用 Kafka 事件源作為事件驅動,用於從 Kafka 接收彈幕訊息,然後把彈幕路由到訊息處理。我們通過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
  consumerGroup: barrage-info-consumer
  sink:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: test-barrage-process
      namespace: default
  topics: barrage-info

主要引數說明:

  • kafka配置包括:kafka服務地址 ,彈幕訊息 topics 以及消費組 consumerGroup
  • 路由的目標訊息處理:test-barrage-process

那麼接下來我們部署該服務。

  • 在叢集管理頁左側導航欄中,選擇應用 > Knative
  • 服務管理頁籤右上角,單擊【使用模版建立】。選擇default 名稱空間,將上面的 yaml 內容貼上到模版,點選建立。

以上訊息處理和事件驅動都已部署完成,我們來驗證一下。

(在叢集管理頁左側導航欄中,選擇工作負載 > 容器組)

在容器組中,可以看到訊息處理以及 Kafka 事件源例項都已 running

第三步:部署HomePage

該服務用於接收前端彈幕訊息,並將彈幕訊息傳送到 Kafka,同時從表格儲存中接收彈幕結果。這裡通過 Knative 函式方式部署之後,會自動在FC中建立服務、函式、自定義域名。操作之前我們先確認FC中無彈幕服務、函式以及自定義域名。

  • 登入FC控制檯
  • 在頂部選單欄,選擇地域(上海)。

開啟服務及函式頁面,確認無彈幕服務及函式

  • 在左側導航欄中,單擊自定義域名,確認無域名資訊。

開啟自定義域名頁面,確認無自定義域名

接下來我們通過 Knative 把HomePage部署到FC型別工作負載。這裡我們通過yaml的方式進行部署, yaml內容如下:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: demo-barrage
  annotations:
    workload.serving.knative.aliyun.com/class: "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"
        fc.revision.serving.knative.aliyun.com/domain: '{"domain":"barrage.demo.knative.top","path":"/*"}'
    spec:
      containers:
        - image: registry.cn-shanghai.aliyuncs.com/knative-sample/barrage-main:forrester-yuanyi_4cd77c84-20210618214527
          env:
            - name: 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
              value: "106.15.11.179:9093,47.100.131.71:9093,47.102.44.91:9093"
            - name: KAFKA_USER
              value: "alikafka_pre-cn-xxx"
            - name: KAFKA_PWD
              value: "xxx"
            - name: KAFKA_TOPIC
              value: "barrage-info"
            - name: TRACING
              value: "http://tracing-analysis-dc-sh.aliyuncs.com/adapt_g2it2kg78n@5cf06035aec2eb9_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"

主要引數說明:

  • fc 相關引數配置包括: 部署fc型別的工作負載、通過映象方式部署,並指定訪問域名為: barrage.demo.knative.top
  • 配置表格儲存訪問地址: OTS_ENDPOINT
  • kafka 相關引數配置:kafka服務地址、彈幕訊息 topic
  • 呼叫連地址配置:TRACING

那麼我們來部署該服務。

  • 登入容器服務管理控制檯
  • 在叢集管理頁左側導航欄中,選擇應用>Knative
  • 服務管理頁籤右上角,單擊【使用模版建立】。選擇default 名稱空間,將上面的 yaml 內容貼上到模版,點選建立。

部署完成之後,我們在函式計算控制檯驗證一下。

  • 登入函式計算控制檯
  • 在頂部選單欄,選擇地域。
  • 在左側導航欄中,單擊服務及函式,選擇可以看到彈幕服務已經部署完成

開啟服務及函式頁面,可以看到HomePage已經部署完成。

  • 在左側導航欄中,單擊自定義域名。

開啟自定義域名頁面可以看到自動創建出來了我們配置的域名。

第四步:服務訪問

以上服務都已部署完成,接著我們通過自定義域名進行服務訪問。http://barrage.demo.knative.top

接下來我們傳送彈幕,這裡可以自定義設定需要傳送的彈幕訊息,併發數以及持續時間。這裡我們使用預設配置進行傳送。

設定Message、Concurrency以及Duration,點選【Send】

我們可以看到不斷有彈幕訊息展示出來。

小結

阿里雲 Knative 在 Serverless Kubernetes 之上,提供了面向容器+函式的統一程式設計模型,給你帶來統一的Serverless 應用程式設計模型。歡迎有興趣的同學一起交流。

原文連結
本文為阿里雲原創內容,未經允許不得轉載。