1. 程式人生 > 實用技巧 >4 個場景揭祕,如何低成本讓容器化應用 Serverless 化?

4 個場景揭祕,如何低成本讓容器化應用 Serverless 化?

作者 | changshuai

FaaS 的門檻

Serverless 形態的雲服務幫助開發者承擔了大量複雜的擴縮容、運維、容量規劃、雲產品打通整合等責任,使得開發者可以專注業務邏輯、提高交付速度 (Time-to-market) ,持續優化成本。Function-as-a-Service (FaaS) 作為雲上最早也是應用最廣泛的 Serverless 計算形態,在幾年的時間內吸引了大批開發者,逐漸建立了 Serverless 優先的選型邏輯。然而從傳統應用遷移到 FaaS 在開發者體驗上還面臨諸多挑戰:

  1. 環境不統一:各廠商定義的交付物格式,執行環境相容性、豐富度都不盡相同,需要開發者適配,甚至重新編譯;

  2. 學習成本:打包依賴庫、構建成壓縮程式碼包和熟悉的開發部署方式不同;

  3. 服務限制:如程式碼包限制在百 MB 級別,迫使交付物程式碼依賴分離,加大管理和釋出難度;

  4. 交付物缺乏版本管理:格式不標準,最佳實踐不統一,需要開發者自行負責;

  5. 生態不成熟:缺少流行開源工具(如 CI/CD 流水線)的支援和整合。

另一方面,容器在可移植性和交付敏捷性上實現了顛覆式創新。圍繞容器的生態沉澱非常豐富且成熟,被廣泛接受使用,應用容器化正在快速成為開發和部署的事實標準。然而容器本身並沒有減輕運維、擴縮容、閒置成本、和雲服務整合等難題。

函式計算支援容器映象

阿里雲 FaaS 函式計算支援容器映象作為函式交付物,將容器優秀的開發、部署、生態(上線前)結合函式計算自身免運維、零閒置成本、雲服務整合等特性(上線後),全面升級開發者體驗:

  • 簡化應用 Serverless 化:無需修改程式碼或是重新編譯二進位制、共享物件(*.so),本地除錯,保持開發和線上環境一致;

  • 更大函式程式碼限制:解壓前映象最大支援 1 GB(相比程式碼包最大解壓前 50MB),避免程式碼和依賴分離,簡化分發和部署;

  • 容器映象分層快取:增量程式碼上傳和拉取,提高開發效率和降低冷啟動延遲;

  • 映象分享、複用:邏輯可以移植、減少重複開發建設;

  • 混合部署:同一應用 Serverfull (ECS, 容器 ACK)、Serverless (FC, ASK, SAE),不同應用混合部署或同一應用不同服務間切流,達到效能一致、資源剛性交付、快速擴容、運維最小化的平衡;

  • CI/CD:持續構建、整合測試、程式碼上傳、儲存和標準的版本管理,豐富的開源生態 CI/CD 工具可以複用。

典型客戶場景

1. 事件驅動音視訊處理

音視訊處理有流量波動較大、對計算資源彈性要求高、監聽視訊上傳事件以及依賴工作流和佇列等服務的特性,使得 FaaS 成為自建音視訊業務上雲的首選。然而這類場景中最常用的軟體 ffmpeg 往往需要定製編譯滿足不同的需求。編譯的二進位制依賴編譯環境中的共享物件(*.so)和 glibc 等庫,與 FaaS 執行環境不相容無法執行。重新編譯不僅帶來了額外工作,不同的依賴和版本也給業務穩定性帶來了挑戰。

如下圖示例,使用已有 Dockerfile 將轉碼邏輯以及相關依賴保持現有的安裝方式和完全隔離的容器沙箱執行環境,極大降低遷移成本,穩定性風險和 FaaS 的開發部署學習成本。

2. Serverless AI/ML 模型預測、推理 serving

AI/ML 推理預測服務同樣可以享受 FaaS 免運維、自動伸縮、低成本的好處。然而社群流行的框架如 TensorFlow 都預設以容器映象的方式分享和複用。不僅官方提供了完整的版本覆蓋,基於官方映象的社群生態也非常活躍。

在離線模型訓練階段以容器映象部署在 ECS 或 ACK/ASK GPU 叢集。在服務推理/預測(serving inference/prediction)階段,CPU 往往是價效比更高的選擇。Serving 的特點是請求量驅動,既需要能快速響應突發(burst)流量,又要在波谷週期釋放資源,甚至是縮容至0節省成本。而這些需求天然就是函式計算所擅長的。

在沒有容器映象支援之前,想要將一個 TensoflowFlow serving 的示例部署在函式計算上並不容易。TensorFlow 本身的庫大小遠超過程式碼包 50MB 的限制,將依賴打包進 NAS 可以繞過這個問題,然而卻增大了上手和遷移的難度。不規範的依賴和版本管理也為變更引入穩定性風險。而使用容器映象以及函式計算 HTTP server 的程式設計模型,簡單的幾行 Dockerfile 就可以在 FC 跑起來 Tensorflow Serving 的示例:

函式計算支援容器映象幫助 AI/ML 場景平滑地混合部署容器和函式,統一 CICD 工具、流程和最佳實踐。函式計算免運維、高併發、百毫秒級別的例項擴容和 100% 資源利用率進一步優化了服務質量和成本。

3. 傳統 Web 單體 HTTP 應用 Serverless 演進

