五阿哥鋼鐵電商平臺Docker容器云平臺建設實踐——你想知道的都在這里!

前言

五阿哥鋼鐵電商平臺(www.wuage.com)是由鋼鐵行業第一的中國五礦與互聯網第一的阿里巴巴聯手打造,并充分運用雙方股東優勢資源,即:阿里巴巴在大數據、電商運營、互聯網產品技術上的巨大優勢,尤其是在B2B終端買家上的獨有市場基礎,以及中國五礦67年的行業經驗,和遍布全球的200多個營銷和物流網點,致力于為鋼鐵行業帶來全新而持續的發展。Docker容器云平臺是運維技術團隊為內部服務整合、開發的一套容器管理平臺,支持基礎設施私有云和公有云對接,實現云上和云下實例使用一套平臺進行管理,業務實例按需彈性擴容和縮容,規范化的項目管理流程、測試、上線流程,旨在將開發、測試人員從基礎環境的配置與管理中解放出來,使其更聚焦于自己的業務開發。

本文主要結合在五阿哥業務場景情況,從以下三個部分講解:

1、為什么使用Docker技術 。

2、Docker容器云架構方案。

3、技術的選型和實踐。

為什么使用Docker技術

1.硬件資源利用率的問題,造成部分成本的浪費

在網站功能中不同的業務場景有計算型的,有IO讀寫型的,有網絡型,有內存型的,集中部署應用就會導致資源利用率不合理的問題。比如,一個機器上部署的服務都是內存密集型,那么CPU資源就都很容易浪費了。

2.單物理機多應用無法進行有效的隔離,導致應用對資源的搶占和相互影響

一個物理機器跑多個應用,無法進行所使用的CPU,內存,進程進行限制,如果一個應用出現對資源的搶占問題,就會引起連鎖反應,最終導致網站部分功能不可用。

3.環境、版本管理復雜,上線部署流程缺乏,增加問題排查的復雜度

由于內部開發流程的不規范,代碼在測試或者上線過程中,對一些配置項和系統參數進行隨意的調整,在發布時進行增量發布,一旦出現問題,就會導致測試的代碼和線上運行的代碼是不一致的,增加了服務上線的風險,也增加了線上服務故障排查的難度。

4.環境不穩定,遷移成本高,增加上線風險

在開發過程中存在多個項目并行開發和服務的依賴問題,由于環境和版本的復雜性很高,不能快速搭建和遷移一個環境,導致無法在測試環境中無法模擬出線上的流程進行測試,很多同學在線上環境進行測試,這里有很高的潛在風險,同時導致開發效率降低。

5.傳統虛擬機和物理機占用空間大,啟動慢,管理復雜等問題

傳統虛擬機和物理機在啟動過程進行加載內核,執行內核和init進行,導致在啟動過程占用很長時間,而且在管理過程中會遇到各種各樣的管理問題。

Docker容器云架構方案

基于Docker容器技術,運維技術團隊開發了五阿哥網站的容器云平臺。整體架構圖如下:

圖片描述

基礎設施

基礎設施包含網絡、服務器、存儲等計算資源。

多云對接

私有云(VMware)和公有云(aliyun)進行統一托管,包含網絡區域配置,VM實例開通及Docker的環境初始化配置等。

彈性調度

Docker容器云平臺集群節點管理,Saltstack進行配置管理,鏡像中心管理業務鏡像,統一監控,統一日志管理,定時任務管理。

服務編排

服務注冊,服務發現,容器節點在線的擴容和縮容,服務優雅上線,回滾降級,規范Java,Node,Python,iOS,Android等規范化的上線。

統一門戶

規范化整個業務流程,簡潔的用戶流程,可動態管理整個云環境的所有資源。

技術選型及實踐

鏡像標準

眾所周知,Docker的鏡像是分層的。對鏡像分層進行約定:
第一層是操作系統層,由CentOS/Alpine等基礎鏡像構成,安裝一些通用的基礎組件;
第二層是中間件層,根據不同的應用程序,安裝它們運行時需要使用到的各種中間件和依賴軟件包,如,nginx、tomcat等;
第三層是應用層,這層僅包含已經打好包的各應用程序代碼。

圖片描述

經驗總結:如何讓自己的鏡像變的更小,PUSH的更快?

