·Python基礎(chǔ)知識,簡單介紹語言特性。
·如何自動處理文本,編寫命令行工具和自動處理文件系統(tǒng)。
·Linux實用程序、包管理、構(gòu)建系統(tǒng)、監(jiān)控、監(jiān)測和自動化測試。
·云計算、IaC、Kubernetes和Serverless。
·站在DevOps的角度探討機(jī)器學(xué)習(xí)和數(shù)據(jù)工程。
·構(gòu)建、部署和優(yōu)化一個機(jī)器學(xué)習(xí)項目。
前言
一次,Noah 在海中游泳,突然一波海浪襲來,把他卷入深水,無法呼吸。他掙扎著,奮力游出水面,可是海浪一波未平一波又侵襲而來。他的體力漸漸不支,慢慢沉入海中。而他沒有放棄,還在拼命掙扎,但是海浪并沒有停歇的意思。在與海浪的殊死搏斗中,他的體力所剩無幾,他不知道自己會不會命喪于此。他無法呼吸,渾身無力,真害怕自己會溺水身亡。直面死亡的恐懼使他認(rèn)識到,要想活命就必須保存體力、隨波逐流,不能一味掙扎。
不使用DevOps 的初創(chuàng)企業(yè)就像Noah 那一次的經(jīng)歷一樣,讓人心驚膽戰(zhàn)。生產(chǎn)環(huán)境中的火情頻繁,幾個月得不到解決;一切都是手動操作的,連續(xù)幾天被警報消息吵醒……這樣的問題持續(xù)下去,犧牲的只能是你的健康。脫離死亡漩渦的唯一出路就是DevOps。
萬事開頭難,逐個解決問題,總有一天能打通整個環(huán)節(jié)?梢韵却罱ㄒ粋服務(wù)器,著手測試代碼,并把目前手動執(zhí)行的任務(wù)自動化。一定要做點什么,做什么都可以,重要的是行動。先把第一步走穩(wěn),而且要實現(xiàn)自動化。
初創(chuàng)企業(yè),也可以說所有公司面臨的一個共通性問題是,總想尋求“救世主”來解決問題。性能有瓶頸:“我們需要性能工程師”;銷售不利:“我們需要首席營收官”;部署流程不暢:“我們需要DevOps 工程師”。
在某公司,Noah 的一個項目持續(xù)了一年多,期間使用不同語言重寫了三次Web 應(yīng)用。
現(xiàn)在只需要找一個“性能工程師”掃尾了。記得當(dāng)時只有筆者初生牛犢不怕虎,問了句“性能工程師是做什么的”。性能工程師負(fù)責(zé)解決一切彈性伸縮問題。那一刻,Noah 突然認(rèn)識到,他們是在尋找“救世主”。對救世主的依賴最能揭示新產(chǎn)品或初創(chuàng)企業(yè)危機(jī)四伏的狀況。連自己都拯救不了的人何談?wù)日麄公司。
在其他一些公司,Noah 經(jīng)常聽到這樣的抱怨:“要是能雇一個資深Erlang 工程師多好”“要是能雇一個人幫我們增加營收多好”“要是能雇一個人教我們規(guī)范財務(wù)制度多好”“要是能雇一個Swift 開發(fā)者多好”……難道多雇這么一個人,你的初創(chuàng)企業(yè)或新產(chǎn)品就能存活下來嗎?即便真有這樣的救世主,也要找到癥結(jié)所在方能力挽狂瀾。
對于寄希望于雇一位性能工程師的公司來說,真正的癥結(jié)在于技術(shù)監(jiān)督不力,在于用人不當(dāng)(對真正能解決問題的人大喊大叫是解決不了問題的)。工作表現(xiàn)不好的人就解雇,讓知道如何解決問題的團(tuán)隊成員發(fā)聲,推翻當(dāng)前的工作清單從頭來過,調(diào)入合格的工程管理人員,這樣性能問題將迎刃而解,根本不用救世主降臨。
在創(chuàng)業(yè)的路上,不要指望別人;你和你所在的團(tuán)隊要設(shè)法保護(hù)自己,通力合作,規(guī)范流程,篤信未來。遇到問題,不是再雇一個人就能解決的;出現(xiàn)問題,要客觀、認(rèn)真地分析,找出根源所在,一步一步地行動,最終找到解決方案。求人不如求己,根本沒什么救世主。
就像在風(fēng)暴中即將溺水的人一樣,能拯救你(或公司)的人只有你自己。你就是公司要找的那個救世主,或許你會發(fā)現(xiàn),你的同事也是。
混亂的狀況也是有出路的,且聽我們慢慢道來。
DevOps 在筆者心中的含義
軟件行業(yè)中很多抽象的概念是無法準(zhǔn)確定義的,云計算、敏捷和大數(shù)據(jù)就是如此,這些概念如何定義,取決于參與討論的是哪些人。鑒于此,筆者不打算給DevOps下一個嚴(yán)格的定義。下面簡單說一下DevOps 出現(xiàn)的必然因素:
?? 開發(fā)和運維團(tuán)隊雙向合作。
?? 把幾天甚至幾周的運維任務(wù)精簡到幾分鐘到幾小時。
?? 讓開發(fā)人員積極參與,不然還是開發(fā)與運維各自為戰(zhàn)。
?? 運維人員需要具備一定的開發(fā)技能,至少要懂Bash 和Python。
?? 開發(fā)人員需要具備一定的運維技能。開發(fā)人員的職責(zé)不限于編寫代碼,還要負(fù)責(zé)把系統(tǒng)部署到生產(chǎn)環(huán)境并監(jiān)控異常。
?? 自動化、自動化、自動化。不掌握開發(fā)技能無法準(zhǔn)確實現(xiàn)自動化,不掌握運維技能無法正確實現(xiàn)自動化。
?? 轉(zhuǎn)變觀念,讓開發(fā)人員掌握話語權(quán),至少要能自主部署代碼。
?? 可通過CI/CD 流水線實現(xiàn)。
?? GitOps。
?? 在開發(fā)和運維部門之間共享一切(工具、知識等)。
?? 在設(shè)計、實現(xiàn)、部署和自動化上持續(xù)協(xié)作,合作是成功的基石。
?? 不能自動化執(zhí)行的操作讓人心里不踏實。
?? 文化:等級制度< 流程。
?? 多個微服務(wù)> 巨型單體。
?? 持續(xù)部署系統(tǒng)是軟件團(tuán)隊的核心和靈魂。
?? 沒有救世主。
?? 持續(xù)交付不是可選項,而是必達(dá)的命令。
如何閱讀本書
本書可按任意順序閱讀。隨便翻看一章,你都會找到對你的工作有所幫助的內(nèi)容。有經(jīng)驗的Python 程序員可以跳過第1 章。如果你對慘痛經(jīng)驗、案例分析和人物訪談感興趣,可以先閱讀最后一章。
內(nèi)容結(jié)構(gòu)
本書內(nèi)容按討論話題的不同分為以下幾部分。
第一部分介紹Python 基礎(chǔ),涵蓋語言基礎(chǔ)知識、文件和文件系統(tǒng)的自動化處理及命令行工具的編寫。
第二部分討論運維技術(shù),涵蓋Linux 實用程序、包管理、構(gòu)建系統(tǒng)、監(jiān)控和監(jiān)測,以及自動化測試。這些是勝任DevOps 工作的必備技能。
第三部分介紹云技術(shù)基礎(chǔ),涉及云計算、IaC、容器技術(shù)、Kubernetes 和Serverless。
目前,軟件行業(yè)緊缺掌握云技術(shù)的人才。掌握這一部分的知識,你的薪水和事業(yè)都將更上一層樓。
第四部分討論數(shù)據(jù)處理,在DevOps 的背景下介紹機(jī)器學(xué)習(xí)運維和數(shù)據(jù)工程。這一部分還有一個完整的演練項目,你可以使用Flask、Sklearn、Docker 和Kubernetes實踐機(jī)器學(xué)習(xí)模型的構(gòu)建、部署和落地。
第五部分即最后一章,是DevOps 慘痛經(jīng)驗、案例分析、人物訪談。這一章適合睡前閱讀。
Python 基礎(chǔ)
?? 第1 章 Python DevOps 基礎(chǔ)知識。
?? 第2 章 文件和文件系統(tǒng)自動化處理。
?? 第3 章 使用命令行。
運維技術(shù)
?? 第4 章 Linux 實用程序。
?? 第5 章 包管理。
?? 第6 章 持續(xù)集成和持續(xù)部署。
?? 第7 章 監(jiān)控和日志。
?? 第8 章 pytest 在DevOps 中的應(yīng)用。
云技術(shù)基礎(chǔ)
?? 第9 章 云計算。
?? 第10 章 IaC。
?? 第11 章 容器技術(shù):Docker 和Docker Compose。
?? 第12 章 容器編排:Kubernetes。
?? 第13 章 Serverless 技術(shù)。
數(shù)據(jù)處理
?? 第14 章 MLOps 和機(jī)器學(xué)習(xí)工程。
?? 第15 章 數(shù)據(jù)工程。
案例分析
?? 第16 章 DevOps 慘痛經(jīng)驗和人物訪談。
排版約定
本書采用下述排版約定:
斜體(Italic)
表示新術(shù)語、URL、電子郵件地址、文件名和擴(kuò)展名。
等寬字體(Constant Width)
表示程序清單,在段落中出現(xiàn)則表示程序元素,如變量、函數(shù)名、數(shù)據(jù)庫、數(shù)據(jù)類型、環(huán)境變量、語句和關(guān)鍵字。
粗體等寬字體(Constant Width Bold)
表示命令或其他由用戶直接輸入的文本。
斜體等寬字體(Constant Width Italic)
表示應(yīng)該替換成用戶提供的值,或者由上下文決定的值。
使用代碼示例
本書的補充材料(代碼示例、練習(xí)題,等等)可到https://pythondevops.com 下載。另外,可到Pragmatic AI Labs 的YouTube 頻道(https://oreil.ly/QIYte)中觀看與本書代碼相關(guān)的DevOps 內(nèi)容。
如有技術(shù)疑問想與作者探討,或者在使用代碼示例過程中遇到問題,請發(fā)電子郵件到technical@pythondevops.com。
本書是要幫你完成工作的。一般來說,如果本書提供了示例代碼,你可以把它用在你的程序或文檔中。除非你使用了很大一部分代碼,否則無須聯(lián)系我們獲得許可。例如,用本書的幾個代碼片段寫一個程序無須獲得許可,銷售或分發(fā)O’Reilly 圖書的示例光盤則需要獲得許可;引用本書中的示例代碼回答問題無須獲得許可,將書中大量的代碼放到你的產(chǎn)品文檔中則需要獲得許可。
我們很希望但并不強制要求你在引用本書內(nèi)容時加上引用說明。引用說明一般包括書名、作者、出版社和ISBN。例如:“Python for DevOps by Noah Gift, Kennedy Behrman, Alfredo Deza, and Grig Gheorghiu. (O'Reilly). Copyright 2020 Noah Gift,Kennedy Behrman, Alfredo Deza, Grig Gheorghiu, 978-1-492-05769-7.”。
如果你覺得自己對示例代碼的用法超出了上述許可的范圍,請通過permissions@oreilly.com 與我們聯(lián)系。
O’Reilly 在線學(xué)習(xí)平臺(O’Reilly Online Learning)
近40 年來,O’Reilly Media 致力于提供技術(shù)和商業(yè)培訓(xùn)、知識和卓越見解,來幫助眾多公司取得成功。
我們有一群獨家專家和創(chuàng)新者,他們通過圖書、文章、會議和在線學(xué)習(xí)平臺分享知識和技術(shù)。O’Reilly 的在線學(xué)習(xí)平臺提供按需訪問的直播培訓(xùn)課程、詳細(xì)的學(xué)習(xí)路徑、交互式編程環(huán)境,以及由O’Reilly 和其他200 多家出版社出版的書籍和視頻。詳情請訪問http://oreilly.com。
聯(lián)系我們
任何有關(guān)本書的意見或疑問,請按照以下地址聯(lián)系出版社。
美國:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中國:
北京市西城區(qū)西直門南大街2 號成銘大廈C 座807 室(100035)
奧萊利技術(shù)咨詢(北京)有限公司
勘誤、示例和其他信息可到oreil.ly/python-for-devops 上獲取。
對于本書的評論或技術(shù)性問題,請發(fā)送電子郵件到:bookquestions@oreilly.com
要了解O’Reilly 圖書、培訓(xùn)課程、會議和新聞的信息,請訪問以下網(wǎng)站:
http://www.oreilly.com
我們的Facebook:http://facebook.com/oreilly。
我們的Twitter:http://twitter.com/oreillymedia。
我們的YouTube:http://www.youtube.com/oreillymedia。
致謝
首先,筆者要感謝本書的兩位主要技術(shù)審校。
第一位是Wes Novack,他是一名架構(gòu)師和工程師,擅長公有云系統(tǒng)和Web 級SaaS應(yīng)用。他負(fù)責(zé)設(shè)計、構(gòu)建和管理復(fù)雜的系統(tǒng),為托管在AWS 和GCP 上使用不同語言的大型微服務(wù)生態(tài)系統(tǒng)實現(xiàn)高可用性基礎(chǔ)設(shè)施、持續(xù)交付流水線和快速發(fā)布。Wes 使用不同的語言、框架和工具定義Iac、推動自動化及減少勞作。他在技術(shù)社區(qū)十分活躍,并積極參與教學(xué)、研討會和會議;他還是Pluralsight 視頻教程的講師。Wes 是DevOps 領(lǐng)域文化– 自動化– 精益– 度量– 分享(culture, automation, lean,measurement, Sharing,CALMS)模型的倡導(dǎo)者。他的Twitter 賬號是@WesleyTech,博客地址是https://wesnovack.com。
第二位是Brad Andersen,他是一名軟件工程師和架構(gòu)師,已從事軟件設(shè)計和開發(fā)30 年。他是變革和創(chuàng)新的引路人,曾在各種企業(yè)組織和初創(chuàng)企業(yè)中擔(dān)任領(lǐng)導(dǎo)職務(wù)和開發(fā)人員。Brad 目前在加利福尼亞大學(xué)伯克利分校攻讀數(shù)據(jù)科學(xué)碩士學(xué)位。Brad 的更多信息見他的LinkedIn 個人資料。
筆者還要感謝Jeremy Yabrow 和Colin B. Erdman,感謝他們提供的建議和反饋。
Noah
感謝與我合寫本書的Grig、Kennedy 和Alfredo。與如此高效的團(tuán)隊合作真是讓人心曠神怡。
Kennedy
感謝與我合寫本書的各位,與你們合作特別愉快。感謝家人對我的耐心和理解。
Alfredo
寫作本書的九年前,即2010 年,我找到了人生第一份軟件工程工作。那一年我31 歲,沒有大學(xué)學(xué)歷,以前也沒有從業(yè)經(jīng)驗,只能接受底薪,忍受沒有醫(yī)療保險。我學(xué)到了很多,遇見了許多了不起的人,通過不懈地努力掌握了大量專業(yè)知識。那些年,如果沒有人給我機(jī)會,沒有人為我指明方向,我不可能有今天的成就。
感謝Chris Benson,他發(fā)現(xiàn)了我對知識的渴望,一直為我尋找學(xué)習(xí)的機(jī)會。
感謝Alejandro Cadavid,他發(fā)現(xiàn)我不辭辛勞,總是愿意做那些別人不愿意做的事。
在我感到心灰意冷,旁人覺得我一無是處時,是您幫我找到了工作。
Carlos Coll 帶領(lǐng)我進(jìn)入編程領(lǐng)域,在我自暴自棄時也沒有放棄我。學(xué)習(xí)編程改變了我的生活,感謝Carlos 對我諄諄教導(dǎo),督促我學(xué)習(xí),指導(dǎo)我發(fā)布了人生第一個程序。
感謝Joni Benton,感謝他對我的信任,還幫我找到了第一份全職工作。
感謝Jonathan LaCour,他是一位鼓舞人心的老板,一直幫助我提升自我。您的建議珍貴無比。
感謝Noah,我們建立了深厚的友誼,您的指引是我巨大的動力源泉。我一直記得我們一起工作的日子,尤其是從頭開始重新構(gòu)建基礎(chǔ)設(shè)施那次。在我還對Python 一無所知時,您的耐心和指導(dǎo)完全改變了我的生活。
最后,特別感謝我的家人。感謝我的妻子Claudia,她從不懷疑我的學(xué)習(xí)能力和上進(jìn)心,在我筆耕不輟時毫無怨言。感謝我的孩子們,Efrain、Ignacio 和Alana,我愛你們。
Grig
感謝所有開源軟件的創(chuàng)作人員。沒有他們,我們的工作將充滿崎嶇。同樣感謝所有寫作博文、免費分享知識的人。最后,感謝與我合寫本書的各位,這是一次充滿樂趣的旅程。
Noah Gift是西北大學(xué)和杜克大學(xué)研究生院數(shù)據(jù)科學(xué)專業(yè)與工程項目的講師和顧問。
Kennedy Behrman是一位資深顧問,專門為初創(chuàng)企業(yè)設(shè)計和實施云解決方案。
Alfredo Deza是一位軟件工程師和開源軟件開發(fā)者,他重建了公司的基礎(chǔ)設(shè)施。
Grig Gheorghiu是一名程序員、研究實驗室主任、系統(tǒng)/網(wǎng)絡(luò)/安全架構(gòu)師和軟件測試工程師。
目錄
前言 . 1
第1 章 Python DevOps 基礎(chǔ)知識 11
1.1 安裝和運行Python 12
1.1.1 Python shell 12
1.1.2 Jupyter Notebooks13
1.2 過程式程序設(shè)計 13
1.2.1 變量 14
1.2.2 基本的數(shù)學(xué)運算 15
1.2.3 注釋 15
1.2.4 內(nèi)置函數(shù)16
1.3 執(zhí)行控制 17
1.3.1 if/elif/else .17
1.3.2 for 循環(huán) .18
1.3.3 while 循環(huán) 20
1.4 處理異常 20
1.5 內(nèi)置對象 21
1.5.1 對象是什么 .21
1.5.2 對象的方法和屬性 22
1.5.3 序列 23
1.6 函數(shù) .35
1.6.1 函數(shù)剖析36
1.6.2 函數(shù)是對象 .37
1.6.3 匿名函數(shù)38
1.7 使用正則表達(dá)式 39
1.7.1 搜索 39
1.7.2 字符集合40
1.7.3 字符類 41
1.7.4 分組 41
1.7.5 具名分組42
1.7.6 查找所有42
1.7.7 查找迭代器 .42
1.7.8 替換 43
1.7.9 編譯 43
1.8 惰性求值 44
1.8.1 生成器 44
1.8.2 生成器推導(dǎo) .45
1.9 更多IPython 功能 .46
1.9.1 在IPython 中運行UNIX shell 命令46
1.9.2 使用IPython 的魔法命令 47
1.10 練習(xí)題 .47
第2 章 文件和文件系統(tǒng)自動化處理 49
2.1 讀寫文件 49
2.2 使用正則表達(dá)式搜索文本 .59
2.3 處理大型文件 .61
2.4 加密文本 62
2.4.1 哈希和hashlib 63
2.4.2 使用Cryptography 庫加密 63
2.5 os 模塊 65
2.6 使用os.path 管理文件和目錄 .67
2.7 使用os.walk 遍歷目錄樹 70
2.8 使用pathlib 處理路徑對象 71
第3 章 使用命令行 . 73
3.1 使用shell 73
3.1.1 使用sys 模塊探知系統(tǒng)信息 73
3.1.2 使用os 模塊處理操作系統(tǒng) .74
3.1.3 使用subprocess 模塊派生進(jìn)程 .75
3.2 編寫命令行工具 77
3.2.1 使用sys.argv .79
3.2.2 使用argparse .81
3.2.3 使用click .85
3.2.4 使用fire 90
3.2.5 實現(xiàn)插件系統(tǒng) 95
3.3 案例分析:使用命令行工具提速Python 96
3.3.1 使用Numba JIT 編譯器 97
3.3.2 通過Python CUDA 使用GPU 99
3.3.3 使用Numba 真正多核多線程運行Python 代碼 100
3.3.4 k 均值聚類算法 .101
3.4 練習(xí)題 .103
第4 章 Linux 實用程序 105
4.1 磁盤實用程序 106
4.1.1 衡量性能106
4.1.2 分區(qū) .108
4.1.3 獲取特定的設(shè)備信息 109
4.2 網(wǎng)絡(luò)實用程序 111
4.2.1 SSH 隧道 111
4.2.2 使用Apache Benchmark(ab)評測HTTP . 112
4.2.3 使用molotov 做負(fù)載測試 . 113
4.3 CPU 實用程序 . 116
4.3.1 CPU 實用程序簡介 116
4.3.2 使用htop 查看進(jìn)程 . 116
4.4 使用Bash 和ZSH 118
4.4.1 自定義Python shell . 119
4.4.2 遞歸路徑模式匹配 120
4.4.3 搜索和替換確認(rèn)提示 120
4.4.4 刪除Python 臨時文件 122
4.4.5 列出和篩選進(jìn)程 122
4.4.6 UNIX 時間戳 123
4.5 Python 與Bash 和ZSH 混合使用 124
4.5.1 隨機(jī)密碼生成器 124
4.5.2 這個模塊是否存在 125
4.5.3 進(jìn)入模塊所在的目錄 125
4.5.4 把CSV 文件轉(zhuǎn)換成JSON 文件 .126
4.6 Python 單行程序 .127
4.6.1 調(diào)試器 127
4.6.2 這段代碼的運行速度有多快 128
4.7 strace .129
4.8 練習(xí)題 .131
4.9 實操題 .132
第5 章 包管理 133
5.1 打包簡介 .134
5.1.1 打包的重要性 .134
5.1.2 何時不需要打包 134
5.2 打包準(zhǔn)則 .135
5.2.1 恰當(dāng)?shù)陌姹咎?.135
5.2.2 更改日志136
5.3 選擇一種策略 137
5.4 打包方案 .138
5.4.1 Python 原生包 138
5.4.2 Debian 包 145
5.4.3 RPM 包 153
5.5 使用systemd 管理服務(wù) 160
5.5.1 長時間運行的進(jìn)程 161
5.5.2 創(chuàng)建項目161
5.5.3 systemd 單元文件 .163
5.5.4 安裝單元164
5.5.5 處理日志166
5.6 練習(xí)題 .167
5.7 實操題 .168
第6 章 持續(xù)集成和持續(xù)部署 . 169
6.1 真實案例分析:把維護(hù)不善的WordPress 網(wǎng)站轉(zhuǎn)換成Hugo 169
6.1.1 設(shè)置Hugo .171
6.1.2 把WordPress 文章轉(zhuǎn)換成Hugo 文章 .172
6.1.3 創(chuàng)建并更新Algolia 索引 174
6.1.4 使用Makefile 編排流程 176
6.1.5 使用AWS CodePipeline 部署 .176
6.2 真實案例分析:使用Google Cloud Build 把Python 應(yīng)用部署到
Google App Engine 中 178
6.3 真實案例分析:NFSOPS 185
第7 章 監(jiān)控和日志 187
7.1 構(gòu)建可靠系統(tǒng)的關(guān)鍵概念 187
7.2 不可變的DevOps 原則 188
7.2.1 集中處理日志 .188
7.2.2 案例分析:生產(chǎn)數(shù)據(jù)庫塞滿硬盤 .189
7.2.3 自建還是購買? 190
7.2.4 容錯 .190
7.3 監(jiān)控 192
7.3.1 Graphite .192
7.3.2 StatsD .192
7.3.3 Prometheus 193
7.4 監(jiān)測程序 .197
7.4.1 監(jiān)測程序概述 .197
7.4.2 命名約定200
7.5 日志 201
7.5.1 為什么很難 202
7.5.2 basicconfig 202
7.5.3 深度配置203
7.5.4 常用模式208
7.6 ELK 棧 .209
7.6.1 Logstash .210
7.6.2 Elasticsearch 和Kibana .212
7.7 練習(xí)題 .215
7.8 實操題 .216
第8 章 pytest 在DevOps 中的應(yīng)用 217
8.1 測試小鋼炮pytest 217
8.2 pytest 入門 .218
8.2.1 使用pytest 測試 218
8.2.2 與unittest 的區(qū)別 .220
8.3 pytest 特性 .222
8.3.1 conftest.py 223
8.3.2 出色的assert223
8.3.3 參數(shù)化 225
8.4 固件 226
8.4.1 入門 .227
8.4.2 內(nèi)置固件229
8.5 基礎(chǔ)設(shè)施測試 231
8.5.1 什么是系統(tǒng)驗證 232
8.5.2 Testinfra 簡介 .233
8.5.3 連接遠(yuǎn)程節(jié)點 .233
8.5.4 特性和特殊固件 237
8.5.5 案例 .238
8.6 使用pytest 測試Jupyter Notebooks 241
8.7 練習(xí)題 .242
8.8 實操題 .242
第9 章 云計算 243
9.1 云計算基礎(chǔ)知識 .244
9.2 云計算的類型 246
9.3 云服務(wù)的類型 246
9.3.1 IaaS 247
9.3.2 MaaS 251
9.3.3 PaaS .251
9.3.4 Serverless 252
9.3.5 SaaS .255
9.4 IaC .256
9.5 持續(xù)交付 .256
9.6 虛擬化和容器 256
9.6.1 硬件虛擬化 256
9.6.2 SDN .257
9.6.3 SDS .257
9.6.4 容器 .257
9.7 分布式計算面臨的挑戰(zhàn)和機(jī)遇 258
9.8 云時代Python 的并發(fā)、性能和進(jìn)程管理 260
9.9 進(jìn)程管理 .261
9.9.1 使用subprocess 管理進(jìn)程 261
9.9.2 使用multiprocessing 庫解決問題 .263
9.9.3 使用Pool() 派生進(jìn)程 264
9.9.4 FaaS 和Serverless 267
9.9.5 使用Numba 提升Python 的性能 267
9.9.6 使用Numba JIT 編譯器 .267
9.9.7 使用高性能服務(wù)器 268
9.10 小結(jié) 269
9.11 練習(xí)題 269
9.12 實操題 270
第10 章 IaC 271
10.1 基礎(chǔ)設(shè)施自動化工具分類 272
10.2 手動配置 274
10.3 使用Terraform 自動配置基礎(chǔ)設(shè)施 .275
10.3.1 配置S3 bucket .276
10.3.2 使用ACM 配置SSL 證書 .279
10.3.3 配置Amazon CloudFront 分配 280
10.3.4 配置Route 53 DNS 記錄 283
10.3.5 把靜態(tài)文件復(fù)制到S3 中 284
10.3.6 刪除使用Terraform 配置的所有AWS 資源 .285
10.4 使用Pulumi 自動配置基礎(chǔ)設(shè)施285
10.4.1 為AWS 新建一個Pulumi Python 項目 286
10.4.2 為過渡堆棧創(chuàng)建配置值 291
10.4.3 配置一個ACM SSL 證書 291
10.4.4 配置Route 53 區(qū)域和DNS 記錄 292
10.4.5 配置一個CloudFront 分配 .295
10.4.6 為網(wǎng)站的URL 配置一個Route 53 DNS 記錄 296
10.4.7 創(chuàng)建并部署一個新堆棧 297
10.5 練習(xí)題 300
第11 章 容器技術(shù):Docker 和Docker Compose 301
11.1 Docker 容器是什么 .302
11.2 創(chuàng)建、構(gòu)建、運行及刪除Docker 映像和容器 .302
11.3 把Docker 映像發(fā)布到Docker 注冊處中 .306
11.4 使用相同的映像在不同的宿主機(jī)中運行Docker 容器 308
11.5 使用Docker Compose 運行多個Docker 容器 310
11.6 把Docker Compose 運行的服務(wù)移植到新主機(jī)和操作系統(tǒng)中 323
11.7 練習(xí)題 327
第12 章 容器編排:Kubernetes . 329
12.1 Kubernetes 相關(guān)概念簡述 330
12.2 使用Kompose 根據(jù)docker-compose.yaml 創(chuàng)建Kubernetes 清單 331
12.3 使用minikube 把Kubernetes 清單部署到本地Kubernetes 集群 .333
12.4 在GCP 中使用Pulumi 創(chuàng)建GKE Kubernetes 集群 349
12.5 把Flask 示例應(yīng)用部署到GKE 中 352
12.6 安裝Helm chart Prometheus 和Grafana 359
12.7 銷毀GKE 集群 .364
12.8 練習(xí)題 365
第13 章 Serverless 技術(shù) 367
13.1 把同一個Python 函數(shù)部署到三大云服務(wù)商中 .370
13.1.1 安裝Serverless 框架 .370
13.1.2 把Python 函數(shù)部署到AWS Lambda 中 .370
13.1.3 把Python 函數(shù)部署到Google Cloud Functions 中 373
13.1.4 把Python 函數(shù)部署到Azure 中 380
13.2 把Python 函數(shù)部署到自托管的FaaS 平臺中 384
13.2.1 把Python 函數(shù)部署到自托管的PaaS 平臺的優(yōu)勢 384
13.2.2 把Python 函數(shù)部署到OpenFaaS 中 .385
13.3 使用AWS CDK 配置DynamoDB 數(shù)據(jù)表、Lambda 函數(shù)和
API 網(wǎng)關(guān)方法 .393
13.4 練習(xí)題 415
第14 章 MLOps 和機(jī)器學(xué)習(xí)工程 417
14.1 機(jī)器學(xué)習(xí)是什么 417
14.1.1 監(jiān)督型機(jī)器學(xué)習(xí) .417
14.1.2 建模 420
14.2 Python 機(jī)器學(xué)習(xí)生態(tài)環(huán)境 423
14.2.1 Python 機(jī)器學(xué)習(xí)框架和生態(tài)系統(tǒng) 423
14.2.2 PyTorch 深度學(xué)習(xí) 424
14.3 機(jī)器學(xué)習(xí)云平臺 428
14.4 機(jī)器學(xué)習(xí)成熟模型 429
14.4.1 機(jī)器學(xué)習(xí)重點術(shù)語 .429
14.4.2 第1 層:問題構(gòu)建、范圍界定和問題定義 430
14.4.3 第2 層:持續(xù)交付數(shù)據(jù) 431
14.4.4 第3 層:持續(xù)交付凈化數(shù)據(jù) .432
14.4.5 第4 層:持續(xù)交付探索性數(shù)據(jù)分析 434
14.4.6 第5 層:持續(xù)交付傳統(tǒng)機(jī)器學(xué)習(xí)和AutoML 434
14.4.7 第6 層:機(jī)器學(xué)習(xí)運作反饋環(huán) 435
14.5 使用Docker 和Kubernetes 部署sklearn Flask 應(yīng)用 435
14.5.1 EDA 440
14.5.2 建模 441
14.5.3 調(diào)整GBM 縮放 442
14.5.4 擬合模型 .443
14.5.5 評估 444
14.5.6 adhoc_predict 445
14.5.7 JSON 工作流 446
14.5.8 縮放輸入 .446
14.5.9 adhoc_predict 447
14.5.10 縮放輸入 448
14.6 練習(xí)題 448
14.7 實操題 449
14.8 學(xué)習(xí)評價 449
第15 章 數(shù)據(jù)工程 . 451
15.1 小數(shù)據(jù) 452
15.1.1 小數(shù)據(jù)與大數(shù)據(jù) .452
15.1.2 處理小數(shù)據(jù)文件 .452
15.2 寫文件 453
15.3 讀文件 453
15.4 使用生成器流水線逐行讀取和處理 453
15.5 使用YAML .454
15.6 大數(shù)據(jù) 455
15.7 大數(shù)據(jù)工具、組件和平臺 457
15.7.1 數(shù)據(jù)源 .458
15.7.2 文件系統(tǒng) .458
15.7.3 數(shù)據(jù)存儲 .459
15.7.4 實時流式采集 460
15.8 案例分析:自制數(shù)據(jù)流水線 461
15.9 Serverless 數(shù)據(jù)工程 462
15.9.1 使用AWS Lambda 處理CloudWatch 事件 463
15.9.2 使用Amazon CloudWatch 日志分析AWS Lambda 463
15.9.3 使用AWS Lambda 填充Amazon Simple Queue Service .464
15.9.4 連接CloudWatch 事件觸發(fā)器 468
15.9.5 創(chuàng)建事件驅(qū)動型lambda .469
15.9.6 從AWS Lambda 中讀取Amazon SQS 事件 .470
15.10 小結(jié) .474
15.11 練習(xí)題 .475
15.12 實操題 .475
第16 章 DevOps 慘痛經(jīng)驗和人物訪談 . 477
16.1 產(chǎn)不出電影的電影廠 .478
16.2 推不出游戲的游戲坊 .480
16.3 耗時60 秒才啟動的Python 腳本 .482
16.4 用緩存和智能監(jiān)測程序澆滅火情 483
16.5 自動化會讓你失業(yè) 484
16.6 DevOps 反模式 .485
16.6.1 反模式:沒有自動化構(gòu)建服務(wù)器 485
16.6.2 盲目行事 .486
16.6.3 協(xié)調(diào)難題不可避免 .486
16.6.4 沒有團(tuán)隊合作 487
16.7 人物訪談 492
16.7.1 Glenn Solomon 492
16.7.2 Andrew Nguyen 493
16.7.3 Gabriella Roman .495
16.7.4 Rigoberto Roche .496
16.7.5 Jonathan LaCour .498
16.7.6 Ville Tuulos 500
16.7.7 Joseph Reis 502
16.7.8 Teijo Holzer 503
16.7.9 Matt Harrison 505
16.7.10 Michael Foord 507
16.8 一些建議 510
16.9 練習(xí)題 511
16.10 挑戰(zhàn)題 . 511
16.11 畢業(yè)項目 511