帶你體驗云原生場景下 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/v1kind: Servicemetadata: name: test-barrage-processspec: 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內容如下:
第三步:部署HomePage
該服務用于接收前端彈幕消息,并將彈幕消息發送到 Kafka,同時從表格存儲中接收彈幕結果。這里通過 Knative 函數方式部署之后,會自動在FC中創建服務、函數、自定義域名。操作之前我們先確認FC中無彈幕服務、函數以及自定義域名。
登錄FC控制臺
在頂部菜單欄,選擇地域(上海)。
打開服務及函數頁面,確認無彈幕服務及函數
在左側導航欄中,單擊自定義域名,確認無域名信息。
打開自定義域名頁面,確認無自定義域名
接下來我們通過 Knative 把HomePage部署到FC類型工作負載。這里我們通過yaml的方式進行部署, yaml內容如下:
- apiVersion: serving.knative.dev/v1kind: Servicemetadata: 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 應用編程模型。歡迎有興趣的同學一起交流。