-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

Kubernetes in Action中文版

( 簡體 字)
作者:七牛容器云團隊類別:1. -> 作業系統 -> 虛擬機(VMWare)
譯者:
出版社:電子工業出版社Kubernetes in Action中文版 3dWoo書號: 50431
詢問書籍請說出此書號!

缺書
NT售價: 740

出版日:12/1/2018
頁數:592
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787121349959
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

推 薦 序
2013 年,Docker 問世,由于其簡練易用的使用范式,極大降低了容器技術的使用門檻,引爆了容器技術,一場轟轟烈烈的由容器帶來的新計算革命開始了。
2014 年,預見到了容器帶來的革命性變化,七牛內部成立了一個新項目——QCOS,全稱為 Qiniu Cloud Operating System(也可以理解為 Qiniu Cluster OperatingSystem),目標是實現一個數據中心操作系統,讓開發人員使用數據中心如同使用一臺機器一樣容易。在當時,Kubernetes 項目也剛剛開始,還在規格設計階段。我們通讀了 Kubernetes 的設計,決定自己干。這是一個非常瘋狂的想法。促使我們決定自己干的原因有兩點 :一是我們存儲也自己干,而且干成了,所以計算自己干,也不無成功的可能 ;二是 Kubernetes 剛開始,一切如果跟隨 Kubernetes,那么我們做起事情來肯定束手束腳,沒辦法按照商業公司的推進速度來推進。
但是做著做著我們就發現,計算不像存儲,計算問題是一個非常開放性的問題。而以容器為核心的計算系統,其復雜性也不同于以虛擬機(VM)為代表的計算系統,因為虛擬機(VM)是以虛擬一臺機器為邊界的,其問題域同樣比較閉合。但是容器計算就是要打破機器的邊界,讓計算力在數據中心內自由調度。這個問題域涉及面非常廣,除了常規的計算力調度、負載均衡、部署升級、服務發現、日志與監控,這些東西都要以全新的方式來解決。
實際上給數據中心做一個操作系統并不是什么新想法。20 世紀 80 年代中期,貝爾實驗室就開啟了一個名為 Plan9 的操作系統項目,目的就是做一個數據中心操作系統。參與這個操作系統的名單都大名鼎鼎 :Rob Pike、Ken Thompson,等等。你沒看錯,就是今天創建了 Go 語言的那幫人。他們在 Plan9 項目解散后被 Google搶了過去,換了一個思路繼續做數據中心操作系統 —— 從面向數據中心的語言開始:Go 語言就這樣誕生了。而隨著 Go 語言的流行,Docker、Kubernetes 接連誕生,繼續續寫著數據中心操作系統的夢想。
Kubernetes 誕生之初,雖然嘴里銜著 Google Borg 系統的金鑰匙,但是同期競爭的項目還是比較多的,除了七牛自己內部發起的 QCOS 外,比較知名的還有 Docker Swam 和 Mesos。但是到了 2016 年,這場競爭越來越趨于 Kubernetes 一統天下。七牛內部 QCOS 項目也放棄了自研,將方向轉向了 Kubernetes 陣營。
QCOS 項目對七牛有著特殊的意義,它是七牛業務多元化的開始。在此之前,七牛秉承專注做好一件事情,著眼于對象存儲一個點,從單點切入,把單點做到極致的思路,獲得了極佳的口碑,大量的移動互聯網應用都選擇了七牛作為它們的圖片和視頻托管的云服務提供商。選擇做 QCOS,實際上是我們在打第二個根據地時,選擇了一條極其艱難的道路。
今天我們 QCOS 團隊(內部已更名為 KIRK 團隊)發起了 Kubernetes in Action一書的翻譯,他們邀請我給譯本作序,我腦子里不由自主想起了這段歷史。選擇基于 Kubernetes,是我們從商業上來說的務實選擇,但是它并不代表放棄自主研發,只是把夢想暫時封存在心里。中國古話說,師夷長技以制夷,別人的好東西我們是要學習的,學好了我們才能完成從模仿到超越的過程。
Kubernetes 的背后,是一場新計算革命,是真正的云計算 2.0,我們期待更多有想法的開發者能夠學習 Kubernetes,能夠加入這場計算革命。也歡迎大家加入七牛。
是為序。
許式偉 七牛云 CEO

