DevOps?實(shí)戰(zhàn):Jenkins Docker
原文鏈接:
https://cloud.tencent.com/developer/article/1575521
隨時(shí) Docker 的普及,云原生時(shí)代已經(jīng)到來,開發(fā)工程師對應(yīng)用環(huán)境的掌控力進(jìn)一步加強(qiáng),運(yùn)維成本進(jìn)一步降低。DevOps 采用 Docker 更是如虎添翼,持續(xù)集成更快更靈活,部署更簡單。本課程主要講解 Docker 服務(wù)器架構(gòu)和技術(shù)要點(diǎn),以及實(shí)戰(zhàn)使用 Jenkins 構(gòu)建 Docker。
本次分享內(nèi)容:
1、Docker 服務(wù)器架構(gòu)? 2、Docker 下載和構(gòu)建加速? 3、項(xiàng)目容器化的技術(shù)要點(diǎn)? 4、DevOps 實(shí)戰(zhàn):Jenkins 構(gòu)建 Docker
IaaS 是“基礎(chǔ)設(shè)施即服務(wù)”,采用服務(wù)器集群虛擬化技術(shù),面向運(yùn)維人員,不用關(guān)心服務(wù)器怎么加內(nèi)存、壞了怎么辦,節(jié)約了硬件和網(wǎng)絡(luò)維護(hù)成本;
PaaS 是“平臺即服務(wù)”,提供數(shù)據(jù)庫等軟件服務(wù),面向開發(fā)者編程調(diào)用,不需要自己搭建了,節(jié)約了運(yùn)維成本,而運(yùn)行環(huán)境能否標(biāo)準(zhǔn)化取代自建,是個(gè)問題;
SaaS 是“軟件即服務(wù)”,提供企業(yè)郵箱、代碼托管等軟件服務(wù),面向辦公人士圖形化界面操作,不需要運(yùn)維也不需要開發(fā)。