傳統 Web 單體 (monolithic) 應用現代化有三個主要的訴求:責任拆分、減輕運維壓力(資源規劃、系統升級、安全補丁等運維負擔)以及成本優化。雖然採用職責單一的函式是一種最佳實踐,但是進行職責拆分往往需要更長時間的設計和重構。藉助函式計算的映象支援能力,單體應用可以很容易的遷移至 FaaS 服務以滿足免運維,彈性水平擴充套件和100%成本效率的訴求。

傳統 Web 應用由於歷史原因或者業務複雜度,執行環境(容器映象)和業務邏輯往往高度耦合且解耦代價較高。為了 Serverless 化改造有時不得不升級作業系統及依賴庫版本,在 FaaS 廠商提供的環境中重新編譯。遷移至 Serverless 架構有時間成本和穩定性風險。函式計算對容器映象的支援幫助傳統容器化 Web 應用無改造,更快地享受 Serverless 的價值,將時間和精力專注於業務邏輯創新和迭代而非重複枯燥的環境、依賴版本管理、升級維護和容量規劃和伸縮。

4. 雲上雲下,跨雲廠商混合部署

企業上雲的節奏在不斷加快,然而由於業務特性,私有云和公共雲混合的執行方式將是未來相當長一段時間內作為常態。企業甚至需要多雲廠商來保證遷移、容災、資源剛性交付的需求。容器映象是雲上、雲下的軟體交付物統一的預設選擇。

函式計算自定義 runtime 選擇 HTTP server 標準的互動方式,函式程式碼程式設計方式不與廠商繫結,減輕企業對雲廠商鎖定(vendor-lockin)的顧慮,在雲上可以執行的函式,在雲下甚至其他雲廠商同樣可以作為獨立的 HTTP Web 應用單獨部署,服務請求。容器打包的函式可以執行在其他雲服務的容器服務或 IaaS 自建服務,實現多雲的容災、彈性資源保障。

冷啟動最佳實踐

  • 容器映象地址推薦使用與函式計算同地域的 VPC 映象地址,例如 registry-vpc.cn-hangzhou.aliyuncs.com/fc-demo/helloworld:v1beta1, 以獲得最優的映象拉取延時和穩定性;
  • 映象最小化,使用類似 docker-slim 工具僅儲存必要的依賴和程式碼,避免不需要的文件、資料或其他檔案造成的額外延遲;
  • 在資源允許和執行緒安全的情況下,搭配單例項多併發一同使用,可避免不必要的冷啟動,同時降低成本;
  • 容器映象配合預留例項一起使用,消除冷啟動。

DevOps/GitOps 最佳實踐

容器映象的支援標準化了構建步驟和函式交付產物,讓複用 CI/CD 工具成為可能。函式計算與阿里云云效 DevOps 服務整合,推出了 CI/CD 流水線。

如下圖所示,當有新的程式碼被 push 進入程式碼倉庫(Github/Gitlab) master 分支, 構建流水線任務被開啟,按照程式碼中指定的 Dockerfile, 容器映象會被構建並推送至阿里雲容器映象服務。流水線的最後一個步驟會部署釋出新版本的函式,完成一次自動化的釋出。

除了雲效 DevOps 完整自動化的持續整合交付體驗,阿里雲容器映象服務和自建開源 CICD 流水線也同樣可以用下圖展示的方式自動化函式釋出。函式計算髮布方式的標準化使得企業可以用統一的工具持續交付多個不同的服務,降低開發運維人員對部署工具的學習成本,自動化部署提高成功率和交付速度 (time-to-market)。

和 Custom Runtime 的異同

函式計算在 2019 年已經推出了自定義執行時 Custom runtime,那麼這次釋出的自定義容器(custom-container)和已有的執行時有和異同呢?

  • 相同的程式設計模型和函式計算系統的互動方式:完全相同的 HTTP server 協議,已有的 custom runtime 函式可以直接移植到環境相容的自定義容器環境中,不需要修改程式碼;

  • 兩個 runtime 有不同的適用場景和取捨:

  1. 對於非容器化的應用,您可以持續使用 custom runtime;

  2. 對於冷啟動延遲容忍度較低的場景,推薦您使用 custom runtime 節省映象拉取時間;

  3. 對於非同步離線且已經容器化的任務(job 型別),推薦您使用 cutome-container runtime;

  4. 使用函式計算預留例項,且部署環境和業務邏輯耦合緊密的應用可以優先考慮使用 custom-container runtime。

未來規劃

隨著容器逐漸成為應用交付部署的標準方式,FaaS 會和容器生態做更緊密的融合,幫助容器化的應用以更低的成本 Serverless 化,包括周邊配套生態例如宣告式的部署方式的融合,同 K8s 相似的應用抽象,雲原生可觀測性軟體整合。基於容器映象拉取加速,讓函式計算能兼顧可移植和快速啟動的效能。

容器技術和 Serverless 的初心都是要幫助使用者更快地交付(time-to-market)和持續優化成本,消除資源閒置產生的浪費,增加企業競爭力。

最終雲原生的兩大技術領域:Serverless 和容器技術的聯絡將會變得更加緊密,開發部署運維差異不斷縮小,讓開發者幾乎不需要修改業務邏輯即能為不同的工作負載選擇合適的技術方案,用開放、標準、統一的雲原生技術持續創新,為客戶創造更多價值。

課程推薦

為了更多開發者能夠享受到 Serverless 帶來的紅利,這一次,我們集結了 10+ 位阿里巴巴 Serverless 領域技術專家,打造出最適合開發者入門的 Serverless 公開課,讓你即學即用,輕鬆擁抱雲端計算的新正規化——Serverless。

點選即可免費觀看課程:https://developer.aliyun.com/learning/roadmap/serverless