DockOne微信分享(一三五):求取一份極致的簡單:海量應用容器化改造之路
【3 天燒腦式基於Docker的CI/CD實戰訓練營 | 北京站】本次培訓圍繞基於Docker的CI/CD實戰展開,具體內容包括:持續整合與持續交付(CI/CD)概覽;持續整合系統介紹;客戶端與服務端的 CI/CD 實踐;開發流程中引入 CI、CD;Gitlab 和 CI、CD 工具;Gitlab CI、Drone 的使用以及實踐經驗分享等。
平臺架構
- Git Repository:管理應用原始碼;
- Maven Repository:管理應用依賴的外部框架包及內部二方包;
- Docker Registry:管理各業務映象依賴的基礎映象及業務映象;
- Config Center:基於ZK做的實現,管理應用本身的配置檔案、Leader控制、分散式鎖等;
- Rabbit MQ:用於解耦各應用之間的通訊;
- DB:用於儲存應用的一些管理資料和配置資料等;
- Kubernetes Cluster:供業務系統執行的一個統一的環境,所有環境的應用全部容器化;
- Publish Service:用於管理公司應用,包括使用者許可權的管理、應用後設資料的管理、應用Kubernetes配置後設資料的管理、應用的釋出、自動擴縮容、手工擴縮容、手工回滾等;
- Build Service:用於業務映象的構建及推送:收到Publish Service傳送的構建訊息後,從Git Repository拉取應用原始碼,經過編譯、打包、部署、映象構建及推送到Docker Registry。
構建服務
構建服務依賴的環境主要包括JDK、Git、Maven、Docker,主要功能包括應用原始碼檢出、編譯、打包、部署及Dockerfile生成、映象構建、推送幾個階段,整個過程我們編寫了一個sh指令碼,由這個指令碼來完成整個過程。
- 原始碼檢出:接收到釋出傳送的構建訊息時,由JDK中的Process物件來啟動這個sh指令碼檔案,進行應用原始碼檢出,檢出來過程有任何異常,傳送失敗訊息給釋出服務;
- 編譯:呼叫Maven的mvn compile命令進行編譯,編譯過程中有任務異常,傳送失敗訊息給釋出服務;
- 打包:呼叫Maven的mvn package命令進行打包,打包過程中有任務異常,傳送失敗訊息給釋出服務;
- 呼叫Maven的mvn deploy命令將打好的包部署到內部Maven倉庫,部署過程中有任務異常,傳送失敗訊息給釋出服務;如果是二方庫應用,流程到些就完成了,如果是非二方庫應用則繼續5、6、7三步;
- Dockerfile生成:Dockerfile每次都是動態生成的,Dockerfile的內部結構基本上比較確定,包括FROM基礎映象、ADD第3步打好的包、EXPOSE埠、ENTRYPOINT java –jar、CMD一些引數;
- 映象構建:呼叫”docker build –t 內部Docker倉庫/產品線名/應用名:標籤 .”進行映象構建,構建過程中有任務異常,傳送失敗訊息給釋出服務;
- 映象推送:首先登入內部Docker倉庫,登入成功後呼叫”docker push 內部Docker倉庫/產品線名/應用名:標籤”進行映象推送。
釋出服務
釋出服務本身比較大一些,包括使用者許可權管理、需求管理、產品線管理、應用管理、線上文件管理、缺陷管理、變更管理、Kubernetes應用配置管理、釋出管理等,在這裡主要介紹一下應用管理、Kubernetes應用配置管理、應用釋出管理三個模組:
- 應用管理:應用管理主要維護了應用本身的一些後設資料,還一些輔助配置,像編譯應用時使用的JDK版本、生成Dockerfile時使用的基本映象等;
- Kubernetes應用配置管理:這部分的配置是和應用直接掛鉤的,最終儲存下來的是Kubernetes的REST介面能識別的一個物件JSON串。這部分主要維護了Kubernetes的Deployment、Service、HorizontalPodAutoscaler、Scale四個物件,對Service、HorizontalPodAutoscaler兩個物件都新增了啟用、停用開關,Service物件預設開啟,而HPA物件預設關閉,我們使用Scale物件主要用於對某些應用進行手工擴縮容,來解決一些特殊場景的需求;圖示如下:
- 應用釋出管理:每次釋出是針對某個應用的程式碼分支進行釋出,首先由構建服務將對應分支的映象構建並推送完成,對應應用還要提前做Kubernetes相關的配置,然後呼叫我們進行一次薄封裝後的Kubernetes的REST介面:pulish(k8s-master:port,Kubernetes應用配置生成的JSON串)進行應用的釋出,釋出之後還要進行釋出狀態的監控,要讓每個應用的應用負責人清楚看到這次釋出的結果。
改造過程中的問題
在這次改造過程遇到了很多千奇百怪的問題,在這裡介紹幾個印象比較深的問題及解決辦法:
- 在每次重新發布,更新Kubernetes的Service物件時,報無法更新的錯誤,查官方文件獲知更新Service物件時,還要通過GET請求獲取resourceVersion、clusterIP兩個值put進來才可以;
- 在使用Logstash將採集的日誌輸出到HDFS時,開始使用WebHDFS外掛,配置是完全按照官方文件的配置,可是一直報一個Error錯誤,最後我們改用HttpFS外掛解決的;
- 最初構建服務使用JDK7進行編譯打包的,後來發現別的很多應用是在JDK 8下開發的,所以這就要求構建服務要能提供JDK多版本編譯環境,我們當時是用Maven的toolchains外掛解決的;
- 在Kubernetes環境,有些時候會出現某些pod刪除不掉,到現在為止沒想到太好的辦法,我們暫時是靠到殺掉Node上的程式解決的。
Q&A
Q:構建映象用的什麼技術?
A:我們使用的是Docker自身提供的docker build命令進行映象構建的。
Q:Config Center能否詳細說一下?
A:我們使用Config Center主要來管理應用自身的配置檔案,應該在啟動前首先拽下自己的配置檔案;還有就是對應用進行Leader控制,因為應用可能會跑多個例項的,像定時任務類的功能,在同一個時間點只能其中一個例項生效。
Q: 如何動態生成Dockerfile,如何在Docker映象裡配置JVM引數?
A:Dockerfile檔案:我們是使用sh指令碼生成的,將內容>>Dockerfile中;JVM引數是在應用中配置的,傳送構建訊息時,作為訊息內容送過去。
Q: Deployment 滾動更新如何設定間隔時間呢?
A:Deployment物件有個minReadySeconds屬性就是來解決這個問題的。
Q: Logstash的日誌為啥是傳送到HDFS而不是ES?有什麼考慮麼?
A:我們將Logstash採集到的日誌輸出到兩個地方:ES、HDFS,輸出到ES直接在Kibana上搜尋到,而輸出到HDFS便於在Kibana上面將日誌檔案進行下載下來。
Q:Docker Registry的在garbage collect時怎麼保證高可用?
A:我們使用的由VMware公司中國團隊開源的Harbor,無論安全、效率、可用性方面都提供了很強的保障了。
Q:kubectl set image的時候 能不能限制 每變更一個容器,再保證http訪問正常的前提下,再變更下一個容器 。畢竟有的服務啟動時間超過30秒,對外的服務忍受不了信麼久的不可訪問時間的?
A:這個可以直接藉助Kubernetes的RollingUpdate功能就可以做了。
Q:Dockerfile動態生成怎麼做的,用的是什麼生成工具?
A:使用sh指令碼生成,將內容>>Dockerfile中去可以了。
Q:統一的流程給實際的生產帶來了怎樣的好處能否介紹一下?
A:流程統一後,像原始碼管理、日誌採集及搜尋、應用釋出,應用滾動升級等就不需要應用本身來管了,這樣各業務系統本身就會更加專注於自身的業務功能了。
以上內容根據2017年08月01日晚微信群分享內容整理。分享人楊新倫,上海鋼聯產品研發中心高階工程師,現主要負責公司內部應用的容器化改造等相關的後臺研發工作。 DockOne每週都會組織定向的技術分享,歡迎感興趣的同學加微信:liyingjiesa,進群參與,您有想聽的話題或者想分享的話題都可以給我們留言。
原文釋出時間為:2017-08-06
本文作者:楊新倫
本文來自雲棲社群合作伙伴Dockerone.io,瞭解相關資訊可以關注Dockerone.io。
原文標題:DockOne微信分享(一三五):求取一份極致的簡單:海量應用容器化改造之路
相關文章
- 容器化改造應用-資料
- 對傳統應用進行容器化改造
- 單頁面應用微信分享跳坑指南
- DCOS雲平臺之應用容器化改造規範
- 微信單頁應用的那些事
- 微軟Azure Container Service的容器化應用微軟AI
- SAE 的極致應用部署效率
- 申通的雲原生實踐之路:如何實現應用基於容器的微服務改造?微服務
- 前端之路:緊跟潮流,docker簡單應用前端Docker
- 簡單獲取安卓應用簽名(微信開放平臺)安卓
- Spring Boot 之路(一):一個簡單的Spring Boot應用Spring Boot
- 微信小程式關於分享一些簡單總結微信小程式
- 極光筆記 | 極光服務的信創改造實踐筆記
- 簡單優化容器服務優化
- 極致簡潔的微前端框架-京東MicroApp開源了前端框架APP
- 微信團隊分享:微信後臺在海量併發請求下是如何做到不崩潰的
- 分享一個簡單的 laravel 應用健康檢查命令Laravel
- 微信群控系統的應用和實戰經驗分享
- 3倍+提升,高德地圖極致效能優化之路地圖優化
- 最佳化的極致
- 阿里資料庫的極致彈性之路阿里資料庫
- 一款極簡的聊天應用
- jsp的簡單應用JS
- 微信平臺應用
- vue單頁面應用在iOS版微信下自定義分享的問題VueiOS
- 微信分享
- 3倍+提升,高德地圖極致效能最佳化之路地圖
- 一份簡單夠用的 Nginx Location 配置講解Nginx
- 簡陋至極:微信小程式日曆元件(思路)微信小程式元件
- 應用容器化的五個步驟
- 提高微信小程式的應用速度微信小程式
- gRPC的Golang簡單應用RPCGolang
- pythontornodo的簡單應用1Python
- 硬核案例分享,一文帶你拆解PHP語言體系下的容器化改造PHP
- 如何快速部署容器化應用
- Docker容器化部署Python應用DockerPython
- div 簡單應用
- thymeleaf 簡單應用
- 微信開發超市全反系統,微信支付刷卡支付,微信介面簡單配置!