Docker&Kubernetes在新浪測試的應用與實踐

Docker 軟件 新浪 Linux 互聯網測試 互聯網測試 2017-08-13

新浪測試研發團隊

2016年,我們開啟了容器化探索之路,先回顧一下之前遇到的一些問題。在物理機時代,資源的交付時間較長,資源的利用率較低,也不能做到隔離。到了虛擬機時代,問題得到了初步的解決,但在彈性伸縮方面仍有不足。

隨著Docker技術的興起,為了提高測試、開發的工作效率,我們基於Kubernetes與Docker技術,實踐部署了一套自動化測試環境搭建體系。這套體系打破以往在VM上創建/維護測試環境,重度依賴VM穩定性的現狀,實現了測試環境容器化。部署一套測試環境的時間由之前的平均三十分鐘,下降到平均不到3-4分鐘,資源利用率也比之前提高了三倍以上,且極大程度上減少人力維護成本

本文就這套體系的結構,原理以及實現做詳細介紹,在我們分享應用實踐之前,我們會首先帶大家瞭解下docker與kubernetes的基本概念

1.什麼是Docker?

Docker的英文本意是碼頭工人,也就是搬運工,這種搬運工搬運的是集裝箱(Container),集裝箱裡面裝的可不是商品貨物,而是任意類型的App,Docker把App(叫Payload)裝在Container內,通過Linux Container技術的包裝將App變成一種標準化的、可移植的、自管理的組件,這種組件可以在你的latop上開發、調試、運行,最終非常方便和一致地運行在production環境下。

相比官方解釋,相信說Docker是一個輕量級的虛擬機更容易理解,接下來我們來看下docker與VM的區別。

Docker&Kubernetes在新浪測試的應用與實踐

2.Docker VS VM

從下圖可以看出,VM是一個運行在宿主機之上的完整的操作系統,VM運行自身操作系統會佔用較多的CPU、內存、硬盤資源。Docker不同於VM,只包含應用程序以及依賴庫,基於libcontainer運行在宿主機上,並處於一個隔離的環境中,這使得Docker更加輕量高效,啟動容器只需幾秒鐘之內完成。由於Docker輕量、資源佔用少,使得Docker可以輕易的應用到構建標準化的應用中。但Docker目前還不夠完善,比如隔離效果不如VM,共享宿主機操作系統的一些基礎庫等;網絡配置功能相對簡單,主要以橋接方式為主;查看日誌也不方便靈活,但這些都在隨著docker技術的普及而逐漸被解決。

Docker&Kubernetes在新浪測試的應用與實踐

3.Docker是怎麼工作的?

Docker是一個的client -server架構,docker daemon在主機上面執行,負責容器的構建運行和分開,用戶通過client與主機上的daemon通訊,也可以通過client來操作容器。Client和Daemon可以在同一臺主機上面執行,也可以分開執行。本地的client可以連接遠程的daemon,這就讓docker使用起來更加方便快捷。

Docker&Kubernetes在新浪測試的應用與實踐

在我們瞭解完docker之後,我們來看下kubernetes工作原理

4.什麼是Kubernetes?

Kubernetes是Google推出的一個用於容器集群的自動化部署、擴容以及運維的開源平臺,就像一個智能的調度碼頭一樣,他架構簡潔功能清晰,核心理念就是對於資源和任務的理解和引入標籤的設計,所以他具備,可移植,可擴展可自愈等特點.

Docker&Kubernetes在新浪測試的應用與實踐

5.Kubernetes 是怎麼工作的?

Kubernetes是一個分佈式的系統架構,APIserver作為集群的核心,負責集群的各功能模塊之間的通信,就像智能碼頭的調度室,集群內的功能模塊通過API sever將信息存入etcd,其他模塊通過api server(用 git list 或者watch方式讀取這些信息)從而實現模塊之間的信息交互比如node節點上的kubelet每隔一個時間週期,通過apiserver報告自身狀態apiserver接收到這些信息後,將節點狀態信息保存到etcd中,controller manager 中的node controller通過api server定期讀取這些節點狀態信息並做相應處理

