近日,雲+社區技術沙龍「高效智能運維」圓滿落幕。本期沙龍圍繞運維展開了一場技術盛宴,從AIOps、Serverless DevOps、藍鯨PaaS平臺、K8S等分享關於業務運維的技術實踐乾貨,同時帶來騰訊海量業務自研上雲實踐,推進傳統運維向雲運維轉型。本文是孔令飛老師關於騰訊雲 Serverless 的運維能力,Serverless 對運維的影響,微信小程序相冊的運維案例等內容的分享。本文首發於「雲加社區」公衆號。web
在開始講以前,先來看下,在互聯網時代咱們的核心訴求是什麼?——咱們的核心訴求是應用,可以提供業務能力的應用。正則表達式
以下圖所示,爲了能讓應用對外提供服務,咱們還須要能在某個地方部署應用,須要一系列的系統資源,好比計算、網絡、存儲、數據庫等;等應用部署起來以後,咱們還要更新應用、監控應用的運行狀態等,這幾個維度基本涵蓋了咱們的全部需求。算法
爲了知足這些需求,在應用層面,咱們引入了軟件架構,好比單體架構和微服務開發框架。藉助 Doker、KVM 等來提供系統資源。藉助 EFK、Promethus、Coding 來實現應用生命週期管理。隨着這些組件的引入,咱們須要花費人力來對這些資源進行運維。底層的系統資源咱們須要系統運維、雖然 EFK,Promethus 組件能夠提供業務運維能力,但咱們也須要對這些平臺進行運維。其實咱們真正須要的運維是業務運維。sql
那麼有沒有一種手段,讓咱們儘量少或者不進行系統系統和平臺運維呢?答案是有的,咱們能夠採用 Serverless 的技術方案。本次分享,我會藉助騰訊雲 Serverless 產品,來講明 Serverless 技術是如何淡化用戶的平臺運維和系統運維的。docker
本次分享將從如下幾方面講解:數據庫
什麼是 Serverless小程序
Serverless 的業務運維能力後端
Serverless 與 IaaS 層運維能力對比微信小程序
微信小程序相冊是如何在 Serverless 技術下作運維api
Serverless:雲計算新趨勢
在講什麼是 Serverless 以前,我想先給你們展現下 Serverless 目前有多火。
最近幾年微服務和 k8s 很火,這是一張 Serverless 跟他們的熱度對比圖,藍色的曲線是 Serverless 的熱度曲線圖,能夠看到從 2016 年開始,Serverless 的熱度是要大於微服務和 k8s 的。右邊這張圖展現了 Serverless 產品化落地狀況。,Serverless 最初是在 2010 年被提出,2014 年 aws 推出了 lambda 服務,把 Serverless 產品化,並收到了很好的效果,微軟、google 和 IBM 看到後,也分別在 2016 年推出了本身的 Serverless 產品。阿里雲和騰訊雲也分別在 2017 年推出了本身的 Serverless 產品。
2. 什麼是 Serverless?
這裏介紹下什麼是 Serverless。這是一張邏輯架構圖,最上面是咱們的 application,下面是系統資源。咱們能夠經過虛擬機、容器、數據庫、存儲等來提供系統資源。同時,咱們須要對這些系統資源進行維護,好比:資源申請、環境搭建、容災、擴縮容等。Serverless 是什麼呢,Serverless 就是把底層的這些資源以及對這些資源的運維都交給雲廠商來維護、這些資源對業務來講是黑盒的,業務只須要關注本身業務邏輯的開發便可。這種架構思想和方法就是 Serverless。
Serverless 直譯過來叫無服務器,實際上他不是真的不須要服務器,只不過服務器由雲廠商來維護,Serverless 是一種軟件系統架構思想和方法,不是軟件框架、類庫或者工具,它的核心思想:無須關注底層資源,好比:CPU、內存和數據庫等,只需關注業務開發。
咱們把系統資源進行 Serverless 化,這些系統資源大概分爲 2 大類,一種是 CaaS:compute as a service 用來提供計算能力,一種是 BaaS:backend as a service,至關於把第三方組件也 Serverless 化,用戶也不用去關注第三方組建的搭建和運維,只須要調用 api 去使用便可。因此 Serverless 大概能夠理解爲:CaaS + BaaS。
3. Physical Machine vs. Virtaul Machine vs. Container vs. Serverless
這裏咱們經過對比來看下 Serverless 所能提供的價值。在軟件研發領域,咱們繞不開的 2 個環節是軟件的部署和運維。若是咱們要上線一個業務,在物理機階段,咱們要去購買物理服務器,而後還可能須要去建本身的機房,安裝製冷設備,招聘運維人員,而後在上面搭建一系列的基礎設施,好比:虛擬化,操做系統,容器等,有不少工做要去作。到了虛擬機這一階段,雲廠商維護了硬件和虛擬化這 2 個基礎設施,到了容器這一階段雲廠商又維護了 OS、容器和 Runtime,能夠看到用戶須要作的運維工做愈來愈少。而後到了 Serverless 這個階段,用戶只須要關注 Function,也就是隻須要關注本身的業務邏輯。能夠看到隨着階段的演進用戶須要關注的點愈來愈少,愈來愈聚焦於本身的業務邏輯。因此在 物理機階段咱們開發一個業務可能須要 8 我的,在 Serverless 階段,咱們只須要 2 我的,節省了不少人力,咱們能夠把節省的人力投入到業務研發這塊兒,提升產品的迭代速度,進而提升產品的競爭力。
由這張圖咱們也能夠看到,過去十多年雲計算實際上是一個「去基礎架構」的過程。這個過程可讓用戶聚焦於本身真正須要的業務開發上,而不是底層的計算資源上。Serverless 符合雲計算髮展的方向,這種特有的模式使 Serverless 存在潛在的巨大價值。用一張圖來形容下,就是 Serverless 能夠認爲是雲計算的終極形態。
4. Serverless 運行示例
前面說的可能比較抽象這裏,來舉個在騰訊雲 Serverless 平臺上運行函數的例子。
若是一個用戶想用雲函數,首先要在本地作業務開發,當研發把函數編碼完成後經過咱們提供的 VSCode 插件能夠很方便的把代碼部署到咱們的平臺上,函數裏面可能會調用第三方的 BaaS 服務。接下來,會將該函數綁定各類觸發器,好比:API 網關、Ckafka、COS 等。而後咱們經過調用 API 網關、往 COS 上傳文件等方式,來產生觸發事件,進而觸發綁定的函數,執行業務邏輯。當請求來的時候,平臺會根據請求量的大小,去自動或縮容後端的 Function 實例。能夠看到整個過程用戶是不須要作任何系統層面的運維工做。
5. Serverless 實戰
這裏經過一個 video 來看下如何建立和執行雲函數。
接下來介紹下,騰訊雲 Serverless 平臺是如何提供開箱即用的業務運維能力。主要經過 4 個方面來介紹:工具建設、DevOps、日誌、監控告警。
騰訊雲 Serverless 提供了多個工具來協助研發進行開發和調試、幫助運維更容易的將函數部署上線。國內用戶用的比較多的 IDE 是 VS CODE,爲此,咱們開發了 VS CODE 插件,能夠方便開發進行函數的開發和部署。咱們也提供 web 版本的 IDE,能夠直接在網頁上作開發,咱們還提供命令行工具,可使開發直接在 Linux 終端進行開發和運維工做,同時基於命令行工具,還能夠對接各類 DevOps 平臺或者作一些自動化的工做。
除了開發者工具,咱們也提供完善的 DevOps 支持,從最佳實戰,到工做流,到工具鏈,以及產品打通,咱們都提供了不少方案和支持。
好比工做流這裏,咱們支持編碼、構建、打包、部署、測試和發佈等一系列流程。在工具這裏,咱們提供了:CLI、應用模型等。產品這裏,咱們打通了不少產品供用戶很方便的跟這些產品進行交互,利用這些產品提供的能力,好比: Git 倉庫,API 網關 等。這個是 DevOps 支持。
這是經過 Coding DevOps 來管理 Serverless 應用 CICD 的幾個截圖。經過 Coding 的持續集成,能夠記錄每個函數應用的構建日誌,測試日誌。Coding 的製品庫能夠對函數鏡像作集中存儲以及作歷史版本追溯。最後運維人員能夠經過 Coding 部署將函數部署到不一樣的環境中。
日誌這裏咱們支持 2 種日誌查詢方式。一種是能夠直接在咱們的 Serverless 平臺進行查詢,可以查看函數調用成功與否,各階段的調用時間,以及用戶打印在日誌或者標準輸出的日誌,支持用戶按 RequestId 去搜索日誌。另外咱們還支持用戶將日誌輸出到騰訊雲日誌服務系統,將日誌持久化存儲,在日誌服務系統中,用戶能夠根據正則表達式來搜索日誌,也能夠自定義檢索規則,方便下次檢索,還能夠基於日誌進行告警。
咱們提供 3 個維度的監控。提供本月調用次數、本月資源量、本月出流量的監控。提供按地域劃分的調用次數、運行時間、錯誤次數、併發個數、受限次數監控,這些監控指標都是用戶很關心的指標。另外咱們也提供函數級別的監控:調用次數、資源超過限制次數、函數執行超時時間、內存超過限制次數等監控指標。全部這些監控指標均可以在騰訊雲監控系統上配置告警,提供業務級別的監控能力。
這裏來看下 Serverless 提供的系統運維能力。Serverless 底層會爲每一個用戶建立一個 mvm,mvm 是輕量級的虛擬機,提供最強的安全隔離,輕量化虛擬機能夠作到毫秒級啓動,延時很是低。在 mvm 中建立 docker 容器,而後將用戶的函數調度到 docker 容器中執行,經過 docker 進行進程級別的隔離同時經過容器來分配更細力度的資源,從而提升系統資源利用率,下降成本。同時在函數執行時會有一套調度算法,能夠實時的根據 CPU、內存、網絡 IO、請求量指標來進行擴容。知足用戶業務高峯期的請求需求。當用戶請求量降下來後,也會定時的進行縮容,釋放資源,減小成本。全部這些能力都是雲廠商來運維,不須要用戶運維,用戶只須要關注本身的業務邏輯便可。也就是說用戶能夠省去系統運維這方面的工做,只須要關注業務運維便可。
這裏經過跟 IaaS 層提供的運維能力進行對比,來更直觀的體驗一下 Serverless 所帶來的運維效率的提高。 運維能力對比,主要按 2 個維度來對比: 1. 基本運維能力 2. 核心運維能力
先說說傳統的 IaaS 應用,運維是如何開展的。首先是資源建立的階段,這一階段通常開始於開發部門對運維部門發起新應用的上線申請。收到申請後,運維部門通常會,根據需求文檔,在各個可用區內,建立一批虛擬機,而後配置好網絡,防火牆和路由規則。因爲跨部門,就涉及排期的問題,速度並不會很快。
集羣建立好後,再安裝開發部門聲明的軟件好比運行時 JDK,服務器 Tomcat。而後運維部門會安裝一些運維軟件好比監控工具 Prometheus,日誌工具 logstash,或者一些其餘的軟件好比安全軟件,全鏈路追蹤軟件。
機器安裝好後,就須要配置 DevOps 流程線。把機器加入到流水線的各個環境中,好比開發環境,預發環境,若是開發者比較多可能還會有第二套開發環境和第二套預發環境。最後就是生產環境,運維人員,爲了高可用和容錯,事先會將生產環境分爲幾個不一樣的小集羣,分別部署在不一樣的可用區內。至此在運維人員的努力下,快的可能須要幾天,好比企業內部有自動化運維平臺。慢的可能須要幾個星期,所有手動配置,才能把全部的環境給搭建起來。而且 CICD 的工具的部署及維護也須要運維部門花費大量的人力,好比,Jenkins 集羣,GitLab 服務器,Chef 服務器等。
而且環境的驗收來來回回又可能再花上幾天。因此整個流程下來可能須要好幾周時間。最後纔會進入開發流程。
咱們來看下 Serverless 技術,是如何提供系統資源的,在介紹 Serverless 的時候咱們說到,Serverless 底層的系統資源不須要用戶去申請和運維,因此就不須要資源的申請和軟件的按照這個階段,同時 Serverless 平臺提供了開箱便可用的 DevOps 功能。在 Serverless 下,用戶只須要進行最後一步的開發便可。
能夠看到在 Serverless 下,咱們不須要建立任何資源,由於無需運維因此能夠提升研發效率進而提升產品的競爭力。
在虛擬機時代,部署一個業務,須要運維介入,同時須要配置操做系統環境、而後再對業務組件進行配置。同時業務運維還須要本身實現藍綠髮布和回滾的邏輯,比較複雜。
在容器時代、部署一個業務也須要運維介入,同時運維須要編寫複雜的 yaml 文件,對運維人員有了更多的技能要求。每次部署的時候,還須要修改 yaml 文件,而後執行一堆命令部署業務,雖然要比虛擬機時代要簡單不少,可是仍是有必定的工做量。
在 Serverless 平臺上,只須要開發上傳代碼,便可完成部署。同時,Serverless 平臺已經實現了藍綠髮布和回滾的功能,不須要研發去關注這塊兒,把業務部署的複雜度降到最低。
在傳統的應用中,絕大多數的監控都依賴於運維人員來配置,包括網絡監控,系統監控,應用監控,和業務監控。可是在 Serverless 應用中,首先應用監控,系統監控,網絡監控裏面的絕大部分監控,都不須要再關注了,而且平臺不會將其暴露出來,暴露出來的會是些更高級別的指標,好比調用次數,運行時間,運行內存,併發執行數,受限次數等。可是業務監控仍是須要自行收集,經過撈日誌的方式。
傳統的應用故障排查的手段通常都很是豐富,好比全鏈路追蹤,各種監控等。可是這僅僅限於大公司擁有比較強的技術實力,由於這些故障排查工具集的搭建和維護也是一個耗費人力的過程。在小公司內通常一般只能經過日誌和走查代碼來排查。
騰訊雲 Serverless 平臺提供了很是多的故障排查工具。好比全鏈路追蹤功能,各個維度的監控,以及專業的日誌查詢功能。因此 Serverless 時代故障排查工具也不須要運維人員來搭建了。
彈性伸縮是運維一個核心的能力,彈性伸縮你們通常關注的是擴縮時間。在虛擬機階段,若是資源不夠了,須要申請虛擬機,申請完以後須要登錄虛擬機作一些系統級別的配置和部署,通常是小時級。在容器階段,藉助於k8s的彈性擴縮能力,但 k8s 的彈性擴縮容策略通常也只能作到分鐘級。但在 Serverless 這個階段,能夠作到實時的毫秒級的擴縮容。
故障恢復是另外一個運維須要關注的點。在虛擬機階段,故障恢復邏輯須要運維實現,若是運維沒有一些故障恢復邏輯,出故障後須要運維介入,若是運維手工介入響應會很慢,同時也可能由於認爲的一些失誤致使業務異常,有風險。在容器階段,藉助 k8s 的自愈能力,能夠實現秒級的故障恢復,可是在 Serverless 階段,由於每次請求都是一個新的實例,因此就不存在故障恢復這一工做。
性能調優一直就是個比較高級的問題,須要豐富經驗。傳統應用的調優通常涉及,虛擬機參數,數據庫參數,網絡參數,Linux 參數,運行時參數,服務器參數。可是因爲 Serverless 應用的特殊性,此類底層參數的調優由雲廠商來進行調優。用戶只須要進行代碼級別的性能調優便可。
傳統的 IaaS 應用因爲技術棧複雜,靈活度很大因此安全須要保障的領域也很是多。好比主機和網絡安全,應用安全,訪問控制管理,終端安全,數據安全等都須要運維安全人員來關注。 大公司通常會爲此保持一個大的安所有門來保障集團的安全。可是小公司若是也要維持這樣一個部門,業務就會被極大的拖累,以至於小公司業務的安全很是難保障。好比有些數據庫不改密碼,或者暴露公網 IP 等,小公司不可能有精力去對這些產品進行充分調研。
可是 Serverless 下,底層資源由雲廠商來進行維護,安全性由雲廠商提供專業的保障,好比,騰訊雲 Serverless 平臺會提供網絡隔離,執行環境與管理環境隔離,函數資源限制,文件系統目錄限制,系統調用也會有限制。能夠在提升安全保障的同時,節省這一部分人力。運維安全就主要用戶代碼的安全維護了。
開發流程
這裏舉一個微信小程序相冊的例子,看一下如何在 Serverless 下去作運維,若是沒有 Serverless 的話,咱們想開發一個相冊小程序,首先要去組件 Team 可能須要N周,而後要註冊各類帳號,須要幾天。接下來咱們要作一些跟運維相關的工做,好比:購買域名、購買 CVM、域名備案等,購買完資源以後還須要安裝 Nginx、安裝 Mysql、安裝監控和日誌系統等,這塊兒大概須要 3 周時間,甚至更多時間。接下來纔會進入到真正的業務開發階段。因此像若是開發一個小程序的話,通常是須要一兩個月的時間。
最終上線後,我須要維護…
當咱們把小程序開發完成後,還面臨各類複雜的運維工做。好比要運維一大堆服務器相關的組件、測試複雜、還要花費不少人力保障安全和穩定性。
只關注核心業務
這張圖是 Serverless 下的解決方案,能夠看到,雲廠商將資源申請和相關組件的部署都 Serverless 化了,這部分運維工做由雲廠商來維護,不須要用戶關心,用戶只須要關注核心業務邏輯開發和數據庫相關的 CRUD 便可。大大簡化了開發流程和運維工做量。
微信小程序相冊在 Serverless 解決方案下,一個同事只花了 2 周時間便完成了核心業務邏輯的開發。
孔令飛,騰訊雲高級架構師,負責騰訊云云函數的產品拓展工做,協助用戶一塊兒搭建基於Serverless的系統架構,和產品經理一塊兒完成雲函數平臺的規劃建設。以前在Red Hat和聯想作過虛擬化相關的測試和研發工做,有過大規模容器集羣的研發和架構經驗,對虛擬化、容器等雲計算相關技術有深層次的理解。