譯 者 序
早在 2011 年創業初期,七牛就決定使用 GoLang 作為主要開發語言,那時距離 GoLang 1.0 的正式發布還有將近一年的時間。當時我們就斷定,在分布式時代,GoLang 這種語言必定會大放異彩。今天,七牛的絕大多數線上服務都是用 GoLang實現的,Golang 幫助我們以最高的效率實現應用,快速響應客戶需求。現在,我們也很幸運地看到當前最熱門的開源項目如 Docker、Kubernetes 等,也都是基于GoLang 來實現的。
就像早期擁抱 GoLang 一樣,七牛也是 Docker 和 Kubernetes 技術的堅定擁抱者和踐行者。早在 2014 年,我們就基于 Docker 自研了一套容器集群管理系統,用于圖片、音視頻轉碼應用實例的資源調度,這套系統在線上運行了好幾年,現在正逐漸被 Kubernetes 替代。
Docker 和 Kubernetes 的出現,讓我們發現了構建數據中心操作系統(DCOS)的可能性。Docker 的輕量級、Kubernetes 的靈活性和開放性,能讓我們以 API 調用的方式來交付計算力(包括 CPU、內存、網絡、磁盤等),能讓業務應用擺脫傳統資源交付方式和既往運維手段的束縛,更快捷地得到部署、升級和管理,業務迭代速度大大加快,資源利用率大幅提高。
早在幾年前,我們在七牛就成立了專門的容器云團隊,致力于打造更健壯、更易用的容器集群調度管理系統。現在,我們在七牛內部全面推廣和應用 Kubernetes,不僅把無狀態服務運行在 Kubernetes 中,也把有狀態服務比如數據庫運行在Kubernetes 中,正如使用 GoLang 提高了我們的開發效率一樣,使用 Kubernetes 大大提高了我們的部署和運維效率。
在七牛,我們堅定地認為,Kubernetes 會成為下一個 Linux,但是管理的不再是單臺機器,而是以 DCOS 的方式來管理整個數據中心。熟練地掌握和使用Kubernetes,將成為每個前后端工程師的必備技能,Kubernetes 將成為發布前后端服務的標準途徑。
這本書的翻譯,我們集中了七牛容器云團隊,以及其他七牛內部熱心志愿者的力量,針對翻譯的每個術語我們認真推敲,盡最大可能達到“信”“達”“雅”的程度。鑒于水平有限,難免有紕漏,請讀者諒解。
希望這本書能帶領你進入 Kubernetes 的世界。
參與本書翻譯的七牛容器團隊成員有 :盧興銘(致謝詞、第 1 章)、李雪瓅(第2 章)、路濤(第 3 章)、孫訥敏(第 4 章)、劉巖(第 5 章)、孫毅飛(第 6 章)、林培裕(第 7 章)、周玉壁(第 8 章)、陳凱俊(第 9 章)、楊冠軍(第 10 章)、張欽堯 (第11 章)、況永巧 (第 12 章)、易弢(第 13 章)、王浩宇(第 14 章)、王雪瑞(第 15 章)、屈嘯(第 16 章)、金鑫鑫(第 17 章)、陳忠杰(第 18 章)。由袁曉沛任翻譯組組長,由李雪瓅、馬力、馮義勇負責審校。
袁曉沛 容器計算部技術總監

在 Red Hat 工作了幾年之后,2014 年底,我被分配到一個叫 Cloud Enablement的新團隊。我們的任務是將公司的中間件系列產品引入基于 Kubernetes 開發的OpenShift 容器平臺。當時,Kubernetes 還在初始的 1.0 版本中,甚至還沒有正式發布。
我們團隊必須盡快了解 Kubernetes 的細節,以便能夠充分利用 Kubernetes 的一切,為軟件開發設定正確的方向。當遇到問題時,很難判斷是我們出錯了,還是僅僅是碰到了一個 Kubernetes 的 bug。
從那以后,Kubernetes 有了長足的發展,我對它的理解也有了很大的提升。當我第一次使用它的時候,大多數人甚至從未聽說過 Kubernetes。現在,幾乎每個軟件工程師都知道它,Kuberntes 已經成為在云上和內部數據中心運行應用程序的增長最快和使用最廣泛的方式之一。
在使用 Kubernetes 的第一個月,我寫了一篇包含兩部分的博客文章,介紹如何在 OpenShift/Kubernetes 中運行 JBoss WildFly 應用服務集群。當時,我從未想過一篇簡單的博客文章會讓曼寧出版社的人聯系我,詢問我是否愿意寫一本關于Kubernetes 的書。當然,我不能拒絕這樣的提議,盡管我確信他們也會聯系其他人,甚至最終會選擇其他人。
經過一年半的寫作和研究,完成了本書,這是一次很棒的經歷。寫一本關于一項技術的書是比使用更好的了解它的方法。隨著我對 Kubernetes 了解的深入,以及Kubernetes 本身的不斷發展,我不斷地回到之前寫完的章節,添加更多的信息。我是一個完美主義者,所以永遠不會對這本書感到絕對滿意,但我很高興聽到 MEAP(Manning Early Access Program)的許多讀者覺得它是一本很好的學習 Kubernetes 的指南。
我的目的是讓讀者了解技術本身,并教會他們如何使用工具有效地在Kubernetes 集群中開發和部署應用程序。本書的重點不在如何建立和維護一個高可用的 Kubernetes 集群,但本書的最后一部分告訴讀者這樣一個集群應該包含什么,這能讓大家很容易地理解處理這個問題的額外資源。
希望你能享受閱讀此書,并且讓你學到如何能夠充分利用 Kubernetes 系統的強大之處。
在我開始寫這本書之前,從來就沒有想到將來會有這么多人參與進來,將一堆

關于本書
本書旨在讓你能夠熟練使用 Kubernetes。它介紹了在 Kubernetes 中有效地開發和運行應用所需的幾乎所有概念。
在深入研究 Kubernetes 之前,本書概述了 Docker 等容器技術,包括如何構建容器,以便即使以前沒有使用過這些技術的讀者也可以使用它們。然后,它會慢慢帶你從基本概念到實現原理了解大部分的 Kubernetes 知識。
本書適合誰
本書主要關注應用開發人員,但也從操作的角度概述了應用的管理。它適合任何對在多服務器上運行和管理容器化應用感興趣的人。
對于希望學習容器技術以及大規模的容器編排的人,無論是初學者還是高級軟件工程師都將得到在 Kubernetes 環境中開發、容器化和運行應用所需的專業知識。
閱讀本書不需要預先了解容器或 Kubernetes 技術。本書以漸進的方式展開主題,不會使用讓非專家開發者難以理解的應用源代碼。
讀者至少應該具備編程、計算機網絡和運行 Linux 基本命令的基礎知識,并了解常用的計算機協議,如 HTTP 協議。

本書的組織方式 :路線圖
本書分為三個部分,涵蓋 18 個章節。
第一部分簡要地介紹 Docker 和 Kubernetes、如何設置 Kubernetes 集群,以及如何在集群中運行一個簡單的應用。它包括兩章 :
第 1 章解釋了什么是 Kubernetes、Kubernetes 的起源,以及它如何幫助解決當今大規模應用管理的問題。
第 2 章是關于如何構建容器鏡像并在 Kubernetes 集群中運行的實踐教程。還解釋了如何運行本地單節點 Kubernetes 集群,以及在云上運行適當的多節點集群。
第二部分介紹了在 Kubernetes 中運行應用必須理解的關鍵概念。本章內容如下:
第 3 章介紹了 Kubernetes 的基本構建模塊——pod,并解釋了如何通過標簽組織 pod 和其他 Kubernetes 對象。
第 4 章將向你介紹 Kubernetes 如何通過自動重啟容器來保持應用程序的健康。還展示了如何正確地運行托管的 pod,水平伸縮它們,使它們能夠抵抗集群節點的故障,并在未來或定期運行它們。
第 5 章介紹了 pod 如何向運行在集群內外的客戶端暴露它們提供的服務,還展示了運行在集群中的 pod 是如何發現和訪問集群內外的服務的。
第 6 章解釋了在同一個 pod 中運行的多個容器如何共享文件,以及如何管理持久化存儲并使得 pod 可以訪問。
第 7 章介紹了如何將配置數據和敏感信息(如憑據)傳遞給運行在 pod 中的應用。
第 8 章描述了應用如何獲得正在運行的 Kubernetes 環境的信息,以及如何通過與 Kubernetes 通信來更改集群的狀態。
第 9 章介紹了 Deployment 的概念,并解釋了在 Kubernetes 環境中運行和更新應用的正確方法。
第 10 章介紹了一種運行需要穩定的標識和狀態的有狀態應用的專門方法。
第三部分深入研究了 Kubernetes 集群的內部,介紹了一些額外的概念,并從更高的角度回顧了在前兩部分中所學到的所有內容。這是最后一組章節 :
第 11 章深入 Kubernetes 的底層,解釋了組成 Kubernetes 集群的所有組件,以及每個組件的作用。它還解釋了 pod 如何通過網絡進行通信,以及服務如何跨多個 pod 形成負載平衡。
第 12 章解釋了如何保護 Kubernetes API 服務器,以及通過擴展集群使用身份驗證和授權。
第 13 章介紹了 pod 如何訪問節點的資源,以及集群管理員如何防止 pod 訪問節點的資源。
第 14 章深入了解限制每個應用程序允許使用的計算資源,配置應用的 QoS(Quality of Service)保證,以及監控各個應用的資源使用情況。還會介紹如何防止用戶消耗太多資源。
第 15 章討論了如何通過配置 Kubernetes 來自動伸縮應用運行的副本數,以及在當前集群節點數量不能接受任何新增應用時,如何對集群進行擴容。
第 16 章介紹了如何確保 pod 只被調度到特定的節點,或者如何防止它們被調度到其他節點。還介紹了如何確保 pod 被調度在一起,或者如何防止它們調度在一起。
第 17 章介紹了如何開發應用程序并部署在集群中。還介紹了如何配置開發和測試工作流來提高開發效率。
第 18 章介紹了如何使用自己的自定義對象擴展 Kubernetes,以及其他人是如何開發并創建企業級應用平臺的。
隨著章節的深入,不僅可以了解單個構建 Kubernetes 的模塊,還可以逐步增加對使用 kubectl 命令行工具的理解。
內容簡介:

