完美日記創立于2017年,這家公司上線不到兩年即成為天貓彩妝銷冠,2019年成為11年來第一個登上天貓雙十一彩妝榜首的國貨品牌,包攬天貓2019全年彩妝銷冠;2020年4月成為首個亮相天貓超級品牌日的國貨彩妝品牌,同時勇破彩妝品牌銷售紀錄。另外,完美日記已在全國各地開設了100家線下店,計劃至2022年底開店超600家。截至2020年4月,品牌SKU超過700個,全網使用者粉絲數量超過2500萬,月曝光量10億+。
“輕研發、重營銷”是流量思維企業的通病,為了“打造網際網路時代新的美妝集團”,在依靠流量和營銷快速占據市場的同時,完美日記也在不斷夯實其技術底座。今年4月,完美日記已完成IT系統全面容器化,保證了每一次大促活動的系統穩定性和可用性,同時利用阿裡雲ACK容器快速彈性擴縮容,節約伺服器成本50%以上。
1、完美日記容器化改造之路
對于一家創業公司而言,常常有三個問題擺在面前:
如何高效、低成本地搭建系統,同時確定安全穩定?
如何靈活建構和釋出應用,滿足業務需求?
如何提高團隊開發效率,確定開發品質?
早期大部分網際網路公司都是直接購買伺服器,租用IDC機房的機架部署,應用是直接運作在實體機上,如果要擴充必須購買新的伺服器。IDC會頻繁出現各種故障,如果遇到IDC遷移就更麻煩,必須半夜搬機器,天亮前上線,對于企業來說,在成本、服務穩定性、工作效率上都是很大的消耗。
2019年雙11前期,完美日記小程式剛剛上線兩個月,就經曆雙11大促的磨砺。在這兩個月裡,傳統的部署方式,特别是有部分應用需要(openrestry)在SLB上面配置,那麼運維人員就要在SLB上一個個勾選伺服器,這會導緻釋出版本的時間需要半個小時以上。如果發版過程中出現問題,往往時間還會延長到一個小時以上。
在擴容機器的時候,使用其中2台伺服器在阿裡雲打OS鏡像,采用開機自啟動腳本方式啟動應用,針對每次營運活動的實際情況進行擴容。為了保持系統的穩定性,運維人員就需要在每晚23:00點以後通過人工操作進行擴容,手工配置SLB。最後測試人員進行測試,平均每次擴容都需要半個小時以上。并且由于雙11期間處于大流量、高并發的場景,整個運維人員對伺服器維護、版本疊代、資料庫運維等都必須格外謹慎,稍有不慎會導緻線上生産事故,伺服器運維壓力巨大。
2019年雙11之後,完美日記就開始針對性測試阿裡雲容器服務ACK,并開始容器化改造。
之是以選擇容器技術,是因為完美日記要建構一套現代化IT系統以滿足快速變化的需求和挖掘更多的資料價值。具體來看,一方面,完美日記對業務的快速創新以及現有業務的實時性和互動性需求都在不斷地增長;另外一方面,完美日記對資料的重視程度也在不斷提高,尤其是使用者資料的重要性。如何提供優于競争對手的服務和使用者體驗,如何合理、有效地發掘更多的資料價值,成為完美日記迫切的需求。容器技術以其獨有的高效靈活和易于擴充的特性,加之龐大的生态系統,可以充分滿足完美日記不同階段的IT需求,這也是完美日記最終選擇IT系統全面容器化改造的原因。
完美日記最開始是自建K8s,使用的是K8s開源版本,但是開源版本有很多bug未知,安全性也是未知,并沒有一個比較友好的Web操作界面,還需要大量運維人員解決運作時出現突然的各種問題。從成本和效率等次元來看,并不是一條便捷的路,思慮再三,完美日記最終選擇阿裡雲容器服務ACK。“我們的技術人員跟阿裡雲的技術人員其實非常熟悉,在雙11期間他們也給予了很多技術層面的支援,我們遇到的問題他們基本都遇到過,我們沒遇到的問題,他們也都遇到過,站在巨人的肩膀上進行容器化改造,對于當下的完美日記而言,是最合适的。”
完美日記的容器化實踐是按照項目區分兩條線并行,第一條線是一次性前後端全部遷移,第二條線是分應用分批次前後端分别遷移。
(1)一次性前後端全部遷移
2019年11月初-2019年11月中旬,完美日記開始計劃容器化改造的準備事宜以及改造方案,包括容器化改造方案初步實施,阿裡雲K8s選型,阿裡雲K8s選型後進行初步測試,結合公司情況和人員相配比情況,最終選擇了阿裡雲托管K8s Master版本進行大規模測試工作,并開始準備UAT環境切換前期工作等事宜。
2019年11月中旬,第一次切換UAT環境到K8s中失敗,因為還有部分在開發中的子產品,而K8s中沒有對應的子產品,是以切換回非K8s環境。
2019年11月底-2019年12月初,将UAT環境切換到K8s中,這次切換吸取了第一次切換失敗的經驗,UAT環境正式切換到K8s中。
2019年12月初-2019年12月中,觀察整個UAT環境是否存在有重大問題,然後進行調整。将整個K8s UAT環境按照雙11量級進行四輪壓力測試,将結果回報,然後不斷進行調整。2019年12月中,嘗試将背景正式環境切換到K8s正式環境中,但由于UAT環境中代碼版本和正式環境中代碼版本不一緻,導緻第一次嘗試切換失敗。
2019年12月中,在第一次切換背景失敗中吸取了版本不一緻的教訓後,經過一天的努力終于将背景正式環境切換到K8s正式環境中,正式環境走出艱難的容器化改造第一步。2020年1月初,經過一天努力,将正式環境順利切換到K8s正式環境中。
(2)分應用分批次遷移
2019年11月底開始準備遷移測試環境方案,2019年12月初,後端和中間件開始新增UAT環境。
2020年1月2日,後端準備完成。1月3日準備開始前端,1月17日前端完成、UAT環境正式使用。1月17日開始準備正式環境遷移方案,2月遷移方案完成,2月中上旬開始遷移後端,3月中旬後端遷移完成,ZooKeeper、Eureka遷移完成。3月下旬,前端開始遷移,4月初前端基本遷移完成。最終在4月中旬,完美日記IT系統全部遷移完成。
至此,完美日記全面容器化改造完成。

