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

阿里云云棲號 發佈 2021-10-20T10:50:45+00:00

阿里雲 Serverless Kubernetes 是阿里雲推出的無伺服器 Kubernetes 容器服務,底層基於 ECI讓您無需購買 ECS 節點就能直接創建安全隔離的容器應用。

背景

阿里雲 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 應用編程模型。歡迎有興趣的同學一起交流。

原文連結:http://click.aliyun.com/m/1000301883/

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

關鍵字: