【缺書】NT售價: 840 元
自 序本書第1版出版于2016年,幾年過去,Kubernetes已從一個新生事物發展為一個影響全球IT技術的基礎設施平臺,也推動了云原生應用、微服務架構、Service Mesh等熱門技術的普及和落地。現在,Kubernetes已經成為明星項目,其開源項目擁有超過兩萬名貢獻者,成為開源歷史上發展速度超快的項目之一。在這幾年里:Kubernetes背后的重要開源公司RedHat被IBM大手筆收購,使RedHat基于Kubernetes架構的先進PaaS平臺——OpenShift成為IBM在云計算基礎設施中的重要籌碼;Kubernetes的兩位核心創始人Joe Beda 和Craig McLuckie所創立的提供Kubernetes咨詢和技術支持的初創公司Heptio也被虛擬化領域的巨頭VMware收購;Oracle收購了丹麥的一家初創公司Wercker,然后開發了Click2Kube,這是面向Oracle裸機云(Oracle Bare Metal Cloud)的一鍵式Kubernetes集群安裝工具;世界500強中的一些大型企業也決定以Kubernetes為基礎重構內部IT平臺架構,大數據系統的一些用戶也在努力將其生產系統從龐大的大數據專有技術棧中剝離出來靠攏Kubernetes。Kubernetes是將“一切以服務(Service)為中心,一切圍繞服務運轉”作為指導思想的創新型產品,這是它的一個亮點。它的功能和架構設計自始至終地遵循了這一指導思想,構建在Kubernetes上的系統不僅可以獨立運行在物理機、虛擬機集群或者企業私有云上,也可以被托管在公有云上。Kubernetes的另一個亮點是自動化。在Kubernetes的解決方案中,一個服務可以自我擴展、自我診斷,并且容易升級,在收到服務擴容的請求后,Kubernetes會觸發調度流程,最終在選定的目標節點上啟動相應數量的服務實例副本,這些服務實例副本在啟動成功后會自動加入負載均衡器中并生效,整個過程無須額外的人工操作。另外,Kubernetes會定時巡查每個服務的所有實例的可用性,確保服務實例的數量始終保持為預期的數量,當它發現某個實例不可用時,會自動重啟該實例或者在其他節點上重新調度、運行一個新實例,這樣,一個復雜的過程無須人工干預即可全部自動完成。試想一下,如果一個包括幾十個節點且運行著幾萬個容器的復雜系統,其負載均衡、故障檢測和故障修復等都需要人工介入進行處理,其工作量將多大。通常,我們會把Kubernetes看作Docker的上層架構,就好像Java與J2EE的關系一樣:J2EE是以Java為基礎的企業級軟件架構,Kubernetes則以Docker為基礎打造了一個云計算時代的全新分布式系統架構。但Kubernetes與Docker之間還存在著更為復雜的關系,從表面上看,似乎Kubernetes離不開Docker,但實際上在Kubernetes的架構里,Docker只是其目前支持的兩種底層容器技術之一,另一種容器技術則是Rocket,Rocket為CoreOS推出的競爭產品。Kubernetes之所以同時支持Docker和Rocket這兩種互相競爭的容器技術,是有深刻的歷史原因的。快速發展的Docker打敗了谷歌名噪一時的開源容器技術lmctfy,并迅速風靡世界。但是,作為一個已經對全球IT公司產生重要影響的技術,Docker容器標準的制定不可能被任何一個公司主導。于是,CoreOS推出了與Docker抗衡的開源容器項目Rocket,動員一些知名IT公司一起主導容器技術的標準化,并與谷歌共同發起基于CoreOS+ Rocket+Kubernetes的新項目 Tectonic,使容器技術分裂態勢加劇。最后,Linux基金會于2015年6月宣布成立開放容器技術項目(Open Container Project),谷歌、CoreOS及Docker都加入了該項目。OCP項目成立后,Docker公司放棄了自己的獨家控制權,Docker容器格式也被OCP采納為新標準的基礎,Docker負責起草OCP草案規范的初稿文檔,并提交自己的容器執行引擎的源碼作為OCP項目的啟動資源。2015年7月,谷歌正式宣布加入OpenStack陣營,其目標是確保Linux容器及其關聯的容器管理技術Kubernetes能夠被OpenStack生態圈所接納,這也意味著對數據中心控制平面的爭奪已經結束,以容器為代表的應用形態與以虛擬化為代表的系統形態將會完美融合于OpenStack之上,并與軟件定義網絡和軟件定義存儲一起主導下一代數據中心。谷歌憑借著幾十年大規模容器使用的豐富經驗,步步為營,先是祭出Kubernetes這個神器,然后掌控了容器技術的制定標準,最后入駐OpenStack陣營全力支持Kubernetes的發展。可以預測,Kubernetes的影響力可能超過十年,所以,我們每個IT人都有理由重視這門新技術。誰能比別人領先一步掌握新技術,誰就能在競爭中贏得先機。慧與中國通信和媒體解決方案領域的資深專家團一起分工協作、并行研究,并廢寢忘食地合力撰寫,才促成了這部巨著的出版。經過這些年的高速發展,Kubernetes先后發布了十幾個大版本,每個版本都帶來了大量的新特性,能夠處理的應用場景也越來越豐富。本書遵循從入門到精通的學習路線,涵蓋了入門、安裝指南、實踐指南、核心原理、開發指南、運維指南、新特性演進等內容,內容翔實、圖文并茂,幾乎囊括了Kubernetes當前主流版本的方方面面,無論是對于軟件工程師、測試工程師、運維工程師、軟件架構師、技術經理,還是對于資深IT人士,本書都極具參考價值。吳治輝HPE資深架構師推 薦 序經過作者們多年的實踐經驗積累及近一年的精心準備,本書終于與我們見面了。我有幸作為首批讀者,提前見證和學習了在云時代引領業界技術方向的Kubernetes和Docker的最新動態。從內容上講,本書從一個開發者的角度去理解、分析和解決問題:從基礎入門到架構原理,從運行機制到開發源碼,再從系統運維到應用實踐,講解全面。本書圖文并茂,內容豐富,由淺入深,對基本原理闡述清晰,對系統架構分析透徹,對實踐經驗講解深刻。我認為本書值得推薦的原因有以下幾點。首先,作者的所有觀點和經驗,均是在多年建設、維護大型應用系統的過程中積累形成的。例如,讀者通過學習書中的Kubernetes開發指南、集群管理等章節的內容,不僅可以直接提高開發技能,還可以解決在實踐過程中經常遇到的各種關鍵問題。書中的這些內容具有很高的借鑒和推廣意義。其次,通過大量的實例操作和詳盡的源碼解析,本書可以幫助讀者深刻理解Kubernetes的各種概念。例如,書中介紹了使用Java程序訪問Kubernetes API的幾種方法,讀者參照其中的案例,只要稍做修改,再結合實際的應用需求,就可以將這些方法用于正在開發的項目中,達到事半功倍的效果,對有一定Java基礎的專業人士快速學習Kubernetes的各種細節和實踐操作十分有利。再次,為了讓初學者快速入門,本書配備了即時在線交流工具和專業后臺技術支持團隊。如果你在開發和應用的過程中遇到各類相關問題,均可直接聯系該團隊的開發支持專家。最后,我們可以看到,容器化技術已經成為計算模型演化的一個開端,Kubernetes作為谷歌開源的Docker容器集群管理技術,在這場新的技術革命中扮演著重要的角色。Kubernetes正在被眾多知名公司及企業采用,例如Google、VMware、CoreOS、騰訊、京東等,因此,Kubernetes站在了容器新技術變革的浪潮之巔,將具有不可預估的發展前景和商業價值。無論你是架構師、開發者、運維人員,還是對容器技術比較好奇的讀者,本書都是一本不可多得的帶你從入門到進階的Kubernetes精品書,值得閱讀!初瑞中國移動業務支撐中心高級經理
Kubernetes是由谷歌開源的Docker容器集群管理系統,為容器化的應用提供了資源調度、部署運行、服務發現、擴容及縮容等一整套功能。本書從架構師、開發人員和運維人員的角度,闡述了Kubernetes的基本概念、實踐指南、核心原理、開發指導、運維指南、新特性演進等內容,圖文并茂、內容豐富、由淺入深、講解全面;并圍繞在生產環境中可能出現的問題,給出了大量的典型案例,比如安全配置方案、網絡方案、共享存儲方案、高可用方案及Trouble Shooting技巧等,有很強的實戰指導意義。本書內容隨著Kubernetes的版本更新不斷完善,目前涵蓋了Kubernetes從1.0到1.14版本的主要特性,努力為Kubernetes用戶提供全方位的Kubernetes技術指南。本書源碼已上傳至GitHub的kubeguide/K8sDefinitiveGuide-V4-Sourcecode目錄,可自行下載本書源碼進行練習。無論是對于軟件工程師、測試工程師、運維工程師、軟件架構師、技術經理,還是對于資深IT人士,本書都極具參考價值。
第1章 Kubernetes入門 11.1 Kubernetes是什么 21.2 為什么要用Kubernetes 51.3 從一個簡單的例子開始 61.3.1 環境準備 71.3.2 啟動MySQL服務 71.3.3 啟動Tomcat應用 101.3.4 通過瀏覽器訪問網頁 121.4 Kubernetes的基本概念和術語 131.4.1 Master 161.4.2 Node 161.4.3 Pod 191.4.4 Label 241.4.5 Replication Controller 281.4.6 Deployment 311.4.7 Horizontal Pod Autoscaler 341.4.8 StatefulSet 361.4.9 Service 371.4.10 Job 451.4.11 Volume 451.4.12 Persistent Volume 491.4.13 Namespace 511.4.14 Annotation 521.4.15 ConfigMap 531.4.16 小結 54第2章 Kubernetes安裝配置指南 552.1 系統要求 562.2 使用kubeadm工具快速安裝Kubernetes集群 572.2.1 安裝kubeadm和相關工具 572.2.2 kubeadm config 582.2.3 下載Kubernetes的相關鏡像 592.2.4 運行kubeadm init命令安裝Master 592.2.5 安裝Node,加入集群 612.2.6 安裝網絡插件 622.2.7 驗證Kubernetes集群是否安裝完成 632.3 以二進制文件方式安裝Kubernetes集群 642.3.1 Master上的etcd、kube-apiserver、kube-controller-manager、kube-scheduler服務 662.3.2 Node上的kubelet、kube-proxy服務 712.4 Kubernetes集群的安全設置 732.4.1 基于CA簽名的雙向數字證書認證方式 732.4.2 基于HTTP Base或Token的簡單認證方式 782.5 Kubernetes集群的網絡配置 802.6 內網中的Kubernetes相關配置 802.6.1 Docker Private Registry(私有Docker鏡像庫) 802.6.2 kubelet配置 812.7 Kubernetes的版本升級 812.7.1 二進制升級 812.7.2 使用kubeadm進行集群升級 822.8 Kubernetes核心服務配置詳解 842.8.1 公共配置參數 842.8.2 kube-apiserver啟動參數 852.8.3 kube-controller-manager啟動參數 972.8.4 kube-scheduler啟動參數 1072.8.5 kubelet啟動參數 1132.8.6 kube-proxy啟動參數 1282.9 CRI(容器運行時接口)詳解 1322.9.1 CRI概述 1322.9.2 CRI的主要組件 1332.9.3 Pod和容器的生命周期管理 1332.9.4 面向容器級別的設計思路 1352.9.5 嘗試使用新的Docker-CRI來創建容器 1362.9.6 CRI的進展 1372.10 kubectl命令行工具用法詳解 1372.10.1 kubectl用法概述 1372.10.2 kubectl子命令詳解 1392.10.3 kubectl參數列表 1422.10.4 kubectl輸出格式 1432.10.5 kubectl操作示例 145第3章 深入掌握Pod 1493.1 Pod定義詳解 1503.2 Pod的基本用法 1563.3 靜態Pod 1613.4 Pod容器共享Volume 1623.5 Pod的配置管理 1653.5.1 ConfigMap概述 1653.5.2 創建ConfigMap資源對象 1653.5.3 在Pod中使用ConfigMap 1733.5.4 使用ConfigMap的限制條件 1793.6 在容器內獲取Pod信息(Downward API) 1803.6.1 環境變量方式:將Pod信息注入為環境變量 1803.6.2 環境變量方式:將容器資源信息注入為環境變量 1823.6.3 Volume掛載方式 1843.7 Pod生命周期和重啟策略 1863.8 Pod健康檢查和服務可用性檢查 1873.9 玩轉Pod調度 1903.9.1 Deployment或RC:全自動調度 1933.9.2 NodeSelector:定向調度 1943.9.3 NodeAffinity:Node親和性調度 1973.9.4 PodAffinity:Pod親和與互斥調度策略 1983.9.5 Taints和Tolerations(污點和容忍) 2023.9.6 Pod Priority Preemption:Pod優先級調度 2063.9.7 DaemonSet:在每個Node上都調度一個Pod 2093.9.8 Job:批處理調度 2113.9.9 Cronjob:定時任務 2153.9.10 自定義調度器 2193.10 Init Container(初始化容器) 2203.11 Pod的升級和回滾 2243.11.1 Deployment的升級 2253.11.2 Deployment的回滾 2313.11.3 暫停和恢復Deployment的部署操作,以完成復雜的修改 2343.11.4 使用kubectl rolling-update命令完成RC的滾動升級 2363.11.5 其他管理對象的更新策略 2393.12 Pod的擴縮容 2403.12.1 手動擴縮容機制 2403.12.2 自動擴縮容機制 2413.13 使用StatefulSet搭建MongoDB集群 2643.13.1 前提條件 2643.13.2 創建StatefulSet 2653.13.3 查看MongoDB集群的狀態 2693.13.4 StatefulSet的常見應用場景 271第4章 深入掌握Service 2764.1 Service定義詳解 2774.2 Service的基本用法 2794.2.1 多端口Service 2824.2.2 外部服務Service 2834.3 Headless Service 2844.3.1 自定義SeedProvider 2854.3.2 通過Service動態查找Pod 2864.3.3 Cassandra集群中新節點的自動添加 2894.4 從集群外部訪問Pod或Service 2914.4.1 將容器應用的端口號映射到物理機 2914.4.2 將Service的端口號映射到物理機 2924.5 DNS服務搭建和配置指南 2944.5.1 在創建DNS服務之前修改每個Node上kubelet的啟動參數 2964.5.2 創建CoreDNS應用 2974.5.3 服務名的DNS解析 3014.5.4 CoreDNS的配置說明 3024.5.5 Pod級別的DNS配置說明 3044.6 Ingress:HTTP 7層路由機制 3064.6.1 創建Ingress Controller和默認的backend服務 3074.6.2 定義Ingress策略 3114.6.3 客戶端訪問http://mywebsite.com/demo 3134.6.4 Ingress的策略配置技巧 3164.6.5 Ingress的TLS安全設置 320第5章 核心組件運行機制 3265.1 Kubernetes API Server原理解析 3275.1.1 Kubernetes API Server概述 3275.1.2 API Server架構解析 3305.1.3 獨特的Kubernetes Proxy API接口 3345.1.4 集群功能模塊之間的通信 3365.2 Controller Manager原理解析 3375.2.1 Replication Controller 3385.2.2 Node Controller 3395.2.3 ResourceQuota Controller 3415.2.4 Namespace Controller 3435.2.5 Service Controller與Endpoints Controller 3435.3 Scheduler原理解析 3445.4 kubelet運行機制解析 3485.4.1 節點管理 3495.4.2 Pod管理 3495.4.3 容器健康檢查 3515.4.4 cAdvisor資源監控 3525.5 kube-proxy運行機制解析 354第6章 深入分析集群安全機制 3586.1 API Server認證管理 3596.2 API Server授權管理 3616.2.1 ABAC授權模式詳解 3626.2.2 Webhook授權模式詳解 3656.2.3 RBAC授權模式詳解 3686.3 Admission Control 3846.4 Service Account 3886.5 Secret私密憑據 3936.6 Pod的安全策略配置 3966.6.1 PodSecurityPolicy的工作機制 3976.6.2 PodSecurityPolicy配置詳解 3996.6.3 Pod的安全設置詳解 406第7章 網絡原理 4107.1 Kubernetes網絡模型 4117.2 Docker網絡基礎 4137.2.1 網絡命名空間 4137.2.2 Veth設備對 4167.2.3 網橋 4197.2.4 iptables和Netfilter 4217.2.5 路由 4247.3 Docker的網絡實現 4267.4 Kubernetes的網絡實現 4357.4.1 容器到容器的通信 4357.4.2 Pod之間的通信 4367.5 Pod和Service網絡實戰 4397.6 CNI網絡模型 4547.6.1 CNM模型 4547.6.2 CNI模型 4557.6.3 在Kubernetes中使用網絡插件 4677.7 Kubernetes網絡策略 4677.7.1 網絡策略配置說明 4687.7.2 在Namespace級別設置默認的網絡策略 4707.7.3 NetworkPolicy的發展 4727.8 開源的網絡組件 4727.8.1 Flannel 4727.8.2 Open vSwitch 4777.8.3 直接路由 4837.8.4 Calico容器網絡和網絡策略實戰 486第8章 共享存儲原理 5088.1 共享存儲機制概述 5098.2 PV詳解 5108.2.1 PV的關鍵配置參數 5118.2.2 PV生命周期的各個階段 5158.3 PVC詳解 5168.4 PV和PVC的生命周期 5188.4.1 資源供應 5188.4.2 資源綁定 5198.4.3 資源使用 5198.4.4 資源釋放 5198.4.5 資源回收 5198.5 StorageClass詳解 5218.5.1 StorageClass的關鍵配置參數 5218.5.2 設置默認的StorageClass 5248.6 動態存儲管理實戰:GlusterFS 5248.6.1 準備工作 5258.6.2 創建GlusterFS管理服務容器集群 5258.6.3 創建Heketi服務 5288.6.4 為Heketi設置GlusterFS集群 5308.6.5 定義StorageClass 5338.6.6 定義PVC 5348.6.7 Pod使用PVC的存儲資源 5368.7 CSI存儲機制詳解 5378.7.1 CSI的設計背景 5388.7.2 CSI存儲插件的關鍵組件和部署架構 5398.7.3 CSI存儲插件的使用示例 5408.7.4 CSI的發展 556第9章 Kubernetes開發指南 5609.1 REST簡述 5619.2 Kubernetes API詳解 5639.2.1 Kubernetes API概述 5639.2.2 Kubernetes API版本的演進策略 5709.2.3 API Groups(API組) 5719.2.4 API REST的方法說明 5739.2.5 API Server響應說明 5759.3 使用Java程序訪問Kubernetes API 5779.3.1 Jersey 5779.3.2 Fabric8 5909.3.3 使用說明 5919.3.4 其他客戶端庫 6159.4 Kubernetes API的擴展 6169.4.1 使用CRD擴展API資源 6179.4.2 使用API聚合機制擴展API資源 626第10章 Kubernetes集群管理 63510.1 Node的管理 63610.1.1 Node的隔離與恢復 63610.1.2 Node的擴容 63710.2 更新資源對象的Label 63810.3 Namespace:集群環境共享與隔離 63910.3.1 創建Namespace 63910.3.2 定義Context(運行環境) 64010.3.3 設置工作組在特定Context環境下工作 64110.4 Kubernetes資源管理 64310.4.1 計算資源管理 64510.4.2 資源配置范圍管理(LimitRange) 65510.4.3 資源服務質量管理(Resource QoS) 66210.4.4 資源配額管理(Resource Quotas) 67010.4.5 ResourceQuota和LimitRange實踐 67610.4.6 資源管理總結 68510.5 資源緊缺時的Pod驅逐機制 68610.5.1 驅逐策略 68610.5.2 驅逐信號 68610.5.3 驅逐閾值 68810.5.4 驅逐監控頻率 68910.5.5 節點的狀況 68910.5.6 節點狀況的抖動 69010.5.7 回收Node級別的資源 69010.5.8 驅逐用戶的Pod 69110.5.9 資源最少回收量 69210.5.10 節點資源緊缺情況下的系統行為 69210.5.11 可調度的資源和驅逐策略實踐 69410.5.12 現階段的問題 69410.6 Pod Disruption Budget(主動驅逐保護) 69510.7 Kubernetes集群的高可用部署方案 69710.7.1 手工方式的高可用部署方案 69810.7.2 使用kubeadm的高可用部署方案 70910.8 Kubernetes集群監控 71710.8.1 通過Metrics Server監控Pod和Node的CPU和內存資源使用數據 71710.8.2 Prometheus+Grafana集群性能監控平臺搭建 72010.9 集群統一日志管理 73210.9.1 系統部署架構 73310.9.2 創建Elasticsearch RC和Service 73310.9.3 在每個Node上啟動Fluentd 73610.9.4 運行Kibana 73810.10 Kubernetes的審計機制 74210.11 使用Web UI(Dashboard)管理集群 74610.12 Helm:Kubernetes應用包管理工具 75010.12.1 Helm概述 75010.12.2 Helm的主要概念 75110.12.3 安裝Helm 75110.12.4 Helm的常見用法 75210.12.5 --set的格式和限制 75610.12.6 更多的安裝方法 75710.12.7 helm upgrade和helm rollback:應用的更新或回滾 75710.12.8 helm install/upgrade/rollback命令的常用參數 75810.12.9 helm delete:刪除一個Release 75910.12.10 helm repo:倉庫的使用 75910.12.11 自定義Chart 75910.12.12 對Chart目錄結構和配置文件的說明 75910.12.13 對Chart.yaml文件的說明 76010.12.14 快速制作自定義的Chart 76110.12.15 搭建私有Repository 761第11章 Trouble Shooting指導 76311.1 查看系統Event 76411.2 查看容器日志 76611.3 查看Kubernetes服務日志 76711.4 常見問題 76911.4.1 由于無法下載pause鏡像導致Pod一直處于Pending狀態 76911.4.2 Pod創建成功,但RESTARTS數量持續增加 77111.4.3 通過服務名無法訪問服務 77211.5 尋求幫助 773第12章 Kubernetes開發中的新功能 77712.1 對Windows容器的支持 77812.1.1 Windows Node部署 77812.1.2 Windows容器支持的Kubernetes特性和發展趨勢 79012.2 對GPU的支持 79112.2.1 環境準備 79212.2.2 在容器中使用GPU資源 79512.2.3 發展趨勢 79712.3 Pod的垂直擴縮容 79712.3.1 前提條件 79812.3.2 安裝Vertical Pod Autoscaler 79812.3.3 為Pod設置垂直擴縮容 79812.3.4 注意事項 80012.4 Kubernetes的演進路線和開發模式 801