《微服務運維實戰(zhàn)(第1卷)》詳細講解微服務和容器在軟件持續(xù)集成和部署中的應用。將微服務打包成不可變的容器,通過配置管理工具實現自動化測試和持續(xù)部署,同時保證零停機且隨時能回滾。采用集中日志對集群進行記錄和監(jiān)控,輕松實現服務器擴展。作者通過講解相關工具(Docker、Kubernetes、Ansible、Consul等)的用法,分享自己的工作經驗,幫助讀者構建高效、可靠、可快速恢復的軟件系統。
采用業(yè)界新的工具和方法開展微服務開發(fā)與部署,快速構建現代軟件系統。
我的職業(yè)生涯是從程序員開始的。那段日子,我所知道的只是編寫代碼。我以為出色的軟件設計師就是精通編碼的人,而精通的途徑是對所選的一種編程語言做到了如指掌。后來,我的想法變了,我開始對不同的編程語言產生興趣。我從Pascal換到Basic,而后換到ASP。Java和.NETet讓我了解到面向對象編程的好處。Python、Perl、Bash、HTML、JavasScript、Scala,每種編程語言都帶來一些新東西并教給我如何以不同的方式思考。我學會了為手頭的任務挑選正確的工具。每學會一種新語言,我就感覺距離成為專家又近了一點。我只想成為一名資深程序員,這個想法隨著時間的推移發(fā)生了改變。我認識到,如果要把自己的工作做好,我得成為一名軟件藝匠。我學習的東西遠不止輸入代碼。有段時間我癡迷于測試,現在我認為測試是開發(fā)不可或缺的一部分。除非有特殊原因,否則我編寫的每行代碼都是通過測試驅動開發(fā)(test-driven development,TDD)來完成的。測試驅動開發(fā)已它成為我手上必不可少的工具。另外我還認識到,在確定應該做什么時,我必須接近客戶與他們肩并肩地工作。所有這些事情都將我引向軟件架構領域。
我在軟件行業(yè)工作的這些年,沒有哪個工具、框架或者實踐能像持續(xù)集成(continuous integration,CI)以及之后的持續(xù)交付(continuous delivery,CD)那樣讓我著迷。起初,我以為CI/CD意味著了解Jenkins并且能夠書寫腳本。隨著時間的推移,我認識到CI/CD幾乎牽涉了軟件開發(fā)的方方面面。而我是在付出一定代價后才有了這樣的認識。
我不止一次嘗試為我開發(fā)的應用創(chuàng)建CI管道,但都失敗了,因為我采用的方法是錯誤的。不考慮架構問題,CI/CD是無法實現的。類似的道理亦適用于測試、配置、環(huán)境、容錯等等方面。要成功實施CI/CD,我們需要做出很多改變,這些改變第1眼看上去似乎沒有直接的關聯。我們需要從一開始就應用一些模式和實踐。我們還得考慮架構、測試、耦合、打包、容錯,以及其它他許多事情。通過實踐CI/CD,我們正影響和改善軟件開發(fā)生命周期的方方面面。
要真正精通CI/CD,我們需要對運維更為加熟悉。DevOps運動將開發(fā)所能帶來的優(yōu)勢與傳統運維相結合,這是一個顯著的改善。但我認為這還不夠。如果想要獲得CI/CD所能帶來的全部好處,我們需要深入理解架構、測試、開發(fā)、運維,甚至客戶洽談,并做出相應的改變。用DevOps這個名字來概括CI/CD其實是不合適的,因為DevOps不僅僅關系到開發(fā)和運維,其還關系到軟件開發(fā)的所有方面,需要架構師、測試人員,甚至管理者的共同參與。DevOps將傳統運維與開發(fā)相結合是一個巨大的進步。就當前的業(yè)務需求而言,手工運維幾乎是行不通的,而自動化需要開發(fā)工作。我認為應該擴展DevOps的定義。我本打算把它重新命名為DevOpsArchTestManageAndEverythingElse,但這個名字過于繁瑣而且?guī)缀醪豢赡茏x出來,因此我用DevOps 2.0來代替。DevOps 2.0不但要實現運維自動化,而且要讓整個系統變得自動化、快速、可擴展、容錯、零宕機、易于監(jiān)控。這無法通過某個單一的工具實現,只能通過深入到技術層面和流規(guī)層面重構整個系統來實現。
本書介紹快速構建現代軟件系統的方法,我們將微服務打包成不可變的容器,通過配置管理工具實現自動化測試和持續(xù)部署,同時保證零停機且隨時能回滾。設計能夠從硬件和軟件故障中恢復的自愈系統,采用集中日志對集群進行記錄和監(jiān)控,輕松實現服務器擴展。
換言之,本書采用業(yè)界新的工具和方法開展微服務開發(fā)與部署。我們將用到Docker、Kubernetes、Ansible、Ubuntu、Docker Swarm、Docker Compose、Consul、etcd、Registrator、confd、Jenkins。
本書是寫給那些對持續(xù)部署和微服務感興趣的專業(yè)人士看的,涉及的內容非常寬泛,目標讀者包括想了解如何圍繞微服務設計系統的架構師,想了解如何應用現代配置管理實踐和持續(xù)部署容器化應用的DevOps人員,希望將整個流程掌控在自己手中的開發(fā)人員,以及想要更好地理解軟件交付流程的管理人員。我們會談及系統的擴展和監(jiān)控,。我們甚至會設計(并實現)能夠從(硬件或軟件)故障中自愈的系統。
本書內容涉及從設計、開發(fā)、測試、部署到運維的所有階段。我們介紹的流程是業(yè)界新的佳實踐。
第1章 DevOps的理想 1
1.1 持續(xù)集成、交付和部署 2
架構 3
部署 4
編排 5
1.2 部署流水線的曙光 5
第2章 實現突破持續(xù)部署、微服務和容器 7
2.1 持續(xù)集成 7
推送到代碼庫 9
靜態(tài)分析 10
部署前測試 12
打包并部署到測試環(huán)境 13
部署后測試 13
2.2 持續(xù)交付和部署 15
微服務 18
容器 18
2.3 三個火槍手持續(xù)部署、微服務和容器的協作 20
第3章 系統架構 23
3.1 單塊應用 24
微服務 27
3.2 單塊應用與微服務的比較
29
運維和部署的復雜性 30
規(guī)模 31
部署、回滾和故障隔離 32
承諾期限 32
3.3 微服務的最佳實踐 41
容器 41
3.4 代理微服務或API網關 44
反向代理 44
極簡主義方法 45
配置管理 45
跨職能團隊 45
API版本化 46
最后的思考 46
第4章 使用Vagrant和Docker搭建開發(fā)環(huán)境 49
4.1 結合微服務架構和容器技術
50
Vagrant與Docker 52
4.2 開發(fā)環(huán)境搭建 55
開發(fā)環(huán)境使用 58
第5章 部署流水線的實現初始階段 63
5.1 啟動持續(xù)部署虛擬機 63
5.2 部署流水線步驟 65
構建Docker容器 67
第6章 Docker世界中的配置管理 79
6.1
CFEngine 79
Puppet 80
Chef 80
最后幾點思考 82
配置生產環(huán)境 83
設置Ansible Playbook 86
第7章 部署管道的實現中間階段
91
7.1 在生產服務器上部署容器
92
檢查清單 97
第8章 發(fā)現服務分布式服務的關鍵 99
8.1 服務注冊表 101
服務注冊 101
主動注冊 102
注冊服務 103
服務發(fā)現 103
服務發(fā)現工具 104
手動配置 106
Zookeeper 106
etcd 107
配置Registrator 130
Consul Health Checks、Web UI和數據中心 138
8.2 服務發(fā)現工具的比較 141
第9章 代理服務 143
9.1 反向代理服務 144
代理服務對我們的項目有何幫助 146
nginx 146
nginx 146
HAProxy 158
9.2 代理工具的比較 163
第10章 部署流水線的實現后期階段 167
10.1
啟動容器 169
10.2
集成服務 170
10.3
運行部署后測試 171
10.4
將測試容器推送到鏡像庫 172
10.5
檢查表 173
第11章 部署流水線的自動化實現
175
11.1
部署流水線的步驟 175
Playbook和Role 178
部署前任務 179
部署任務 182
部署后任務 185
11.2
運行自動部署流水線 186
第12章 持續(xù)集成、交付和部署的工具
187
12.1
CI/CD工具對比 188
CI/CD工具的簡史 189
運行Jenkins作業(yè) 203
創(chuàng)建Jenkins Workflow作業(yè) 206
安裝Jenkins Multibranch Workflow和Jenkinsfile 215
最后的想法 217
第13章 藍綠部署 219
13.1
藍綠部署的流程 220
13.2
手動執(zhí)行藍綠部署 223
部署藍色版本 224
集成藍色版本 226
部署綠色版本 228
集成綠色版本 230
移除藍色版本 231
發(fā)現應部署哪個版本以及回滾 233
13.3
使用Jenkins workflow自動化藍綠部署 239
藍綠部署角色 240
運行藍綠部署 245
第14章 服務集群和擴展 249
14.1
可擴展性 250
軸線擴展 252
集群 254
Docker集群工具大比拼Kubernetes、Docker Swarm和
Mesos對比 256
搭建 258
運行容器 260
選擇 262
14.2
Docker Swarm漫步 263
14.3
搭建Docker Swarm 268
使用Docker Swarm部署 274
使用Docker Swarm無鏈接部署 275
使用Docker Swarm和Docker Networking部署 276
使用Docker Swarm擴展服務 283
根據預留的CPU和內存調度容器 284
14.4
使用Docker Swarm和Ansible自動化部署 288
檢驗Swarm部署playbook 290
第15章 自我修復系統 297
15.1
自我修復等級和類型 298
應用程序級別的自我修復 299
系統級別的自我修復 300
硬件級別的自我修復 302
反應式自我修復 303
預防式自我修復 303
15.2
自我修復架構 305
15.3
Docker、Consul Watches和Jenkins組成的自我修復系統 311
搭建環(huán)境 311
15.4
自動設置Consul健康檢查和watches來監(jiān)測硬件 322
15.5
預設擴展和收縮的預防式自我修復 334
采用Docker重啟策略的預防式自我修復 339
將On-Premise與云節(jié)點結合 341
15.6
自我修復系統(到目前為止)總結 342
第16章 集中日志和監(jiān)控 343
16.1
集中日志的需求 344
16.2
向ElasticSearch發(fā)送日志條目 347
解析文件條目 354
發(fā)送日志條目到集中式LogStash 358
發(fā)送Docker日志條目到集中式LogStash實例 363
16.3
基于軟件數據的自修復系統 375
硬件狀態(tài)日志 381
基于硬件數據的自修復系統 388
最后的想法 388
第17章 結語 391
附錄A Docker Flow 393
A.1 背景 394
標準搭建環(huán)境 394
問題 396
Docker Flow漫談 398
零停機事件部署新版本 404
索引 415