如果租了臺云服務(wù)器,在上面安裝了數(shù)據(jù)庫,這叫做 IaaS + 自建,缺點(diǎn)是:自己負(fù)責(zé)數(shù)據(jù)庫備份,升級非常困難,運(yùn)維成本很高,當(dāng)然比以前買服務(wù)器有進(jìn)步。
如果租了臺云服務(wù)器,再租了臺云數(shù)據(jù)庫,然后搭建開源郵箱和代碼庫,這叫做 IaaS + PaaS + 自建,缺點(diǎn)是:自己負(fù)責(zé)郵箱和代碼庫的升級,運(yùn)維成本中等,而且開源產(chǎn)品的圖形界面往往比較難用,并且無人跟進(jìn)及時(shí)升級導(dǎo)致安全隱患大、服務(wù)不穩(wěn)定,運(yùn)維自己搭的郵箱夜里出故障了,客戶發(fā)的郵件丟了,沒有人知道,而專門做企業(yè)郵箱的公司承諾 SLA,有專人值守?,F(xiàn)在很少有公司自己搭郵箱了,是一大進(jìn)步,但還是有不少公司自己搭代碼庫,浪費(fèi)了很多人力物力,結(jié)果還難用降低了研發(fā)效率。
做工程的最佳實(shí)踐是:不要重復(fù)造輪子,只要能買到就不要自己造自己搭,專注于產(chǎn)品業(yè)務(wù)。除非這個(gè)輪子是你的核心依賴,比如手機(jī)芯片,那屬于科研,而不是工程。所以首先需要明確本公司是業(yè)務(wù)驅(qū)動(dòng),還是科研驅(qū)動(dòng)。關(guān)于工程師和科學(xué)家的區(qū)別,推薦閱讀硅谷創(chuàng)業(yè)之父寫的《黑客與畫家》
PaaS 提供的云數(shù)據(jù)庫等標(biāo)準(zhǔn)化軟件服務(wù),非常方便,而標(biāo)準(zhǔn)化運(yùn)行環(huán)境卻沒有流行起來,為什么?
2010 年,dotCloud 成立做 PaaS 運(yùn)行環(huán)境,結(jié)果發(fā)展不好,把其中的 Docker 開源,卻很受歡迎,大家可以閱讀這段有趣的歷史《Docker 傳奇之 dotCloud》。
PaaS 讓開發(fā)者無需關(guān)心操作系統(tǒng),比如云數(shù)據(jù)庫后面是什么系統(tǒng),開發(fā)者不用管,最多改個(gè)配置重啟一下,很方便。而開發(fā)者用各種語言寫的應(yīng)用,都是定制化的,而不是標(biāo)準(zhǔn)化的,比如 Apache 配置不一樣,開啟的模塊不一樣,或者用的是 Nginx,所以開發(fā)者需要的是把 項(xiàng)目、語言環(huán)境 和 Apache 一起打包部署,甚至還有編譯安裝的組件,那就需要把整個(gè)系統(tǒng)打包。所以統(tǒng)一的應(yīng)用運(yùn)行環(huán)境無法滿足,沒有流行起來。
而 Docker 是一種輕量級虛擬機(jī),解決了這個(gè)問題,非常方便。單機(jī)部署和運(yùn)行 Docker 很簡單,而互聯(lián)網(wǎng)項(xiàng)目往往用戶量大,需要多臺服務(wù)器,如何部署集群并且自動(dòng)伸縮,就需要集群管理工具。
搭建一套完整的企業(yè)級 K8s 集群(最新二進(jìn)制方式)
Google 推出了 K8s,Docker 官方推出了 Swarm,經(jīng)過兩年的競爭,從 Google 搜索的關(guān)鍵詞熱度圖可以看出 K8s 已經(jīng)勝出,目前國內(nèi)的云計(jì)算大廠也紛紛支持 K8s。
Docker 屬于操作系統(tǒng)層虛擬化,稱為“容器”,它在 Linux 系統(tǒng)里創(chuàng)建一個(gè)虛擬層,共用一個(gè) Linux 內(nèi)核,既做到了隔離,速度又快于傳統(tǒng)的硬件抽象層虛擬機(jī)(比如 VirtualBox,可以在 Windows 系統(tǒng)里創(chuàng)建 Linux 虛擬機(jī))。

以前不管多么小的項(xiàng)目都要申請一臺新服務(wù)器,因?yàn)槎鄠€(gè)項(xiàng)目部署在一起會(huì)沖突,比如語言版本不同、共用一個(gè) Apache 導(dǎo)致上線重啟時(shí)中斷別的項(xiàng)目。
而 Docker 隔離了各個(gè)項(xiàng)目,一臺服務(wù)器可以跑很多個(gè) Docker,大幅度降低服務(wù)器成本,初期只需要買 1 臺服務(wù)器,根據(jù)性能需求再增加。

第一步:安裝 Docker,按照官方文檔,結(jié)果內(nèi)地非常慢,甚至安裝失敗。經(jīng)過分析安裝腳本的源碼,發(fā)現(xiàn)官方支持加速,但文檔里面沒有寫,很多人都不知道。
可以看到 Docker 用的是 Cloudflare 國際 CDN,這家 CDN 是有中國節(jié)點(diǎn)的,但在中國辦網(wǎng)站需要備案,對于尚未在中國開展業(yè)務(wù)的公司,尤其是各種英語的技術(shù)服務(wù),都不會(huì)來備案,所以內(nèi)地開發(fā)者訪問很慢,甚至超時(shí)。
這時(shí)候就需要有人提供國內(nèi)鏡像加速,這是個(gè)吃力不討好的事情,目前只有 163 一家提供免注冊的 Docker 公網(wǎng)加速,非常感謝。從圖中可以看到,拉取成功,速度挺快。