本書主要講解如何在 Kubernetes 中部署分布式容器應用。本書開始部分概要介紹了 Docker 和Kubernetes 的由來和發展,然后通過在 Kubernetes 中部署一個應用程序,一點點增加功能,逐步加深我們對于Kubernetes架構的理解和操作的實踐。在本書的后面部分,也可以學習一些高階的主題,比如監控、調試及伸縮。Kubernetes是希臘文,意思是“舵手”,帶領我們安全地到達未知水域。Kubernetes這樣的容器編排系統,會幫助我們妥善地管理分布式應用的部署結構和線上流量,高效地組織容器和服務。Kubernetes 作為數據中心操作系統,在設計軟件系統時,能夠盡量降低在底層網絡和硬件設施上的負擔。
目錄:

1  Kubernetes 介紹 .........1
1.1 Kubernetes 系統的需求 ...........2
1.1.1 從單體應用到微服務 ..........2
1.1.2 為應用程序提供一個一致的環境 ......5
1.1.3 邁向持續交付 :DevOps 和無運維 ......6
1.2 介紹容器技術 ............7
1.2.1 什么是容器 ..........7
1.2.2 Docker 容器平臺介紹 ......... 11
1.2.3 rkt——一個 Docker 的替代方案 ......14
1.3 Kubernetes 介紹 ...........15
1.3.1 初衷 ............15
1.3.2 深入淺出地了解 Kubernetes .......15
1.3.3 Kubernetes 集群架構 .........17
1.3.4 在 Kubernetes 中運行應用 ........18
1.3.5 使用 Kubernetes 的好處 ........20
1.4 本章小結 ............22
2  開始使用 Kubernetes 和 Docker ......23
2.1 創建、運行及共享容器鏡像 ........23
2.1.1 安裝 Docker 并運行 Hello World 容器 .....24
2.1.2 創建一個簡單的 Node.js 應用 ........26
2.1.3 為鏡像創建 Dockerfile ........27
2.1.4 構建容器鏡像 ..........27
2.1.5 運行容器鏡像 ..........30
2.1.6 探索運行容器的內部 ........31
2.1.7 停止和刪除容器 ..........32
2.1.8 向鏡像倉庫推送鏡像 ........33
2.2 配置 Kubernetes 集群 ..........34
2.2.1 用 Minikube 運行一個本地單節點 Kubernetes 集群 ....34
2.2.2 使用 Google Kubernetes Engine 托管 Kubernetes 集群 ...36
2.2.3 為 kubectl 配置別名和命令行補齊 ......39
2.3 在 Kubernetes 上運行第一個應用 ........40
2.3.1 部署 Node.js 應用 ..........40
2.3.2 訪問 Web 應用 ...........43
2.3.3 系統的邏輯部分 ..........45
2.3.4 水平伸縮應用 ..........46
2.3.5 查看應用運行在哪個節點上 ........49
2.3.6 介紹 Kubernetes dashboard .......50
2.4 本章小結 ............51
3  pod :運行于 Kubernetes 中的容器 ......53
3.1 介紹 pod .............53
3.1.1 為何需要 pod ...........54
3.1.2 了解 pod ...........55
3.1.3 通過 pod 合理管理容器 ........56
3.2 以 YAML 或 JSON 描述文件創建 pod ........58
3.2.1 檢查現有 pod 的 YAML 描述文件 .......59
3.2.2 為 pod 創建一個簡單的 YAML 描述文件 .....61
3.2.3 使用 kubectl create 來創建 pod .......63
3.2.4 查看應用程序日志 ..........64
3.2.5 向 pod 發送請求 ..........65
3.3 使用標簽組織 pod ...........66
3.3.1 介紹標簽 ............66
3.3.2 創建 pod 時指定標簽 ........67
3.3.3 修改現有 pod 的標簽 ........68
3.4 通過標簽選擇器列出 pod 子集 ........69
3.4.1 使用標簽選擇器列出 pod .........69
3.4.2 在標簽選擇器中使用多個條件 ........71
3.5 使用標簽和選擇器來約束 pod 調度 ........71
3.5.1 使用標簽分類工作節點 ........72
3.5.2 將 pod 調度到特定節點 ........72
3.5.3 調度到一個特定節點 ........73
3.6 注解 pod .............73
3.6.1 查找對象的注解 ..........74
3.6.2 添加和修改注解 ..........74
3.7 使用命名空間對資源進行分組 ........75
3.7.1 了解對命名空間的需求 ........75
3.7.2 發現其他命名空間及其 pod .......75
3.7.3 創建一個命名空間 ..........76
3.7.4 管理其他命名空間中的對象 ........77
3.7.5 命名空間提供的隔離 ........78
3.8 停止和移除 pod ...........78
3.8.1 按名稱刪除 pod .........78
3.8.2 使用標簽選擇器刪除 pod .........79
3.8.3 通過刪除整個命名空間來刪除 pod .......80
3.8.4 刪除命名空間中的所有 pod,但保留命名空間 .....80
3.8.5 刪除命名空間中的(幾乎)所有資源 ......80
3.9 本章小結 ............81
4  副本機制和其他控制器 :部署托管的 pod .....83
4.1 保持 pod 健康 ............84
4.1.1 介紹存活探針 ..........84
4.1.2 創建基于 HTTP 的存活探針 ........85
4.1.3 使用存活探針 ..........86
4.1.4 配置存活探針的附加屬性 ........87
4.1.5 創建有效的存活探針 ........88
4.2 了解 ReplicationController ..........89
4.2.1 ReplicationController 的操作 ........90
4.2.2 創建一個 ReplicationController ........92
4.2.3 使用 ReplicationController ........94
4.2.4 將 pod 移入或移出 ReplicationController 的作用域 ...97
4.2.5 修改 pod 模板 ..........100
4.2.6 水平縮放 pod ...........101
4.2.7 刪除一個 ReplicationController ......103
4.3 使用 ReplicaSet 而不是 ReplicationController .....104
4.3.1 比較 ReplicaSet 和 ReplicationController .....104
4.3.2 定義 ReplicaSet ..........105
4.3.3 創建和檢查 ReplicaSet ........106
4.3.4 使用 ReplicaSet 的更富表達力的標簽選擇器 .....106
4.3.5 ReplicaSet 小結 ..........107
4.4 使用 DaemonSet 在每個節點上運行一個 pod .....107
4.4.1 使用 DaemonSet 在每個節點上運行一個 pod ....108
4.4.2 使用 DaemonSet 只在特定的節點上運行 pod ....109
4.5 運行執行單個任務的 pod ......... 112
4.5.1 介紹 Job 資源 ........... 112
4.5.2 定義 Job 資源 ........... 113
4.5.3 看 Job 運行一個 pod ........ 114
4.5.4 在 Job 中運行多個 pod 實例 ....... 114
4.5.5 限制 Job pod 完成任務的時間 ........ 116
4.6 安排 Job 定期運行或在將來運行一次 ....... 116
4.6.1 創建一個 CronJob .......... 116
4.6.2 了解計劃任務的運行方式 ........ 118
4.7 本章小結 ............ 118
5  服務 :讓客戶端發現 pod 并與之通信 .....121
5.1 介紹服務 ............122
5.1.1 創建服務 ..........123
5.1.2 服務發現 ..........129
5.2 連接集群外部的服務 ..........132
5.2.1 介紹服務 endpoint .........133
5.2.2 手動配置服務的 endpoint .......133
5.2.3 為外部服務創建別名 ........135
5.3 將服務暴露給外部客戶端 ..........136
5.3.1 使用 NodePort 類型的服務 .......137
5.3.2 通過負載均衡器將服務暴露出來 ......140
5.3.3 了解外部連接的特性 ........142
5.4 通過 Ingress 暴露服務 .........143
5.4.1 創建 Ingress 資源 .........145
5.4.2 通過 Ingress 訪問服務 .........146
5.4.3 通過相同的 Ingress 暴露多個服務 .......147
5.4.4 配置 Ingress 處理 TLS 傳輸 .......149
5.5 pod 就緒后發出信號 ...........150
5.5.1 介紹就緒探針 ..........151
5.5.2 向 pod 添加就緒探針 ........152
5.5.3 了解就緒探針的實際作用 ........154
5.6 使用 headless 服務來發現獨立的 pod ........155
5.6.1 創建 headless 服務 .........156
5.6.2 通過 DNS 發現 pod .........156
5.6.3 發現所有的 pod——包括未就緒的 pod.....157
5.7 排除服務故障 ............158
5.8 本章小結 ............159
6  卷 :將磁盤掛載到容器 .......161
6.1 介紹卷 ............162
6.1.1 卷的應用示例 .........162
6.1.2 介紹可用的卷類型 ..........164
6.2 通過卷在容器之間共享數據 ........165
6.2.1 使用 emptyDir 卷 .........165
6.2.2 使用 Git 倉庫作為存儲卷 .......168
6.3 訪問工作節點文件系統上的文件 ........171
6.3.1 介紹 hostPath 卷 ..........171
6.3.2 檢查使用 hostPath 卷的系統 pod .......172
6.4 使用持久化存儲 ..........173
6.4.1 使用 GCE 持久磁盤作為 pod 存儲卷 ......174
6.4.2 通過底層持久化存儲使用其他類型的卷 ......177
6.5 從底層存儲技術解耦 pod .........179
6.5.1 介紹持久卷和持久卷聲明 ........179
6.5.2 創建持久卷 ..........180
6.5.3 通過創建持久卷聲明來獲取持久卷 ......182
6.5.4 在 pod 中使用持久卷聲明 ........184
6.5.5 了解使用持久卷和持久卷聲明的好處 ......185
6.5.6 回收持久卷 ..........186
6.6 持久卷的動態卷配置 ..........187
6.6.1 通過 StorageClass 資源定義可用存儲類型 .....188
6.6.2 請求持久卷聲明中的存儲類 ........188
6.6.3 不指定存儲類的動態配置 ........190
6.7 本章小結 ............193
7  ConfigMap 和 Secret :配置應用程序 .....195
7.1 配置容器化應用程序 ..........195
7.2 向容器傳遞命令行參數 ..........196
7.2.1 在 Docker 中定義命令與參數 ........196
7.2.2 在 Kubernetes 中覆蓋命令和參數 ......199
7.3 為容器設置環境變量 ..........200
7.3.1 在容器定義中指定環境變量 ........201
7.3.2 在環境變量值中引用其他環境變量 ......201
7.3.3 了解硬編碼環境變量的不足之處 ......202
7.4 利用 ConfigMap 解耦配置 ..........202
7.4.1 ConfigMap 介紹 .........202
7.4.2 創建 ConfigMap .........203
7.4.3 給容器傳遞 ConfigMap 條目作為環境變量 ....206
7.4.4 一次性傳遞 ConfigMap 的所有條目作為環境變量 ....208
7.4.5 傳遞 ConfigMap 條目作為命令行參數 ......209
7.4.6 使用 configMap 卷將條目暴露為文件 .....210
7.4.7 更新應用配置且不重啟應用程序 ......216
7.5 使用 Secret 給容器傳遞敏感數據 ........218
7.5.1 介紹 Secret ...........218
7.5.2 默認令牌 Secret 介紹 ........218
7.5.3 創建 Secret ...........220
7.5.4 對比 ConfigMap 與 Secret .......221
7.5.5 在 pod 中使用 Secret .........222
7.6 本章小結 ............228
8  從應用訪問 pod 元數據以及其他資源 .....229
8.1 通過 Downward API 傳遞元數據 .......229
8.1.1 了解可用的元數據 ..........230
8.1.2 通過環境變量暴露元數據 ........231
8.1.3 通過 downwardAPI 卷來傳遞元數據 .....234
8.2 與 Kubernetes API 服務器交互 .........237
8.2.1 探究 Kubernetes REST API .......238
8.2.2 從 pod 內部與 API 服務器進行交互 ......242
8.2.3 通過 ambassador 容器簡化與 API 服務器的交互 ...248
8.2.4 使用客戶端庫與 API 服務器交互 ......251
8.3 本章小結 ............253
9  Deployment: 聲明式地升級應用 .....255
9.1 更新運行在 pod 內的應用程序 ........256
9.1.1 刪除舊版本 pod,使用新版本 pod 替換 .....257
9.1.2 先創建新 pod 再刪除舊版本 pod .......257
9.2 使用 ReplicationController 實現自動的滾動升級 .....259
9.2.1 運行第一個版本的應用 ........259
9.2.2 使用 kubectl 來執行滾動式升級 ......261
9.2.3 為什么 kubectl rolling-update 已經過時 .....265
9.3 使用 Deployment 聲明式地升級應用.......266
9.3.1 創建一個 Deployment .........267
9.3.2 升級 Deployment .........269
9.3.3 回滾 Deployment .........273
9.3.4 控制滾動升級速率 ..........276
9.3.5 暫停滾動升級 ..........278
9.3.6 阻止出錯版本的滾動升級 ........279
9.4 本章小結 ............284
10  StatefulSet :部署有狀態的多副本應用 ....285
10.1 復制有狀態 pod ...........285
10.1.1 運行每個實例都有單獨存儲的多副本 ......286
10.1.2 每個 pod 都提供穩定的標識 ........287
10.2 了解 Statefulset ..........289
10.2.1 對比 Statefulset 和 ReplicaSet .......289
10.2.2 提供穩定的網絡標識 ........290
10.2.3 為每個有狀態實例提供穩定的專屬存儲 ....292
10.2.4 Statefulset 的保障 ..........294
10.3 使用 Statefulset ..........295
10.3.1 創建應用和容器鏡像 ........295
10.3.2 通過 Statefulset 部署應用 .......296
10.3.3 使用你的 pod .........301
10.4 在 Statefulset 中發現伙伴節點 .........305
10.4.1 通過 DNS 實現伙伴間彼此發現 ......306
10.4.2 更新 Statefulset ..........308
10.4.3 嘗試集群數據存儲 ........309
10.5 了解 Statefulset 如何處理節點失效 .......310
10.5.1 模擬一個節點的網絡斷開 ........310
10.5.2 手動刪除 pod .........312
10.6 本章小結 ............313
11  了解 Kubernetes 機理 ........315
11.1 了解架構 ...........315
11.1.1 Kubernetes 組件的分布式特性 .......316
11.1.2 Kubernetes 如何使用 etcd .......318
11.1.3 API 服務器做了什么 .........322
11.1.4 API 服務器如何通知客戶端資源變更 .....324
11.1.5 了解調度器 ..........325
11.1.6 介紹控制器管理器中運行的控制器 ......327
11.1.7 Kubelet 做了什么 .........331
11.1.8 Kubernetes Service Proxy 的作用 .......332
11.1.9 介紹 Kubernetes 插件 ........333
11.1.10 總結概覽 ..........335
11.2 控制器如何協作 ..........335
11.2.1 了解涉及哪些組件 ........335
11.2.2 事件鏈 ............336
11.2.3 觀察集群事件 ..........337
11.3 了解運行中的 pod 是什么 ........339
11.4 跨 pod 網絡 ............340
11.4.1 網絡應該是什么樣的 ........340
11.4.2 深入了解網絡工作原理 ........341
11.4.3 引入容器網絡接口 ........343
11.5 服務是如何實現的 ..........344
11.5.1 引入 kube-proxy .........344
11.5.2 kube-proxy 如何使用 iptables .......344
11.6 運行高可用集群 ..........346
11.6.1 讓你的應用變得高可用 ........346
11.6.2 讓 Kubernetes 控制平面變得高可用 ......347
11.7 本章小結 ............350
12  Kubernetes API 服務器的安全防護 .....351
12.1 了解認證機制 ............351
12.1.1 用戶和組 ..........352
12.1.2 ServiceAccount 介紹 ........353
12.1.3 創建 ServiceAccount ........354
12.1.4 將 ServiceAccount 分配給 pod ......356
12.2 通過基于角色的權限控制加強集群安全 ......358
12.2.1 介紹 RBAC 授權插件 .........359
12.2.2 介紹 RBAC 資源 .........360
12.2.3 使用 Role 和 RoleBinding .......363
12.2.4 使用 ClusterRole 和 ClusterRoleBinding ......367
12.2.5 了解默認的 ClusterRole 和 ClusterRoleBinding ....376
12.2.6 理性地授予授權權限 ........379
12.3 本章小結 ............379
13  保障集群內節點和網絡安全 ......381
13.1 在 pod 中使用宿主節點的 Linux 命名空間 .....381
13.1.1 在 pod 中使用宿主節點的網絡命名空間 ....382
13.1.2 綁定宿主節點上的端口而不使用宿主節點的網絡命名空間 .383
13.1.3 使用宿主節點的 PID 與 IPC 命名空間 .....385
13.2 配置節點的安全上下文 ..........386
13.2.1 使用指定用戶運行容器 ........387
13.2.2 阻止容器以 root 用戶運行 ........388
13.2.3 使用特權模式運行 pod .........389
13.2.4 為容器單獨添加內核功能 ........390
13.2.5 在容器中禁用內核功能 ........391
13.2.6 阻止對容器根文件系統的寫入 ......392
13.2.7 容器使用不同用戶運行時共享存儲卷 ......394
13.3 限制 pod 使用安全相關的特性 ........396
13.3.1 PodSecurityPolicy 資源介紹 .......396
13.3.2 了解 runAsUser、 fsGroup 和 supplementalGroup 策略 ...398
13.3.3 配置允許、默認添加、禁止使用的內核功能 ....400
13.3.4 限制 pod 可以使用的存儲卷類型 ......402
13.3.5 對不同的用戶與組分配不同的 PodSecurityPolicy ...402
13.4 隔離 pod 的網絡 ..........406
13.4.1 在一個命名空間中啟用網絡隔離 ......406
13.4.2 允許同一命名空間中的部分 pod 訪問一個服務端 pod ...407
13.4.3 在不同 Kubernetes 命名空間之間進行網絡隔離 ....408
13.4.4 使用 CIDR 隔離網絡 .........409
13.4.5 限制 pod 的對外訪問流量 ........409
13.5 本章小結 ............410
14  計算資源管理 .........411
14.1 為 pod 中的容器申請資源 ........ 411
14.1.1 創建包含資源 requests 的 pod ......412
14.1.2 資源 requests 如何影響調度 .......413
14.1.3 CPU requests 如何影響 CPU 時間分配 .....418
14.1.4 定義和申請自定義資源 ........418
14.2 限制容器的可用資源 ..........419
14.2.1 設置容器可使用資源量的硬限制 ......419
14.2.2 超過 limits ..........421
14.2.3 容器中的應用如何看待 limits ......422
14.3 了解 pod QoS 等級 ..........423
14.3.1 定義 pod 的 QoS 等級 .........424
14.3.2 內存不足時哪個進程會被殺死 ......426
14.4 為命名空間中的 pod 設置默認的 requests 和 limits .....427
14.4.1 LimitRange 資源簡介 ........428
14.4.2 LimitRange 對象的創建 ........428
14.4.3 強制進行限制 ..........430
14.4.4 應用資源 requests 和 limits 的默認值 ......430
14.5 限制命名空間中的可用資源總量 ........431
14.5.1 ResourceQuota 資源介紹 ........431
14.5.2 為持久化存儲指定配額 ........434
14.5.3 限制可創建對象的個數 ........434
14.5.4 為特定的 pod 狀態或者 QoS 等級指定配額 .....435
14.6 監控 pod 的資源使用量 ..........436
14.6.1 收集、獲取實際資源使用情況 ......437
14.6.2 保存并分析歷史資源的使用統計信息 ......439
14.7 本章小結 ............442
15  自動橫向伸縮 pod 與集群節點 ......443
15.1 pod 的橫向自動伸縮 .........444
15.1.1 了解自動伸縮過程 ........444
15.1.2 基于 CPU 使用率進行自動伸縮 ......447
15.1.3 基于內存使用進行自動伸縮 ........453
15.1.4 基于其他自定義度量進行自動伸縮 ......453
15.1.5 確定哪些度量適合用于自動伸縮 ......456
15.1.6 縮容到 0 個副本 ..........456
15.2 pod 的縱向自動伸縮 .........456
15.2.1 自動配置資源請求 ........457
xxviii 目 錄
15.2.2 修改運行中 pod 的資源請求 ........457
15.3 集群節點的橫向伸縮 ..........457
15.3.1 Cluster Autoscaler 介紹 .........457
15.3.2 啟用 Cluster Autoscaler .........459
15.3.3 限制集群縮容時的服務干擾 ........460
15.4 本章小結 ............461
16  高級調度 .........463
16.1 使用污點和容忍度阻止節點調度到特定節點 ......463
16.1.1 介紹污點和容忍度 ........464
16.1.2 在節點上添加自定義污點 ........466
16.1.3 在 pod 上添加污點容忍度 ........467
16.1.4 了解污點和污點容忍度的使用場景 ......467
16.2 使用節點親緣性將 pod 調度到特定節點上 ......469
16.2.1 指定強制性節點親緣性規則 ........470
16.2.2 調度 pod 時優先考慮某些節點 ......472
16.3 使用 pod 親緣性與非親緣性對 pod 進行協同部署 ....475
16.3.1 使用 pod 間親緣性將多個 pod 部署在同一個節點上 ..475
16.3.2 將 pod 部署在同一機柜、可用性區域或者地理地域 ..478
16.3.3 表達 pod 親緣性優先級取代強制性要求 ....479
16.3.4 利用 pod 的非親緣性分開調度 pod .....481
16.4 本章小結 ............483
17  開發應用的最佳實踐 .......485
17.1 集中一切資源 ............486
17.2 了解 pod 的生命周期 ..........487
17.2.1 應用必須預料到會被殺死或者重新調度 ....487
17.2.2 重新調度死亡的或者部分死亡的 pod .....490
17.2.3 以固定順序啟動 pod .........491
17.2.4 增加生命周期鉤子 ........493
17.2.5 了解 pod 的關閉 ..........497
17.3 確保所有的客戶端請求都得到了妥善處理 ......500
17.3.1 在 pod 啟動時避免客戶端連接斷開 ......500
17.3.2 在 pod 關閉時避免客戶端連接斷開 ......501
17.4 讓應用在 Kubernetes 中方便運行和管理 ......505
17.4.1 構建可管理的容器鏡像 ........505
17.4.2 合理地給鏡像打標簽,正確地使用 ImagePullPolicy ..506
17.4.3 使用多維度而不是單維度的標簽 ......506
17.4.4 通過注解描述每個資源 ........506
17.4.5 給進程終止提供更多的信息 ........507
17.4.6 處理應用日志 ..........508
17.5 開發和測試的最佳實踐 ..........510
17.5.1 開發過程中在 Kubernetes 之外運行應用 ....510
17.5.2 在開發過程中使用 Minikube ........512
17.5.3 發布版本和自動部署資源清單 ......513
17.5.4 使用 Ksonnet 作為編寫 YAML/JSON manifest
文件的額外選擇 ..........513
17.5.5 利用持續集成和持續交付 ........514
17.6 本章小結 ............515
18  Kubernetes 應用擴展 ........517
18.1 定義自定義 API 對象 ..........517
18.1.1 CustomResourceDefinitions 介紹 ......518
18.1.2 使用自定義控制器自動定制資源 ......522
18.1.3 驗證自定義對象 ..........526
18.1.4 為自定義對象提供自定義 API 服務器 ......527
18.2 使用 Kubernetes 服務目錄擴展 Kubernetes .....528
18.2.1 服務目錄介紹 ..........529
18.2.2 服務目錄 API 服務器與控制器管理器介紹 ....530
18.2.3 Service 代理和 OpenServiceBroker API .....530
18.2.4 提供服務與使用服務 ........533
18.2.5 解除綁定與取消配置 ........535
18.2.6 服務目錄給我們帶來了什么 ........535
18.3 基于 Kubernetes 搭建的平臺 ........536
18.3.1 紅帽 OpenShift 容器平臺 ........536
18.3.2 Deis Workflow 與 Helm .........539
18.4 本章小結 ............541
A  在多個集群中使用 kubectl .......543
B  使用 kubeadm 配置多節點集群 ......549
C  使用其他容器運行時 .......563
D  Cluster Federation .......567
序: