带你体验云原生场景下 Serverless 应用编程模型
簡介:?阿里云 Knative 基于 ASK 之上,在完全兼容社區(qū) Knaitve 的同時(shí)對(duì) FC、ECI 工作負(fù)載進(jìn)行統(tǒng)一應(yīng)用編排,支持事件驅(qū)動(dòng)、自動(dòng)彈性,為您提供統(tǒng)一的 Serverless 應(yīng)用編程模型。
背景
阿里云 Serverless Kubernetes(ASK) 是阿里云推出的無服務(wù)器 Kubernetes 容器服務(wù),底層基于 ECI(Elastic Container Instance)讓您無需購買 ECS 節(jié)點(diǎn)就能直接創(chuàng)建安全隔離的容器應(yīng)用。 ASK 通過了 Kubernetes 的一致性測試,給您提供了完全兼容社區(qū) Kubernetes 的使用體驗(yàn)。
Knative 是一款基于 Kubernetes 的開源 Serverless 應(yīng)用編排框架,其目標(biāo)是制定云原生、跨平臺(tái)的Serverless應(yīng)用編排標(biāo)準(zhǔn)。阿里云 Knative 基于 ASK 之上,在完全兼容社區(qū) Knaitve 的同時(shí)對(duì) FC、ECI 工作負(fù)載進(jìn)行統(tǒng)一應(yīng)用編排,支持事件驅(qū)動(dòng)、自動(dòng)彈性,為您提供統(tǒng)一的 Serverless 應(yīng)用編程模型。
架構(gòu)
接下來我們通過一個(gè)彈幕服務(wù) demo 進(jìn)行介紹。該 demo 主要包括 HomePage、事件驅(qū)動(dòng)、消息處理這 3 部分。
HomePage 主要用于發(fā)送和接收彈幕。事件驅(qū)動(dòng)用來接收事件,并進(jìn)行事件過濾、流轉(zhuǎn)。消息處理,用于處理彈幕消息。其中 HomePage、消息處理通過 Knative Serving 部署分別到 FC、ECI,事件驅(qū)動(dòng)通過 Knative Eventing 部署到ECI。
彈幕服務(wù) demo 主要流程如圖,用戶通過前端發(fā)送彈幕消息到 HomePage,HomePage 接著將彈幕發(fā)送到 Kafka,事件驅(qū)動(dòng)接收彈幕消息,然后路由到消息處理進(jìn)行加工,待彈幕加工完之后,將彈幕結(jié)果發(fā)送到表格存儲(chǔ)中,最后前端獲取彈幕結(jié)果在頁面展示。
?接下來我們開始部署該彈幕服務(wù) demo, 操作包括以下內(nèi)容:
首先部署消息處理,然后部署事件驅(qū)動(dòng),接著部署 HomePage,待部署完成之后進(jìn)行彈幕服務(wù)訪問
第一步:部署消息處理
該服務(wù)用于接收事件驅(qū)動(dòng)發(fā)送的彈幕請(qǐng)求,并根據(jù)請(qǐng)求數(shù)進(jìn)行自動(dòng)擴(kuò)縮容,待彈幕消息處理完成之后將結(jié)果發(fā)送到表格存儲(chǔ)。部署之前,我們先確認(rèn)當(dāng)前無工作負(fù)載,以便觀察部署之后的結(jié)果。
- 選擇 ask 集群
- 在集群管理頁左側(cè)導(dǎo)航欄中,選擇工作負(fù)載 > 無狀態(tài)。選擇 default命名空間,確認(rèn)當(dāng)前無工作負(fù)載
接著通過 Knative 把彈消息處理部署到 ECI 類型工作負(fù)載。這里我們通過yaml的方式進(jìn)行部署,yaml內(nèi)容如下:
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-uf636kjjx8xr4e75npexlabels:danmu.role: "manager"spec:containerConcurrency: 2serviceAccountName: barrage-install-sacontainers:- args:- /managerenv:- name: OTS_ENDPOINTvalue: https://barrage.cn-hangzhou.tablestore.aliyuncs.com- name: TABLE_NAMEvalue: barrage- name: OTS_INSTANCENAMEvalue: barrage- name: OTS_KEYIDvalue: xxx- name: OTS_SECRETvalue: xxx- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: ROLEvalue: manager- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: TRACE_NAMEvalue: "process"- name: PARENT_SPANvalue: "barrage-sender"- name: SUB_SPANvalue: "process"- name: TRACINGvalue: "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-20210618215458name: user-containerports:- containerPort: 8000name: http1主要參數(shù)說明:
- minScale和maxScale:表示服務(wù)配置的最小和最大Pod數(shù)量
- containerConcurrency:表示配置的Pod最大請(qǐng)求并發(fā)數(shù)
- OTS_ENDPOINT:表示配置的表格存儲(chǔ)訪問地址
- TRACING:表示配置的調(diào)用連地址
那么接下來我們部署該服務(wù)。
- 在集群管理頁左側(cè)導(dǎo)航欄中,選擇應(yīng)用 > Knative。
- 在服務(wù)管理頁簽右上角,單擊【使用模版創(chuàng)建】。選擇default 命名空間,將上面的 yaml 內(nèi)容粘貼到模版,點(diǎn)擊創(chuàng)建。
第二步:部署事件驅(qū)動(dòng)
事件驅(qū)動(dòng)用于接收事件并進(jìn)行事件流過濾、流轉(zhuǎn)。這里我們使用 Kafka 事件源作為事件驅(qū)動(dòng),用于從 Kafka 接收彈幕消息,然后把彈幕路由到消息處理。我們通過yaml的方式進(jìn)行部署, yaml內(nèi)容如下:
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: barragenamespace: default spec:bootstrapServers: 192.168.42.205:9092,192.168.42.204:9092,192.168.42.203:9092consumerGroup: barrage-info-consumersink:ref:apiVersion: serving.knative.dev/v1kind: Servicename: test-barrage-processnamespace: defaulttopics: barrage-info主要參數(shù)說明:
- kafka配置包括:kafka服務(wù)地址 ,彈幕消息 topics 以及消費(fèi)組 consumerGroup
- 路由的目標(biāo)消息處理:test-barrage-process
那么接下來我們部署該服務(wù)。
- 在集群管理頁左側(cè)導(dǎo)航欄中,選擇應(yīng)用 > Knative。
- 在服務(wù)管理頁簽右上角,單擊【使用模版創(chuàng)建】。選擇default 命名空間,將上面的 yaml 內(nèi)容粘貼到模版,點(diǎn)擊創(chuàng)建。
以上消息處理和事件驅(qū)動(dòng)都已部署完成,我們來驗(yàn)證一下。
(在集群管理頁左側(cè)導(dǎo)航欄中,選擇工作負(fù)載 > 容器組)
在容器組中,可以看到消息處理以及 Kafka 事件源實(shí)例都已 running
第三步:部署HomePage
該服務(wù)用于接收前端彈幕消息,并將彈幕消息發(fā)送到 Kafka,同時(shí)從表格存儲(chǔ)中接收彈幕結(jié)果。這里通過 Knative 函數(shù)方式部署之后,會(huì)自動(dòng)在FC中創(chuàng)建服務(wù)、函數(shù)、自定義域名。操作之前我們先確認(rèn)FC中無彈幕服務(wù)、函數(shù)以及自定義域名。
- 登錄FC控制臺(tái)
- 在頂部菜單欄,選擇地域(上海)。
打開服務(wù)及函數(shù)頁面,確認(rèn)無彈幕服務(wù)及函數(shù)
- 在左側(cè)導(dǎo)航欄中,單擊自定義域名,確認(rèn)無域名信息。
打開自定義域名頁面,確認(rèn)無自定義域名
接下來我們通過 Knative 把HomePage部署到FC類型工作負(fù)載。這里我們通過yaml的方式進(jìn)行部署, yaml內(nèi)容如下:
apiVersion: serving.knative.dev/v1 kind: Service metadata:name: demo-barrageannotations: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-20210618214527env:- name: OTS_ENDPOINTvalue: https://barrage.cn-hangzhou.ots.aliyuncs.com- name: TABLE_NAMEvalue: barrage- name: OTS_INSTANCENAMEvalue: barrage- name: OTS_KEYIDvalue: xxx- name: OTS_SECRETvalue: xxx- name: KAFKA_SERVERvalue: "106.15.11.179:9093,47.100.131.71:9093,47.102.44.91:9093"- name: KAFKA_USERvalue: "alikafka_pre-cn-xxx"- name: KAFKA_PWDvalue: "xxx"- name: KAFKA_TOPICvalue: "barrage-info"- name: TRACINGvalue: "http://tracing-analysis-dc-sh.aliyuncs.com/adapt_g2it2kg78n@5cf06035aec2eb9_g2it2kg78n@53df7ad2afe8301/api/traces"- name: TRACE_NAME1value: "sender"- name: TRACE_NAME2value: "receiver"- name: TRACE_NAME3value: "result"- name: PARENT_SPANvalue: "barrage-sender"- name: SUB_SPAN1value: "sender"- name: SUB_SPAN2value: "result"主要參數(shù)說明:
- fc 相關(guān)參數(shù)配置包括: 部署fc類型的工作負(fù)載、通過鏡像方式部署,并指定訪問域名為: barrage.demo.knative.top
- 配置表格存儲(chǔ)訪問地址: OTS_ENDPOINT
- kafka 相關(guān)參數(shù)配置:kafka服務(wù)地址、彈幕消息 topic
- 調(diào)用連地址配置:TRACING
那么我們來部署該服務(wù)。
- 登錄容器服務(wù)管理控制臺(tái)。
- 在集群管理頁左側(cè)導(dǎo)航欄中,選擇應(yīng)用?>?Knative。
- 在服務(wù)管理頁簽右上角,單擊【使用模版創(chuàng)建】。選擇default 命名空間,將上面的 yaml 內(nèi)容粘貼到模版,點(diǎn)擊創(chuàng)建。
部署完成之后,我們?cè)诤瘮?shù)計(jì)算控制臺(tái)驗(yàn)證一下。
- 登錄函數(shù)計(jì)算控制臺(tái)。
- 在頂部菜單欄,選擇地域。
- 在左側(cè)導(dǎo)航欄中,單擊服務(wù)及函數(shù),選擇可以看到彈幕服務(wù)已經(jīng)部署完成
打開服務(wù)及函數(shù)頁面,可以看到HomePage已經(jīng)部署完成。
- 在左側(cè)導(dǎo)航欄中,單擊自定義域名。
打開自定義域名頁面,可以看到自動(dòng)創(chuàng)建出來了我們配置的域名。
第四步:服務(wù)訪問
以上服務(wù)都已部署完成,接著我們通過自定義域名進(jìn)行服務(wù)訪問。http://barrage.demo.knative.top
接下來我們發(fā)送彈幕,這里可以自定義設(shè)置需要發(fā)送的彈幕消息,并發(fā)數(shù)以及持續(xù)時(shí)間。這里我們使用默認(rèn)配置進(jìn)行發(fā)送。
設(shè)置Message、Concurrency以及Duration,點(diǎn)擊【Send】
?我們可以看到不斷有彈幕消息展示出來。
小結(jié)
阿里云 Knative 在 Serverless Kubernetes 之上,提供了面向容器+函數(shù)的統(tǒng)一編程模型,給你帶來統(tǒng)一的Serverless 應(yīng)用編程模型。歡迎有興趣的同學(xué)一起交流。
原文鏈接
本文為阿里云原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。?
總結(jié)
以上是生活随笔為你收集整理的带你体验云原生场景下 Serverless 应用编程模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 万物智联时代的终端智能「管家」 重磅升级
- 下一篇: kubernetes pv-contro