在容器化部署過程中,利用ACK的快速彈性應對大促時的資源快速擴容。将完美日記IT系統提前接入阿裡雲鍊路追蹤産品ARMS,用于對分布式環境下複雜的服務調用進行跟蹤,對異常服務進行定位,完美日記可以在測試和生産中快速發現問題,快速修複。使用性能測試服務PTS進行壓測,利用PTS的秒級流量拉起、真實地理位置流量等特性,以最真實的網際網路流量進行壓測。收集壓測資料,分析系統強弱依賴和關鍵瓶頸點,對關鍵業務接口、關鍵第三方調用、資料庫慢調用、系統整體負載等進行限流保護。在大促前進行ECS/RDS/安全等産品擴容、鍊路梳理、緩存/連接配接池預熱、監控大屏制作、後端資源保障等,幫助完美日記在大促平穩進行,保持絲般順滑。
除了采用容器服務ACK之外,完美日記在一開始進行容器化改造時就使用了阿裡雲鏡像企業版ACR EE,它的優勢是比自建harbor要穩定與低成本,因為自建harbor需要考慮計算、資料庫以及磁盤成本,如果項目很多或者鏡像比較多,那麼磁盤成本将比較高。鏡像企業版不用考慮維護成本。另外,鏡像企業版并發比自建harbor要高,如果大批量進行擴容,自建harbor往往容易出鏡像PULL問題,但是鏡像企業版就沒有這種擔憂。
另外,完美日記也通過ARMS Prometheus來監控系統可能出現的問題,并能針對性地解決問題。ARMS還可以解決整個K8s底層監控(Prometheus)的維護和成本高的難題,它能監控應用每個pod資源使用情況,對pod資源進行調整。K8s底層監控(Prometheus)可以做一個自定義大盤,将Prometheus全部監控資訊完整顯示出來。
容器化改造之後,整個系統“輕松了很多”。1月初,在切換到K8s正式環境後,擴容時間隻需要90秒左右,節約了6~8倍時間,減少了一名伺服器運維人員。根據營運節奏進行擴容,伺服器擴容成本節約70%~90%。同時,部署效率大幅提升,可根據檔案模闆秒級建立一個服務,部署時間減少90%以上。
另外,伺服器資源自動計算部署到伺服器,利用隔離技術可部署多個項目伺服器,使用率提高50%以上。服務子產品的自動負載均衡無需人工幹預,工作量減少90%以上。服務子產品伸縮容無需編寫腳本,隻需點選伸縮按鈕即可,減少人工錯誤率,工作量減少70%以上。服務子產品不可用會自動剔除,自動重新開機服務子產品。伺服器當機時,伺服器上運作的服務子產品會自動轉移到可用伺服器上,無需人工幹預,工作量減少100%。
2、容器化改造更大的挑戰是在技術和人員上做好準備
當企業完成了容器化改造之後,在生産環境中應用容器技術,并計劃擴大應用規模,這時企業就必須在技術和人員上做好準備:運維人員是否有足夠的能力來應對大規模應用帶來的挑戰,研發人員是否有足夠的技術準備能随時解決大規模應用帶來的問題,産品的架構設計是否可以滿足未來的企業需求,同時組織架構和文化是否已經适應企業新的戰略發展等。
換句話說,如何讓項目組和開發人員之間達成技術同頻、戰略同頻更具挑戰性,這其實也是很多在做容器化改造的企業面臨的共同難題。
出現這個問題的核心是項目組的開發人員、架構師、運維人員關注點不一緻。開發人員關注系統平穩運作和業務開發,而不關心生産環境底層,隻要不影響到生産環境和測試環境就可以。架構師關注底層是否穩定運作,技術架構是否符合未來3~5年技術發展,技術是否簡單高效等。運維人員關注釋出版本是否簡單高效,環境是否能統一,擴縮容時間成本,底層運維過程是否能有解決方案等。
正是由于三方的關注點不同,是以在遷移過程中就不可避免會花費大量的溝通成本。因為K8s這套系統有别于傳統的部署過程,開發人員對 centOS系統、Nginx、MQ、MySQL、查詢日志等比較熟悉,但對于K8s不甚了解,Ingress、Docker配置化、Deployment配置、Service等往往已經到了開發人員對技術認知的邊界了,這就需要花費較長的時間去解答大家的疑問,才能往下一步進行。
對于這類問題,每個企業的解決方案都不同,最核心的就是把相關人員的知識邊界盡量拉到同一級别,最大程度地減少溝通成本和沖突。完美日記是采用“及時同步、責任到人、内部教育訓練”的方法,比如每次在任何環境做的調整都需要在容器化改造群内通知相關人員,保證大家的認知一緻;在内部推進“誰負責誰完善”的文檔制度;同時組織一些内部技術教育訓練,讓關鍵開發人員在公司内部對K8s進行教育訓練講解。還有就是推進企業内部新的、統一的技術文化等。
3、未來規劃
目前各大公有雲廠商都推出了容器服務,還有不少獨立的容器雲公司。如果企業一開始就是建立在公有雲之上,推薦直接使用相應的容器服務,不僅可以快速搭建系統,還能大幅降低運維成本,提高效率,輕松實踐DevOps。在容器環境下,很多日常操作都自動化或半自動化了,比如應用的部署和釋出、擴容等,容器編排具有自愈能力,即使出現問題,也能減少人工的幹預,大大減輕運維人員的工作壓力。
完美日記下一步會重點關注三方面,一是進行Ingress+Gateway單獨部署;二是使用ECI+HAP+EW+AHAS(自動擴容資料來源)進一步優化成本,應對突發流量;三是考慮采用服務化網格技術。
如今,雲原生已經成為企業數字化轉型的關鍵政策,由于應用需要快速開發和傳遞,這就促使企業采用雲原生的方法來開發應用,以提高效率,并增加靈活性。對于身處雲原生時代的企業和開發者而言,不僅需要了解如何通過容器實作建構應用的新方式,更是要以開闊的視野和開放的心态去擁抱雲原生生态。
對于企業而言,需要具備一定的前瞻性,對于容器生态圈的主流技術和發展要有足夠的把握,才能更好地将現有業務與容器技術相結合。随着企業對技術的不斷探索,業務系統的逐漸演進,應用規模的日漸增大,如何更好地與開源生态系統相結合,擴大企業的技術影響力,同時引入更合适的人才,是雲原生時代下企業要考慮的問題。
點選閱讀原文,了解更多阿裡雲容器服務ACK技術詳解與客戶案例。
閱讀原文連結:
https://www.aliyun.com/product/kubernetes?spm=5176.12825654.1kquk9v2l.1.e2cd2c4aqP4QCp