圖片描述

  • dockerfile構建應用鏡像,在中間件層遇到一些需要安裝的軟件包時,盡可能的使用包管理工具(如yum)或以git clone方式下載源碼包進行安裝,目的是將軟件包的copy和安裝控制在同一層,軟件部署成功后清除一些無用的rpm包或源碼包,讓基礎鏡像的尺寸更小。
  • Java應用鏡像中并沒有將jdk軟件包打入鏡像,將jdk部署在每臺宿主上,在運行鏡像時,通過掛載目錄的方式將宿主機上的java家目錄掛載至容器指定目錄下。因為它會把基礎鏡像撐得非常大;
  • 在構建應用鏡像時,docker會對這兩層進行緩存并直接使用,僅會重新創建代碼出現變動的應用層,這樣就提高了應用鏡像的構建速度和構建成功后向鏡像倉庫推送的速度,從整體流程上提升了應用的部署效率。

編排工具

圖片描述

Rancher圖形化管理界面,部署簡單、方便, 可以與AD、LDAP、GITHUB集成,基于用戶或用戶組進行訪問控制,快速將系統的編排工具升級至kubernetes或者swarm,同時有專業的技術團隊進行支持,降低容器技術入門的難度。

圖片描述

基于以上優點我們選擇Rancher作為我們容器云平臺的編排工具,在對應用的容器實例進行統一的編排調度時,配合Docker-Compose組件,可以在同一時間對多臺宿主機執行調度操作。同時,在服務訪問出現峰值和低谷時,利用特有的rancher-compose.yml文件調用“SCALE”特性,對應用集群執行動態擴容和縮容,讓應用按需求處理不同的請求。
[https:/zhuanlan.zhihu.com/p/2...]()

網絡模型

圖片描述

由于后端開發基于阿里的HSF框架,生產者和消費者之間需要網絡可達,對網絡要求比較高,需要以真實IP地址進行注冊和拉取服務。所以在選擇容器網絡時,我們使用了Host模式,在容器啟動過程中會執行腳本檢查宿主機并分配給容器一個獨立的端口,來避免沖突的問題。

持續集成