項(xiàng)目容器化需要開發(fā)者寫一個(gè) Dockerfile,基于各個(gè)語言的官方鏡像再安裝需要的庫和包,比如我們通過加速下載了 PHP 官方的 php:7.4-apache 鏡像,需要 apt 安裝一些庫,結(jié)果 docker build 的時(shí)候卡住了,這時(shí)候有個(gè)很好的調(diào)試方法:docker run 登錄進(jìn)去,就是我們熟悉的 Linux 系統(tǒng)了,執(zhí)行 Dockerfile 里面的那些步驟,看看哪一步慢。看圖片右下角,可以發(fā)現(xiàn) apt update 很慢,才 10 KB/s。這時(shí)候就要想辦法加速 apt 了。

apt 加速有大廠提供了,composer install 也有了,但沒人提供 get composer,所以我做了個(gè)開源項(xiàng)目提供加速服務(wù),大家課后可掃碼了解。
項(xiàng)目容器化的技術(shù)要點(diǎn)有4個(gè):
國內(nèi)加速,掌握各種軟件源的國內(nèi)加速。
HTTPS,SSL證書不要放在Docker里,應(yīng)放在Docker里,應(yīng)放在云計(jì)算提供的負(fù)載均衡里。
Docker只提供HTTP服務(wù)即可。
云存儲,文件不要上傳到Docker里,重啟就丟了,應(yīng)上傳到云存儲。
Log采集,Log不要記錄在Docker里的文件中,而應(yīng)該輸出到STDOUT和STDERR,再使用Log采集工具。

有一個(gè) Laravel 項(xiàng)目在本地運(yùn)行,Apache 也配好了,如何對它進(jìn)行 Docker 化?

第一步:搜索框架官方的 Docker 鏡像,如果沒有,再尋找語言官方鏡像。比如 Laravel 沒有官方鏡像,那就用 PHP 鏡像,安裝一些組件即可。
把本地項(xiàng)目的依賴包刪除,然后掛載到 Docker 里,進(jìn)行依賴安裝,逐個(gè)解決報(bào)錯(cuò),比如圖中 composer install 報(bào)錯(cuò)缺少 zip,那就需要通過 apt 安裝。

apt 安裝需要使用國內(nèi)加速,請看最上面一行代碼。apt 安裝完畢,再進(jìn)行項(xiàng)目包安裝,最后把所有的依賴都裝好,項(xiàng)目終于跑了起來。

Docker 始終在前臺運(yùn)行,鏡像無狀態(tài),重啟就會(huì)丟失所有文件,所以 log 應(yīng)該通過標(biāo)準(zhǔn)輸出,而不應(yīng)該保存為文件。可以看到 Apache 已經(jīng)把 log 文件指向了標(biāo)準(zhǔn)輸出。

項(xiàng)目中會(huì)記錄業(yè)務(wù) log,也需要改造為標(biāo)準(zhǔn)輸出。左邊是項(xiàng)目的 log 配置,右邊是業(yè)務(wù)代碼打 log,下面是最終運(yùn)行效果。
最后中國版的 Dockerfile 是這樣的,黃色的部分用來國內(nèi)加速,其余部分是國際通用的。

以前持續(xù)集成依賴廠商提供的語言環(huán)境,不支持某些語言或者版本過時(shí)經(jīng)常發(fā)生,而到了 Docker 時(shí)代,持續(xù)集成環(huán)境根據(jù)開發(fā)者的 Dockerfile 進(jìn)行搭建,可以支持任何環(huán)境,開發(fā)者的掌控力進(jìn)一步加強(qiáng),廠商也無需投入資金去支持各種語言了,達(dá)到了雙贏。
部署 Docker 鏡像的成本也很低,尤其是 K8s 彈性集群,不需要購買服務(wù)器,根據(jù)性能自動(dòng)伸縮,很多網(wǎng)站夜間訪問量很低,可降低到一兩臺,比包年包月的服務(wù)器便宜。
可以看出需要3個(gè)服務(wù):持續(xù)集成、私有 Docker 倉庫、K8s 集群管理。如果自己搭建,維護(hù)成本很高,不符合云計(jì)算的理念,采用 PaaS 最合適。

