帶你體驗云原生場景下 Serverless 應(yīng)用編程模型
背景
阿里云 Serverless Kubernetes(ASK) 是阿里云推出的無服務(wù)器 Kubernetes 容器服務(wù),底層基于 ECI(Elastic Container Instance)讓您無需購買 ECS 節(jié)點就能直接創(chuàng)建安全隔離的容器應(yīng)用。 ASK 通過了 Kubernetes 的一致性測試,給您提供了完全兼容社區(qū) Kubernetes 的使用體驗。
Knative 是一款基于 Kubernetes 的開源 Serverless 應(yīng)用編排框架,其目標是制定云原生、跨平臺的Serverless應(yīng)用編排標準。阿里云 Knative 基于 ASK 之上,在完全兼容社區(qū) Knaitve 的同時對 FC、ECI 工作負載進行統(tǒng)一應(yīng)用編排,支持事件驅(qū)動、自動彈性,為您提供統(tǒng)一的 Serverless 應(yīng)用編程模型。
架構(gòu)
接下來我們通過一個彈幕服務(wù) demo 進行介紹。該 demo 主要包括 HomePage、事件驅(qū)動、消息處理這 3 部分。
HomePage 主要用于發(fā)送和接收彈幕。事件驅(qū)動用來接收事件,并進行事件過濾、流轉(zhuǎn)。消息處理,用于處理彈幕消息。其中 HomePage、消息處理通過 Knative Serving 部署分別到 FC、ECI,事件驅(qū)動通過 Knative Eventing 部署到ECI。
彈幕服務(wù) demo 主要流程如圖,用戶通過前端發(fā)送彈幕消息到 HomePage,HomePage 接著將彈幕發(fā)送到 Kafka,事件驅(qū)動接收彈幕消息,然后路由到消息處理進行加工,待彈幕加工完之后,將彈幕結(jié)果發(fā)送到表格存儲中,最后前端獲取彈幕結(jié)果在頁面展示。
接下來我們開始部署該彈幕服務(wù) demo, 操作包括以下內(nèi)容:
首先部署消息處理,然后部署事件驅(qū)動,接著部署 HomePage,待部署完成之后進行彈幕服務(wù)訪問
第一步:部署消息處理
該服務(wù)用于接收事件驅(qū)動發(fā)送的彈幕請求,并根據(jù)請求數(shù)進行自動擴縮容,待彈幕消息處理完成之后將結(jié)果發(fā)送到表格存儲。部署之前,我們先確認當(dāng)前無工作負載,以便觀察部署之后的結(jié)果。
選擇 ask 集群
在集群管理頁左側(cè)導(dǎo)航欄中,選擇工作負載 > 無狀態(tài)。選擇 default命名空間,確認當(dāng)前無工作負載
接著通過 Knative 把彈消息處理部署到 ECI 類型工作負載。這里我們通過yaml的方式進行部署,yaml內(nèi)容如下:
- 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
主要參數(shù)說明:
minScale和maxScale:表示服務(wù)配置的最小和最大Pod數(shù)量
containerConcurrency:表示配置的Pod最大請求并發(fā)數(shù)
OTS_ENDPOINT:表示配置的表格存儲訪問地址
TRACING:表示配置的調(diào)用連地址
那么接下來我們部署該服務(wù)。
在集群管理頁左側(cè)導(dǎo)航欄中,選擇應(yīng)用 > Knative。
在服務(wù)管理頁簽右上角,單擊【使用模版創(chuàng)建】。選擇default 命名空間,將上面的 yaml 內(nèi)容粘貼到模版,點擊創(chuàng)建。
第二步:部署事件驅(qū)動
事件驅(qū)動用于接收事件并進行事件流過濾、流轉(zhuǎn)。這里我們使用 Kafka 事件源作為事件驅(qū)動,用于從 Kafka 接收彈幕消息,然后把彈幕路由到消息處理。我們通過yaml的方式進行部署, yaml內(nèi)容如下:
第三步:部署HomePage
該服務(wù)用于接收前端彈幕消息,并將彈幕消息發(fā)送到 Kafka,同時從表格存儲中接收彈幕結(jié)果。這里通過 Knative 函數(shù)方式部署之后,會自動在FC中創(chuàng)建服務(wù)、函數(shù)、自定義域名。操作之前我們先確認FC中無彈幕服務(wù)、函數(shù)以及自定義域名。
登錄FC控制臺
在頂部菜單欄,選擇地域(上海)。
打開服務(wù)及函數(shù)頁面,確認無彈幕服務(wù)及函數(shù)
在左側(cè)導(dǎo)航欄中,單擊自定義域名,確認無域名信息。
打開自定義域名頁面,確認無自定義域名
接下來我們通過 Knative 把HomePage部署到FC類型工作負載。這里我們通過yaml的方式進行部署, yaml內(nèi)容如下:
- 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"
主要參數(shù)說明:
fc 相關(guān)參數(shù)配置包括: 部署fc類型的工作負載、通過鏡像方式部署,并指定訪問域名為: barrage.demo.knative.top
配置表格存儲訪問地址: OTS_ENDPOINT
kafka 相關(guān)參數(shù)配置:kafka服務(wù)地址、彈幕消息 topic
調(diào)用連地址配置:TRACING
那么我們來部署該服務(wù)。
登錄容器服務(wù)管理控制臺。
在集群管理頁左側(cè)導(dǎo)航欄中,選擇應(yīng)用 > Knative。
在服務(wù)管理頁簽右上角,單擊【使用模版創(chuàng)建】。選擇default 命名空間,將上面的 yaml 內(nèi)容粘貼到模版,點擊創(chuàng)建。
部署完成之后,我們在函數(shù)計算控制臺驗證一下。
登錄函數(shù)計算控制臺。
在頂部菜單欄,選擇地域。
在左側(cè)導(dǎo)航欄中,單擊服務(wù)及函數(shù),選擇可以看到彈幕服務(wù)已經(jīng)部署完成
打開服務(wù)及函數(shù)頁面,可以看到HomePage已經(jīng)部署完成。
第四步:服務(wù)訪問
以上服務(wù)都已部署完成,接著我們通過自定義域名進行服務(wù)訪問。http://barrage.demo.knative.top
接下來我們發(fā)送彈幕,這里可以自定義設(shè)置需要發(fā)送的彈幕消息,并發(fā)數(shù)以及持續(xù)時間。這里我們使用默認配置進行發(fā)送。
設(shè)置Message、Concurrency以及Duration,點擊【Send】
我們可以看到不斷有彈幕消息展示出來。
小結(jié)
阿里云 Knative 在 Serverless Kubernetes 之上,提供了面向容器+函數(shù)的統(tǒng)一編程模型,給你帶來統(tǒng)一的Serverless 應(yīng)用編程模型。歡迎有興趣的同學(xué)一起交流。