監測代碼提交狀態,對代碼進行持續集成,在集成過程中執行單元測試,代碼Sonar和安全工具進行靜態掃描,將結果通知給開發同學同時部署集成環境,部署成功后觸發自動化測試(自動化測試部分后續會更新https://zhuanlan.zhihu.com/id...)。

圖片描述

靜態掃描結果:

圖片描述

持續部署

是一種能力,這種能力非常重要,把一個包快速部署在你想要的地方。平臺采用分布式構建、部署,master管理多個slave節點,每個slave節點分屬不同的環境。在master上安裝并更新插件、創建job、管理各開發團隊權限。slave用于執行job。

圖片描述

基于上述架構,我們定義了持續部署規范的流程:

  1. 開發同學向gitlab提交代碼;
  2. 拉取項目代碼和配置項文件,執行編譯任務;
  3. 拉取基礎鏡像,將編譯好的應用包打入生成最新的應用鏡像,推送到鏡像倉庫;
  4. 根據當前應用及所屬環境定制化生成docker-compose.yml文件,基于這個文件執行rancher-compose命令,將應用鏡像部署到預發環境(發布生產前的測試環境,相關配置、服務依賴關系和生產環境一致)。
  5. 預發環境測試通過后將應用鏡像部署至線上環境,測試結果通知后端測試同學。

監控管理

通過zabbix 自動注冊(AutoRegistration),Grafana通過調用zabbix的API接口進行監控指標的統一展示。
圖片描述

圖片描述

日志管理

容器在運行時會在只讀層之上創建讀寫層,所有對應用程序的寫操作都在這層進行。當容器重啟后,讀寫層中的數據(包含日志)也會一并被清除。雖然可以通過將容器中日志目錄掛載到宿主機解決此類問題,但當容器在多個宿主機間頻繁漂移時,每個宿主機上都會有留存應用名的部分日志,增加了開發同學查看、排查問題的難度。

綜上所述,日志服務平臺作為五阿哥網站日志倉庫,將應用運行過程中產生的日志統一存儲,并且支持多種方式的查詢操作。

圖片描述

通過在日志服務的管理界面配置日志采集路徑,在容器中部署agent把應用日志統一投遞到logstore中,再在logstore中配置全文索引和分詞符,以便開發同學能夠通過關鍵字搜索、查詢想要的日志內容。
經驗總結:如何避免日志的重復采集問題?

  • 日志服務agent需要在配置文件“ilogtail_config.json”中增加配置參數“check_point_filename”,指定checkpoint文件生成的絕對路徑,并且將此路徑掛載至宿主機目錄下,確保容器在重啟時不會丟失checkpoint文件,不會出現重復采集問題。

服務注冊

etcd是一個具備高可用性和強一致性的鍵值存儲倉庫,它使用類似于文件系統的樹形結構,數據全部以“/”開頭。etcd的數據分為兩種類型:key和directories,其中key下存儲單獨的字符串值,directories下則存放key的集合或者其他子目錄。

圖片描述

在五阿哥環境中,每個向etcd注冊的應用服務,它們的根目錄都以”/${APP_NAME}_${ENVIRONMENT}”命名。根目錄下存儲每個應用實例的Key信息,它們都以“${IP}-${PORT}”的方式命名。
下圖是使用上述約定,存儲在etcd上某應用實例的數據結構:

圖片描述

可以看到我是使用get方法向etcd發送請求的,請求的是部署在預發環境(PRE)的搜索服務(search);在它的根目錄“/search_PRE”下,僅存儲了一個應用實例的信息,這個實例的key是“172.18.100.31-86”;對應的value是“172.18.100.31:86‘’,整個注冊過程是這樣的:

①通過代碼為容器應用程序生成隨機端口,和宿主機正在使用的端口進行比對,確保端口沒有沖突后寫入程序配置文件;
②把通過python和etcd模塊編寫的服務注冊工具集成在腳本中,將IP地址和上一步獲取的隨機端口以參數的方式傳遞給服務注冊工具;
③待應用程序完全啟動后,由服務注冊工具以約定好的數據結構將應用實例的寫入etcd集群,完成服務注冊工作;
④容器定時向etcd發送心跳,報告存活并刷新ttl時間;
⑤容器腳本捕獲rancher發送至應用實例的singnal terminal信號,在接收到信號后向etcd發送delete請求刪除實例的數據。
注:在ttl基礎上增加主動清除功能,在服務正常釋放時,可以立刻清除etcd上注冊信息,不必等待ttl時間。

經驗總結:容器在重啟或者意外銷毀時,讓我們一起看一下這個過程中容器和注冊中心都做了什么事情?

應用在注冊是攜帶key 和value時攜帶了ttl超時屬性,就是考慮到當服務集群中的實例宕機后,它在etcd中注冊的信息也隨之失效,若不予清除,失效的信息將會成為垃圾數據被一直保存,而且配置管理工具還會把它當做正常數據讀取出來,寫入web server的配置文件中。要保證存儲在etcd中的數據始終有效,就需要讓etcd主動釋放無效的實例信息,來看一下注冊中心刷新的機制,代碼直接奉上:

圖片描述

服務發現

confd是一個輕量級的配置管理工具,支持etcd作為后端數據源,通過讀取數據源數據,保證本地配置文件為最新;不僅如此 ,它還可以在配置文件更新后,檢查配置文件語法有效性,以重新加載應用程序使配置生效。這里需要說明的是,confd雖然支持rancher作為數據源,但考慮易用性和擴展性等原因,最終我們還是選擇了etcd。

和大多數部署方式一樣,我們把confd部署在web server所在的ECS上,便于confd在監測到數據變化后及時更新配置文件和重啟程序。confd的相關配置文件和模板文件部署在默認路徑/etc/confd下,目錄結構如下:
/etc/confd/
├── conf.d
├── confd.toml
└── templates
confd.toml是confd的主配置文件,使用TOML格式編寫,因為etcd是集群部署,有多個節點,將interval、nodes等選項寫到了這個配置文件里。
cond.d目錄存放web server的模板配置源文件,也使用TOML格式編寫。該文件用于指定應用模板配置文件路徑(src)、應用配置文件路徑(dest)、數據源的key信息(keys)等。

templates目錄存放web server下每個應用的模板配置文件。它使用Go支持的text/template語言格式進行編寫。在confd從etcd中讀取到最新應用注冊信息后,通過下面的語句寫入模板配置文件中:
{{range getvs "/${APP_NAME}/*"}}

    server {{.}};

{{end}}
圖片描述

通過supervisor管理confd進程。confd在運行后會每隔5秒對etcd進行輪詢,當某個應用服務的K/V更新后,confd會讀取該應用存儲在etcd中的數據,寫入到模板配置文件中,生成這個應用配置文件,最后由confd將配置文件寫入到目標路徑下,重新加載nginx程序使配置生效。(代碼請參考:https://zhuanlan.zhihu.com/id...)

總結

以上是五阿哥運維技術團隊針對Docker容器云平臺建設實踐,目前已經將權限開放給開發同學,實現云上和云下實例使用一套平臺進行管理,業務實例按需彈性擴容和縮容,規范化的項目管理和發布流程,實例和業務可按需進行擴容和縮容,實現7*24小時“一站式”的持續交付,開發同學更聚焦于自己的業務開發,提高了公司的研發過程的效能。

接下來會不斷優化和適配各種業務場景,逐漸完善容器云平臺,同時會將容器云平臺各種功能,總結的經驗和教訓不斷分享給大家,給大家在工作中一些參考,避免走重復的“彎路”。

作者簡介:劉曉明,五阿哥(www.wuage.com)公司運維技術負責人,擁有10年的互聯網開發和運維經驗。一直致力于運維工具的開發和運維專家服務的推進,賦能開發,提高效能。最后給自己代個鹽~~歡迎大家有空時翻下我牌子(知乎號:布道 ),看看之前的文章,順便關注下專欄“開發運維”。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539515.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539515.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539515.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

oracle數據導入導出

一、exp/imp與expdp/impdp的區別 1:把用戶usera的對象導到用戶userb,用法區別在于fromuserusera touseruserb ,remap_schemausera:usera 。例如 imp system/passwd fromuserusera touseruserb file/oracle/exp.dmp log/oracle/exp.log; impdp system/passwd directo…

web瀏覽器_Web上的分享(Share)API

我認為Web Share API非常酷,簡而言之,它會利用您所使用的平臺上的原生共享功能(如果該平臺支持的話)。我喜歡這個:在iOS上激活的Web Share API遠遠不止這些東西:為什么?Web Share API只是幾行代碼。簡單!沒…

Oracle視圖添加約束,Oracle創建視圖的語法

Oracle創建視圖的語法導讀:就愛閱讀網友為大家分享了多篇關于 "oracle 創建序列語法" 資料,內容精辟獨到,非常感謝網友的分享,希望從中能找到對您有所幫助的內容。相關資料一 : Oracle 創建視圖的語法Oracle 創建視圖的…

linux壓縮和解壓縮命令

tar命令解包:tar zxvf FileName.tar打包:tar czvf FileName.tar DirNamegz命令解壓1:gunzip FileName.gz解壓2:gzip -d FileName.gz壓縮:gzip FileName.tar.gz 和 .tgz解壓:tar zxvf FileName.tar.gz壓縮&a…

【Java進階】Java Lambda 表達式、Stream API完整梳理

一、Lambda表達式 Lambda 表達式是一種匿名函數,它可以用來定義函數式接口的實現。Lambda 表達式可以用來簡化代碼,提高代碼的可讀性和可維護性。 1、Lambda 表達式 1.1、語法介紹 Lambda 表達式的語法如下: (parameters) -> express…

使用T-SQL語句操作數據表-刪除數據

1.使用 delete 語句刪除表中的數據&#xff1a;語法&#xff1a;delete from <表名> [where <刪除條件>]delete 是刪除的意思 where是選填內容可以不加&#xff0c;但是不加條件的話是刪除整個表 例子&#xff1a;delete from 成績表 where 姓名張三含義&#xff1…

Oracle expdp/impdp導出導入命令及數據庫備份

經常報錯&#xff1a; ORA-39002: invalid operation ORA-39070: Unable to open the log file. ORA-29283: invalid file operation ORA-06512: at "SYS.UTL_FILE", line 536 ORA-29283: invalid file operation 解決方法&#xff1a; 1、 CREATE OR REPLACE DI…

exfat單元分配要設置多少_微軟宣布,支持往Linux內核里添加exFAT存儲了!跨系統存儲的福音...

栗子 發自 凹非寺 量子位 報道 | 公眾號 QbitAIexFAT&#xff0c;是微軟開發的文件系統&#xff0c;為閃存而生。你的U盤、SD卡、手機等等存儲設備&#xff0c;能存4G以上的大文件&#xff0c;很大程度上是它的功勞。可exFAT一直是專有的&#xff0c;微軟手握多項專利。所以&am…

在linux中安裝oracle中文包,在Linux命令行下安裝Oracle 10g

Oracle 10g支持在命令行下用靜默模式(Silent)安裝&#xff0c;給那些沒有安裝圖形界面的Linux系統提供了極大的便利。下面以Fedora Core 6為例&#xff0c;介紹在命令行下安裝OracleOracle 10g的方法。1 安裝前的準備準備工作要用登錄為root用戶來進行。1.1 選擇安裝環境的語言…

Jetbrains 系 IDE 編輯器的代碼提示功能

著名的 Jetbrains 可謂編程界的一大福音&#xff0c;眾多有名代碼編輯器比如 ItelliJ IDEA、PHPStorm、WebStorm、PyCharm 等&#xff0c;均出自這家公司麾下。 對于中國的Java開發者來說&#xff0c;可能使用 Eclipse 的人最多。 使用Idea的程序員也不少, 而且每個人都在鼓吹其…

Oracle下的Databse,Instance,Schemas

1、DATABASE&#xff0c;對oracle而言&#xff0c;是指物理上的數據庫&#xff0c;一般你安裝了一個oracle的數據庫軟件后&#xff0c;就是一個database。 2、instance&#xff0c;在同一個數據庫上&#xff0c;可以建立多個實例&#xff0c;這些實例互相不干擾&#xff0c;每個…

oracle實驗數據庫和表,1oracle創建數據庫和表.doc

1oracle創建數據庫和表.doc實驗一&#xff1a;創建數據庫和表一、實驗目的1. 掌握使用DBCA創建數據庫2. 掌握手工創建Oracle數據庫的方法3. 掌握創建數據表的方法二、實驗內容及步驟1. 使用DBCA創建數據庫(1) 打開DBCA組件,創建數據庫sale.(2) 安裝完后進入D:\oracle\product\1…

tkmybatis 子查詢_真假童子命符箓道長教你如何查詢

童子命查詢方法一&#xff1a;童子命在相術里&#xff0c;指的是一生都霉運連連如過本命年的人。古代關于真童子命查詢有口訣“春秋甲寅子&#xff0c;冬夏卯未辰&#xff1b; 金木乙卯未&#xff0c;水火庚辛壬&#xff1b; 土命逢辰巳&#xff0c;童子定為真”解釋上面的口訣…

使用 nvm 安裝 nodejs 和 npm

使用 nvm 可以方便的進行 nodejs 的安裝和版本管理。其實最開始使用的是 n 命令&#xff0c;命令簡潔到極致了&#xff0c;無奈總是安裝不成功&#xff0c;往往下載一部分就報 curl 錯誤。然后又找到這個 nvm&#xff0c;配合淘寶源&#xff0c;簡單快捷&#xff5e; 1.到 nvm …

ECLIPSE配置OSGI服務器

eclipse版本如下&#xff1a; Eclipse Java EE IDE for Web Developers. Version: Mars Release (4.5.0) Build id: 20150621-1200 ------------------------ 1、進入eclipse-----run----run configuration---osgi framework---new 2、取消全選 3、在搜索框中輸入 osgi&a…

oracle ebs r12財務月結基礎講座20090823,095921_OracleEBSR12財務月結基礎講座20090823課件.ppt...

095921_OracleEBSR12財務月結基礎講座20090823課件2009年8月23日方亞兵、鞏學偉;1、月結概述 1.1)月結與對帳 1.2)子模塊與總帳之間的關系 1.3)關帳順序2、各模塊詳細結帳流程及對帳 2.1)應付 2.2)采購 2.3)庫存 2.4)應收 2.5)資產 2.6)PAC 2.7)總帳3、應收模塊業務規則介紹4、…