第一步,尋找 Jenkins 云服務(wù)和制品倉庫,比如 coding.net

這個(gè)項(xiàng)目的代碼很簡單,就是一個(gè) Laravel demo,大家可以提交自己熟悉的語言 demo,然后創(chuàng)建制品庫。

創(chuàng)建了 Docker 制品庫,就會(huì)獲得一個(gè)倉庫鏈接,用來推送和拉取鏡像。

然后配置一下 Jenkins,建議調(diào)試階段使用在線靜態(tài) Jenkinsfile,調(diào)試通過以后,再保存到代碼庫里。

CODING Jenkins 圖形化編輯器

Jenkins 構(gòu)建 Docker 很簡單,和本地一樣,只是要掌握一些 Jenkins 語法。需要注意的是:要判斷分支,比如只構(gòu)建 master。

構(gòu)建成功后,可以在制品庫中看到鏡像。下一步就是把它部署到 K8s 集群里。

找一家云計(jì)算廠商,如騰訊云,創(chuàng)建 K8s 集群,會(huì)獲得一個(gè) KubeConfig,放在本地即可使用 kubectl 命令遠(yuǎn)程操作。
不過 K8s 來自 Google,官網(wǎng)在國外,內(nèi)地?zé)o法下載,所以需要國內(nèi)加速。對 kubectl 命令不熟悉的話,也可以使用云計(jì)算網(wǎng)頁后臺創(chuàng)建網(wǎng)站,比如圖中用 apache 官方鏡像創(chuàng)建了一個(gè)網(wǎng)站。

把 K8s 密鑰錄入 CODING,授權(quán)給持續(xù)集成。

看圖中高亮的代碼,先在 K8s 中創(chuàng)建一個(gè)密鑰用來保存私有 Docker 倉庫的地址、用戶名、密碼,然后部署時(shí)指定私有鏡像和密鑰即可。
Jenkins 運(yùn)行成功,在本地使用 kubectl get pods 命令可以看到正在創(chuàng)建一個(gè)新容器,老的容器繼續(xù)運(yùn)行。
還可以通過 kubectl edit deploy web 命令查看目前的配置。

從第一張圖可以看到 K8s 配置里有了私有鏡像和倉庫密鑰。
第二張圖可以看到新容器創(chuàng)建成功以后,老的容器才會(huì)被刪除,不像傳統(tǒng)上線那樣導(dǎo)致服務(wù)中斷。
第三張圖是部署成功的項(xiàng)目首頁。

涉及源碼:
https://codes-farm.coding.net/p/laravel-demo/d/laravel-demo/git
- END -
?推薦閱讀? 阿里巴巴 DevOps 轉(zhuǎn)型后的運(yùn)維平臺建設(shè) 線上 K8s Ingress 訪問故障排查思路 Kubernetes 生態(tài)架構(gòu)圖 20張最全的DevOps架構(gòu)師技術(shù)棧圖譜 Linux Shell 腳本編程最佳實(shí)踐 我的云服務(wù)器被植入挖礦木馬,CPU飆升200% 做了這么多年運(yùn)維工作,現(xiàn)在才看清職業(yè)方向 一篇文章講清楚云原生圖景及發(fā)展路線 K8s kubectl 常用命令總結(jié)(建議收藏) 一名運(yùn)維小哥對運(yùn)維規(guī)則的10個(gè)總結(jié) K8s運(yùn)維錦囊,19個(gè)常見故障解決方法 編寫 Dockerfile 最佳實(shí)踐 搭建一套完整的企業(yè)級 K8s 集群(kubeadm方式)
點(diǎn)亮,服務(wù)器三年不宕機(jī)

