Kubernetes權威指南:從Docker到Kubernetes實踐全接觸(第4版)( 簡體 字) | |
作者:龔正 等 | 類別:1. -> 作業系統 -> Docker |
出版社:電子工業出版社 | 3dWoo書號: 51128 詢問書籍請說出此書號! 有庫存 NT售價: 840 元 |
出版日:5/1/2019 | |
頁數:824 | |
光碟數:0 | |
站長推薦: | |
印刷:黑白印刷 | 語系: ( 簡體 字 ) |
ISBN:9787121362354 | 加入購物車 │加到我的最愛 (請先登入會員) |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社) | |
第1章 Kubernetes入門 1
1.1 Kubernetes是什么 2 1.2 為什么要用Kubernetes 5 1.3 從一個簡單的例子開始 6 1.3.1 環境準備 7 1.3.2 啟動MySQL服務 7 1.3.3 啟動Tomcat應用 10 1.3.4 通過瀏覽器訪問網頁 12 1.4 Kubernetes的基本概念和術語 13 1.4.1 Master 16 1.4.2 Node 16 1.4.3 Pod 19 1.4.4 Label 24 1.4.5 Replication Controller 28 1.4.6 Deployment 31 1.4.7 Horizontal Pod Autoscaler 34 1.4.8 StatefulSet 36 1.4.9 Service 37 1.4.10 Job 45 1.4.11 Volume 45 1.4.12 Persistent Volume 49 1.4.13 Namespace 51 1.4.14 Annotation 52 1.4.15 ConfigMap 53 1.4.16 小結 54 第2章 Kubernetes安裝配置指南 55 2.1 系統要求 56 2.2 使用kubeadm工具快速安裝Kubernetes集群 57 2.2.1 安裝kubeadm和相關工具 57 2.2.2 kubeadm config 58 2.2.3 下載Kubernetes的相關鏡像 59 2.2.4 運行kubeadm init命令安裝Master 59 2.2.5 安裝Node,加入集群 61 2.2.6 安裝網絡插件 62 2.2.7 驗證Kubernetes集群是否安裝完成 63 2.3 以二進制文件方式安裝Kubernetes集群 64 2.3.1 Master上的etcd、kube-apiserver、kube-controller-manager、kube-scheduler服務 66 2.3.2 Node上的kubelet、kube-proxy服務 71 2.4 Kubernetes集群的安全設置 73 2.4.1 基于CA簽名的雙向數字證書認證方式 73 2.4.2 基于HTTP Base或Token的簡單認證方式 78 2.5 Kubernetes集群的網絡配置 80 2.6 內網中的Kubernetes相關配置 80 2.6.1 Docker Private Registry(私有Docker鏡像庫) 80 2.6.2 kubelet配置 81 2.7 Kubernetes的版本升級 81 2.7.1 二進制升級 81 2.7.2 使用kubeadm進行集群升級 82 2.8 Kubernetes核心服務配置詳解 84 2.8.1 公共配置參數 84 2.8.2 kube-apiserver啟動參數 85 2.8.3 kube-controller-manager啟動參數 97 2.8.4 kube-scheduler啟動參數 107 2.8.5 kubelet啟動參數 113 2.8.6 kube-proxy啟動參數 128 2.9 CRI(容器運行時接口)詳解 132 2.9.1 CRI概述 132 2.9.2 CRI的主要組件 133 2.9.3 Pod和容器的生命周期管理 133 2.9.4 面向容器級別的設計思路 135 2.9.5 嘗試使用新的Docker-CRI來創建容器 136 2.9.6 CRI的進展 137 2.10 kubectl命令行工具用法詳解 137 2.10.1 kubectl用法概述 137 2.10.2 kubectl子命令詳解 139 2.10.3 kubectl參數列表 142 2.10.4 kubectl輸出格式 143 2.10.5 kubectl操作示例 145 第3章 深入掌握Pod 149 3.1 Pod定義詳解 150 3.2 Pod的基本用法 156 3.3 靜態Pod 161 3.4 Pod容器共享Volume 162 3.5 Pod的配置管理 165 3.5.1 ConfigMap概述 165 3.5.2 創建ConfigMap資源對象 165 3.5.3 在Pod中使用ConfigMap 173 3.5.4 使用ConfigMap的限制條件 179 3.6 在容器內獲取Pod信息(Downward API) 180 3.6.1 環境變量方式:將Pod信息注入為環境變量 180 3.6.2 環境變量方式:將容器資源信息注入為環境變量 182 3.6.3 Volume掛載方式 184 3.7 Pod生命周期和重啟策略 186 3.8 Pod健康檢查和服務可用性檢查 187 3.9 玩轉Pod調度 190 3.9.1 Deployment或RC:全自動調度 193 3.9.2 NodeSelector:定向調度 194 3.9.3 NodeAffinity:Node親和性調度 197 3.9.4 PodAffinity:Pod親和與互斥調度策略 198 3.9.5 Taints和Tolerations(污點和容忍) 202 3.9.6 Pod Priority Preemption:Pod優先級調度 206 3.9.7 DaemonSet:在每個Node上都調度一個Pod 209 3.9.8 Job:批處理調度 211 3.9.9 Cronjob:定時任務 215 3.9.10 自定義調度器 219 3.10 Init Container(初始化容器) 220 3.11 Pod的升級和回滾 224 3.11.1 Deployment的升級 225 3.11.2 Deployment的回滾 231 3.11.3 暫停和恢復Deployment的部署操作,以完成復雜的修改 234 3.11.4 使用kubectl rolling-update命令完成RC的滾動升級 236 3.11.5 其他管理對象的更新策略 239 3.12 Pod的擴縮容 240 3.12.1 手動擴縮容機制 240 3.12.2 自動擴縮容機制 241 3.13 使用StatefulSet搭建MongoDB集群 264 3.13.1 前提條件 264 3.13.2 創建StatefulSet 265 3.13.3 查看MongoDB集群的狀態 269 3.13.4 StatefulSet的常見應用場景 271 第4章 深入掌握Service 276 4.1 Service定義詳解 277 4.2 Service的基本用法 279 4.2.1 多端口Service 282 4.2.2 外部服務Service 283 4.3 Headless Service 284 4.3.1 自定義SeedProvider 285 4.3.2 通過Service動態查找Pod 286 4.3.3 Cassandra集群中新節點的自動添加 289 4.4 從集群外部訪問Pod或Service 291 4.4.1 將容器應用的端口號映射到物理機 291 4.4.2 將Service的端口號映射到物理機 292 4.5 DNS服務搭建和配置指南 294 4.5.1 在創建DNS服務之前修改每個Node上kubelet的啟動參數 296 4.5.2 創建CoreDNS應用 297 4.5.3 服務名的DNS解析 301 4.5.4 CoreDNS的配置說明 302 4.5.5 Pod級別的DNS配置說明 304 4.6 Ingress:HTTP 7層路由機制 306 4.6.1 創建Ingress Controller和默認的backend服務 307 4.6.2 定義Ingress策略 311 4.6.3 客戶端訪問http://mywebsite.com/demo 313 4.6.4 Ingress的策略配置技巧 316 4.6.5 Ingress的TLS安全設置 320 第5章 核心組件運行機制 326 5.1 Kubernetes API Server原理解析 327 5.1.1 Kubernetes API Server概述 327 5.1.2 API Server架構解析 330 5.1.3 獨特的Kubernetes Proxy API接口 334 5.1.4 集群功能模塊之間的通信 336 5.2 Controller Manager原理解析 337 5.2.1 Replication Controller 338 5.2.2 Node Controller 339 5.2.3 ResourceQuota Controller 341 5.2.4 Namespace Controller 343 5.2.5 Service Controller與Endpoints Controller 343 5.3 Scheduler原理解析 344 5.4 kubelet運行機制解析 348 5.4.1 節點管理 349 5.4.2 Pod管理 349 5.4.3 容器健康檢查 351 5.4.4 cAdvisor資源監控 352 5.5 kube-proxy運行機制解析 354 第6章 深入分析集群安全機制 358 6.1 API Server認證管理 359 6.2 API Server授權管理 361 6.2.1 ABAC授權模式詳解 362 6.2.2 Webhook授權模式詳解 365 6.2.3 RBAC授權模式詳解 368 6.3 Admission Control 384 6.4 Service Account 388 6.5 Secret私密憑據 393 6.6 Pod的安全策略配置 396 6.6.1 PodSecurityPolicy的工作機制 397 6.6.2 PodSecurityPolicy配置詳解 399 6.6.3 Pod的安全設置詳解 406 第7章 網絡原理 410 7.1 Kubernetes網絡模型 411 7.2 Docker網絡基礎 413 7.2.1 網絡命名空間 413 7.2.2 Veth設備對 416 7.2.3 網橋 419 7.2.4 iptables和Netfilter 421 7.2.5 路由 424 7.3 Docker的網絡實現 426 7.4 Kubernetes的網絡實現 435 7.4.1 容器到容器的通信 435 7.4.2 Pod之間的通信 436 7.5 Pod和Service網絡實戰 439 7.6 CNI網絡模型 454 7.6.1 CNM模型 454 7.6.2 CNI模型 455 7.6.3 在Kubernetes中使用網絡插件 467 7.7 Kubernetes網絡策略 467 7.7.1 網絡策略配置說明 468 7.7.2 在Namespace級別設置默認的網絡策略 470 7.7.3 NetworkPolicy的發展 472 7.8 開源的網絡組件 472 7.8.1 Flannel 472 7.8.2 Open vSwitch 477 7.8.3 直接路由 483 7.8.4 Calico容器網絡和網絡策略實戰 486 第8章 共享存儲原理 508 8.1 共享存儲機制概述 509 8.2 PV詳解 510 8.2.1 PV的關鍵配置參數 511 8.2.2 PV生命周期的各個階段 515 8.3 PVC詳解 516 8.4 PV和PVC的生命周期 518 8.4.1 資源供應 518 8.4.2 資源綁定 519 8.4.3 資源使用 519 8.4.4 資源釋放 519 8.4.5 資源回收 519 8.5 StorageClass詳解 521 8.5.1 StorageClass的關鍵配置參數 521 8.5.2 設置默認的StorageClass 524 8.6 動態存儲管理實戰:GlusterFS 524 8.6.1 準備工作 525 8.6.2 創建GlusterFS管理服務容器集群 525 8.6.3 創建Heketi服務 528 8.6.4 為Heketi設置GlusterFS集群 530 8.6.5 定義StorageClass 533 8.6.6 定義PVC 534 8.6.7 Pod使用PVC的存儲資源 536 8.7 CSI存儲機制詳解 537 8.7.1 CSI的設計背景 538 8.7.2 CSI存儲插件的關鍵組件和部署架構 539 8.7.3 CSI存儲插件的使用示例 540 8.7.4 CSI的發展 556 第9章 Kubernetes開發指南 560 9.1 REST簡述 561 9.2 Kubernetes API詳解 563 9.2.1 Kubernetes API概述 563 9.2.2 Kubernetes API版本的演進策略 570 9.2.3 API Groups(API組) 571 9.2.4 API REST的方法說明 573 9.2.5 API Server響應說明 575 9.3 使用Java程序訪問Kubernetes API 577 9.3.1 Jersey 577 9.3.2 Fabric8 590 9.3.3 使用說明 591 9.3.4 其他客戶端庫 615 9.4 Kubernetes API的擴展 616 9.4.1 使用CRD擴展API資源 617 9.4.2 使用API聚合機制擴展API資源 626 第10章 Kubernetes集群管理 635 10.1 Node的管理 636 10.1.1 Node的隔離與恢復 636 10.1.2 Node的擴容 637 10.2 更新資源對象的Label 638 10.3 Namespace:集群環境共享與隔離 639 10.3.1 創建Namespace 639 10.3.2 定義Context(運行環境) 640 10.3.3 設置工作組在特定Context環境下工作 641 10.4 Kubernetes資源管理 643 10.4.1 計算資源管理 645 10.4.2 資源配置范圍管理(LimitRange) 655 10.4.3 資源服務質量管理(Resource QoS) 662 10.4.4 資源配額管理(Resource Quotas) 670 10.4.5 ResourceQuota和LimitRange實踐 676 10.4.6 資源管理總結 685 10.5 資源緊缺時的Pod驅逐機制 686 10.5.1 驅逐策略 686 10.5.2 驅逐信號 686 10.5.3 驅逐閾值 688 10.5.4 驅逐監控頻率 689 10.5.5 節點的狀況 689 10.5.6 節點狀況的抖動 690 10.5.7 回收Node級別的資源 690 10.5.8 驅逐用戶的Pod 691 10.5.9 資源最少回收量 692 10.5.10 節點資源緊缺情況下的系統行為 692 10.5.11 可調度的資源和驅逐策略實踐 694 10.5.12 現階段的問題 694 10.6 Pod Disruption Budget(主動驅逐保護) 695 10.7 Kubernetes集群的高可用部署方案 697 10.7.1 手工方式的高可用部署方案 698 10.7.2 使用kubeadm的高可用部署方案 709 10.8 Kubernetes集群監控 717 10.8.1 通過Metrics Server監控Pod和Node的CPU和內存資源使用數據 717 10.8.2 Prometheus+Grafana集群性能監控平臺搭建 720 10.9 集群統一日志管理 732 10.9.1 系統部署架構 733 10.9.2 創建Elasticsearch RC和Service 733 10.9.3 在每個Node上啟動Fluentd 736 10.9.4 運行Kibana 738 10.10 Kubernetes的審計機制 742 10.11 使用Web UI(Dashboard)管理集群 746 10.12 Helm:Kubernetes應用包管理工具 750 10.12.1 Helm概述 750 10.12.2 Helm的主要概念 751 10.12.3 安裝Helm 751 10.12.4 Helm的常見用法 752 10.12.5 --set的格式和限制 756 10.12.6 更多的安裝方法 757 10.12.7 helm upgrade和helm rollback:應用的更新或回滾 757 10.12.8 helm install/upgrade/rollback命令的常用參數 758 10.12.9 helm delete:刪除一個Release 759 10.12.10 helm repo:倉庫的使用 759 10.12.11 自定義Chart 759 10.12.12 對Chart目錄結構和配置文件的說明 759 10.12.13 對Chart.yaml文件的說明 760 10.12.14 快速制作自定義的Chart 761 10.12.15 搭建私有Repository 761 第11章 Trouble Shooting指導 763 11.1 查看系統Event 764 11.2 查看容器日志 766 11.3 查看Kubernetes服務日志 767 11.4 常見問題 769 11.4.1 由于無法下載pause鏡像導致Pod一直處于Pending狀態 769 11.4.2 Pod創建成功,但RESTARTS數量持續增加 771 11.4.3 通過服務名無法訪問服務 772 11.5 尋求幫助 773 第12章 Kubernetes開發中的新功能 777 12.1 對Windows容器的支持 778 12.1.1 Windows Node部署 778 12.1.2 Windows容器支持的Kubernetes特性和發展趨勢 790 12.2 對GPU的支持 791 12.2.1 環境準備 792 12.2.2 在容器中使用GPU資源 795 12.2.3 發展趨勢 797 12.3 Pod的垂直擴縮容 797 12.3.1 前提條件 798 12.3.2 安裝Vertical Pod Autoscaler 798 12.3.3 為Pod設置垂直擴縮容 798 12.3.4 注意事項 800 12.4 Kubernetes的演進路線和開發模式 801 Kubernetes是由谷歌開源的Docker容器集群管理系統,為容器化的應用提供了資源調度、部署運行、服務發現、擴容及縮容等一整套功能。本書從架構師、開發人員和運維人員的角度,闡述了Kubernetes的基本概念、實踐指南、核心原理、開發指導、運維指南、新特性演進等內容,圖文并茂、內容豐富、由淺入深、講解全面;并圍繞在生產環境中可能出現的問題,給出了大量的典型案例,比如安全配置方案、網絡方案、共享存儲方案、高可用方案及Trouble Shooting技巧等,有很強的實戰指導意義。本書內容隨著Kubernetes的版本更新不斷完善,目前涵蓋了Kubernetes從1.0到1.14版本的主要特性,努力為Kubernetes用戶提供全方位的Kubernetes技術指南。本書源碼已上傳至GitHub的kubeguide/K8sDefinitiveGuide-V4-Sourcecode目錄,可自行下載本書源碼進行練習。無論是對于軟件工程師、測試工程師、運維工程師、軟件架構師、技術經理,還是對于資深IT人士,本書都極具參考價值。
自 序
本書第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精品書,值得閱讀! 初瑞 中國移動業務支撐中心高級經理 |