又比如 scheduler監聽到某個pod創建的信息後檢索所有符合該pod要求的節點列表,並將pod綁定到節點最符合要求的節點上如果schedule監聽某個pod被刪除則調用api server刪除該pod資源對象 kubelet監聽pod信息如果監聽到pod對象修改信息則kubelet監聽到變化後會相應的修改本地節點的pod實例為了緩解集群個模塊對APIserver的訪問壓力各功能模塊都採用緩存機制來緩存數據各功能模塊定時從apiserver獲取制定對象信息(通過list及watch方式)然後將這些信息保存到本地緩存功能模塊在某些情況下不直接訪問apiserver 而是通過訪問緩存數據來間接訪問api server。

Docker&Kubernetes在新浪測試的應用與實踐

在瞭解完docker與kubernetes的基本概念之後,我們來看下我們的在自動化測試的應用實踐

6.基於Docker&K8S的應用實踐

a)總體流程

Docker&Kubernetes在新浪測試的應用與實踐

1) 開發在本地修改好代碼後,push到GIT倉庫

2) 自動觸發Jenkins下載代碼

3) 從鏡像庫選擇一個合適的鏡像下載

4) 將代碼掛載到鏡像中,build成新的可運行鏡像

5) 將新鏡像push到鏡像庫

6) Kubernetes集群,Node是集群機器,POD是基本調度單位,一個POD可以運行多個Docker容器,POD產生Service,Service之間可以相互調用

7) K8s集群從鏡像倉庫獲取build好的鏡像,直接調度部署

8) 測試人員可在外部訪問部署好的服務

9) 測試過程中可以通過rolling update進行升級

b)選擇基礎鏡像

Docker&Kubernetes在新浪測試的應用與實踐

首先,需要選擇一個合適的鏡像,現在提供鏡像下載的雲服務站點有很多比如靈雀雲,阿里雲,我們也搭建了自己的私有鏡像庫,並提供web頁面供共享查找,在上傳下載速度上有很大優勢

c)掛載代碼配置

Docker&Kubernetes在新浪測試的應用與實踐

有了基礎鏡像,下面看看如何將代碼掛載進去,製作成可直接運行的鏡像

1) 首先,Jenkins從GIT拉取代碼,同時從配置中心獲取配置(配置中心是為了區分線上線下配置建立的配置文件備份中心,可根據不同環境選擇不同配置)

2) 然後Jenkins根據不同項目需求,將代碼打包成 tar包,war包,jar包,zip包

3) 將代碼包通過Add/copy指令放入鏡像指定位置,形成新的Dockerfile

4) 最後build成可直接運行的鏡

d)運行容器

Docker&Kubernetes在新浪測試的應用與實踐

最後,來看看如何運行容器,上一步build好的鏡像可以直接通過dockerrun運行,也可以在K8S集群運行

下面主要看看K8S集群上如何運行

1) 首先,啟動裝有PHP代碼的Container,然後裝入POD,如果依賴性比較強的組件,可以放入一個POD。

2) 當然可以根據需要啟動多個POD組成服務集群,

3) K8S會根據集群資源將POD分配到不同機器。

4) POD所對應的服務內部可以相互訪問,

5) 外部可以通過端口映射來訪問,比如例中的服務,可以通過http://localhost:80訪問到服務

我們在Jenkins上將整個流程做成了可視化pipeline視圖,如下:

Docker&Kubernetes在新浪測試的應用與實踐

每一個塊都是一個構建步驟,主要是代碼打包,製作鏡像,運行容器。與上面介紹的三個步驟相對應。

根據不同的項目會選擇不同的路徑分支來構建測試環境

下面就來演示一下:

點擊RUN:,選擇項目,環境,端口和分支,我們先使用默認值,點擊開始構建,如下圖:

Docker&Kubernetes在新浪測試的應用與實踐

我們來了解下RUN頁面的選項:

項目名:所選擇的項目

環境:是為了以後擴展做準備,不同環境會從配置中心拉取不同的配置。包括測試,自動化,開發,預發佈環境等

端口:我們給每個項目預分配了一些端口。在多個人同時測試多個分支的時候,就需要選擇自己的端口,以免互相影響。默認就會隨機創建

分支名:就是要測試的代碼分支

hosts:如果填寫,會加入/etc/hosts文件中,也是測試環境互聯常用的方法

環境構建完成之後(consoleoutput),會看到為你隨機分配了一個端口,我們就用這個端口來進行訪問啦。

相關推薦

推薦中...