AD19 add pins to nets錯誤_為什么我認為Rust的Result錯誤處理方式不如Exception

由于是對技術的個人評判&#xff0c;歡迎理性討論。我曾經也當過純函數式的腦殘粉&#xff0c;認為宇宙第一棒的代數數據結構用來處理錯誤&#xff0c;是無上的優雅和絕對的安全。一個看似人畜無害的接口拋出異常帶來的崩潰&#xff0c;是各類疑難雜癥的罪魁禍首。綜合起來&…

Java @Transient 注解使用

2019獨角獸企業重金招聘Python工程師標準>>> 我們建實體類的時候啊&#xff0c;有時候實體類的屬性和數據庫表字段不一致的時候&#xff0c;比如多一個屬性&#xff0c;那你不加這個注解就會報錯&#xff0c;因為映射的時候會提示&#xff08;提示啥我給忘了&#x…

Myeclipse/eclipse 安裝查看class文件的插件

從http://www.oschina.net/project/tag/317/decompiler?lang19&os0&sortview 中下載了 也可到我的網盤&#xff1a;http://pan.baidu.com/s/1eS5BMcM 下載 Java反編譯工具jad &#xff08;jad.exe&#xff09;和 Java反編譯插件 Jadclipse &#xff08;net.sf.jadcl…

oracle—ebs_采購功能點操作手冊,oracle—EBS_采購功能點操作手冊

erp實施企業采購模塊構架及日常業務操作指導“人力資源”頁簽可以設置是否“使用審批層次結構”來決定采購單據的審批路徑。如不選定&#xff0c;則表示采購單據將使用員工的“主管”結構來進行審批。“員工編號”方法默認自業務組定義時的“員工編號生成”方法設置。1.2采購選…