在過去幾年中,容器技術的廣泛應用推動了容器編排技術的迅猛發(fā)展,尤其是Kubernetes的興起。作為當前非常受歡迎的容器編排系統(tǒng),Kubernetes能夠有效應對生產環(huán)境中復雜的編排需求,幫助企業(yè)實現(xiàn)大規(guī)模多容器集群的高效管理。本書將Kubernetes1.25.0版本源碼作為剖析對象,深入探討其核心組件和實現(xiàn)原理。通過學習Kubernetes源碼,讀者不僅能掌握容器編排技術的精髓,還能提升自身在云計算領域的競爭力。
第1章 Kubernetes基本架構 1
1.1 Kubernetes發(fā)展歷史 1
1.2 Kubernetes架構 2
1.3 Kubernetes各組件功能 3
1.3.1 kubectl 4
1.3.2 client-go 4
1.3.3 kube-apiserver 4
1.3.4 kube-controller-manager 4
1.3.5 kube-scheduler 5
1.3.6 kubelet 5
1.3.7 kube-proxy 6
1.3.8 Container Runtime 6
1.4 Kubernetes Project Layout設計 7
第2章 Kubernetes構建過程 10
2.1 構建方式 10
2.2 一切都始于Makefile 12
2.3 本地環(huán)境構建 13
2.3.1 本地環(huán)境構建命令 13
2.3.2 本地環(huán)境構建過程 14
2.4 容器環(huán)境構建 16
2.4.1 容器環(huán)境構建命令 16
2.4.2 容器環(huán)境構建過程 16
第3章 Kubernetes核心數(shù)據結構 19
3.1 初識數(shù)據結構 19
3.2 基本概念 19
3.2.1 API的層次結構 19
3.2.2 版本控制 20
3.2.3 組 21
3.2.4 API術語 22
3.2.5 API資源組成 25
3.2.6 版本化資源與未版本化資源 26
3.2.7 內部版本與外部版本 27
3.3 Kubernetes API的數(shù)據結構 28
3.3.1 APIGroup、APIVersions 28
3.3.2 APIResource 30
3.3.3 GVK和GVR 32
3.3.4 內置資源全景圖 33
3.4 Kubernetes資源定義 35
3.4.1 內部版本定義 35
3.4.2 外部版本定義 36
3.5 將資源注冊到Scheme中 36
3.5.1 資源類型注冊入口 37
3.5.2 Scheme的數(shù)據結構 38
3.5.3 Scheme的初始化 40
3.5.4 SchemeBuilder資源注冊 41
3.5.5 資源外部版本注冊 43
3.5.6 資源內部版本注冊 44
3.5.7 所有資源的注冊入口 45
3.5.8 資源注冊表的查詢方法 47
3.5.9 資源對象的創(chuàng)建 48
3.5.10 資源對象的轉換 48
3.5.11 資源對象默認值的設置 49
3.5.12 資源字段的轉換 49
3.6 對象體系設計 49
3.6.1 資源對象的基本信息 49
3.6.2 對象體系類圖 50
3.6.3 runtime.Object 51
3.6.4 metav1.TypeMeta 52
3.6.5 metav1.ObjectMeta 52
3.6.6 Unstructured 53
3.7 runtime.Codec資源編/解碼 55
3.7.1 編/解碼數(shù)據結構 56
3.7.2 CodecFactory實例化 57
3.7.3 codec編/解碼實現(xiàn)類 60
3.7.4 json.Serializer編/解碼 64
3.7.5 protobuf.Serializer編/解碼 65
3.7.6 UnstructuredJSONScheme實現(xiàn)類 67
3.7.7 NegotiatedSerializer 67
3.7.8 ParameterCodec 69
3.7.9 runtime包下的Codec相關函數(shù) 71
3.7.10 Codec核心調用鏈路 72
3.7.11 Codec的使用方式 74
3.8 Converter資源版本轉換器 75
3.8.1 Converter的數(shù)據結構 76
3.8.2 Converter轉換函數(shù)的注冊 77
3.8.3 Converter的初始化 77
3.8.4 Converter資源版本轉換的實現(xiàn) 78
3.9 使用RESTMapper管理GVR和GVK映射 79
3.9.1 RESTMapper的數(shù)據結構 80
3.9.2 RESTMapper實現(xiàn)類 81
3.9.3 DefaultRESTMapper默認實現(xiàn)類 82
3.9.4 PriorityRESTMapper優(yōu)先級映射 83
3.9.5 DeferredDiscoveryRESTMapper實現(xiàn)類 84
3.9.6 RESTMapper的使用 85
3.9.7 RESTMapping的數(shù)據結構及典型用法 85
第4章 Kubernetes核心資源對象 87
4.1 初識Kubernetes資源對象 87
4.2 metav1.ObjectMeta屬性元數(shù)據 88
4.2.1 Name 88
4.2.2 GenerateName 89
4.2.3 Annotation 89
4.2.4 Generation 89
4.2.5 ResourceVersion 90
4.2.6 OwnerReference 91
4.2.7 Finalizers 92
4.2.8 ManagedFields 94
4.3 Pod資源對象 99
4.3.1 PodSpec字段詳解 100
4.3.2 Container字段詳解 110
4.3.3 Pod創(chuàng)建流程 114
4.3.4 Pause容器及創(chuàng)建流程 115
4.3.5 PodSpec生成容器參數(shù) 122
4.3.6 容器的通用創(chuàng)建流程 124
4.3.7 資源配額與cgroup 126
4.3.8 QoS與驅逐順序 131
4.3.9 靜態(tài)Pod 135
4.3.10 健康檢查 137
4.3.11 Pod的狀態(tài) 140
4.3.12 原地升級 144
4.4 工作負載資源 146
4.4.1 Deployment 146
4.4.2 ReplicaSet 153
4.4.3 StatefulSet 156
4.4.4 DaemonSet 160
4.4.5 Job 163
4.4.6 CronJob 166
4.5 發(fā)現(xiàn)和負載均衡資源 169
4.5.1 Service 169
4.5.2 Ingress 175
4.5.3 Endpoints 177
4.5.4 EndpointSlice 178
4.5.5 NetworkPolicy 182
4.6 配置和存儲資源 185
4.6.1 卷 185
4.6.2 PV與PVC 186
4.6.3 StorageClass 191
4.7 自定義資源 194
4.7.1 概述 194
4.7.2 Operator 196
4.7.3 controller-runtime 197
4.7.4 Kubebuilder 198
第5章 client-go編程式交互 200
5.1 初識client-go 200
5.2 客戶端 200
5.2.1 kubeconfig配置管理 201
5.2.2 RESTClient客戶端 204
5.2.3 ClientSet客戶端 207
5.2.4 DynamicClient客戶端 210
5.2.5 DiscoveryClient發(fā)現(xiàn)客戶端 212
5.3 Informer機制 214
5.3.1 Informer使用示例 214
5.3.2 Informer架構 216
5.3.3 Reflector數(shù)據同步 217
5.3.4 DeltaFIFO操作隊列 223
5.3.5 Indexer資源緩存 226
5.3.6 processor資源處理 230
5.3.7 workqueue工作隊列 233
5.4 常用工具類 240
5.4.1 事件管理機制 240
5.4.2 Leader選舉機制 247
第6章 kubectl命令式交互 256
6.1 初識kubectl 256
6.2 kubectl執(zhí)行流程 256
6.2.1 初始化命令對象 257
6.2.2 補全命令參數(shù) 257
6.2.3 校驗命令參數(shù) 258
6.2.4 執(zhí)行命令輸出結果 258
6.3 kubectl緩存機制 263
6.3.1 緩存數(shù)據結構 264
6.3.2 緩存機制詳解 265
6.3.3 緩存使用場景 269
6.4 kubectl變更比對策略 272
6.4.1 變更比對策略介紹 272
6.4.2 服務端應用和客戶端應用 272
6.4.3 策略比對器和JSON比對器 274
6.4.4 雙路合并和三路合并 275
6.5 kubectl擴展命令 277
6.5.1 擴展命令介紹 277
6.5.2 擴展命令實現(xiàn)原理 277
6.5.3 擴展命令管理器Krew 278
第7章 etcd存儲核心實現(xiàn) 280
7.1 初識etcd存儲 280
7.2 etcd存儲架構設計 280
7.3 RESTStorage資源存儲接口 282
7.4 genericregistry.Store通用操作封裝 283
7.4.1 標準存儲實現(xiàn) 283
7.4.2 版本沖突檢測 284
7.4.3 通用鉤子函數(shù) 284
7.4.4 DryRun實現(xiàn)原理 287
7.5 storage.Interface通用存儲接口 288
7.6 Cacher Storage緩存層 290
7.6.1 Cacher Storage緩存架構 291
7.6.2 ResourceVersion資源版本號 295
7.6.3 watchCache緩存滑動窗口 297
7.7 Underlying Storage底層存儲對象 300
7.8 Codec數(shù)據編/解碼 301
7.9 Strategy預處理 304
7.9.1 Create Strategy預處理 304
7.9.2 Update Strategy預處理 307
7.9.3 Delete Strategy預處理 308
第8章 kube-apiserver核心實現(xiàn) 310
8.1 初識kube-apiserver 310
8.2 網絡通信框架 311
8.2.1 go-restful框架 311
8.2.2 Protobuf序列化 314
8.3 kube-apiserver架構設計 319
8.4 kube-apiserver啟動流程 321
8.4.1 Scheme資源注冊 322
8.4.2 Cobra命令行參數(shù)解析 324
8.4.3 創(chuàng)建API Server通用配置 325
8.4.4 創(chuàng)建APIExtensionsServer 336
8.4.5 創(chuàng)建KubeAPIServer 345
8.4.6 創(chuàng)建AggregatorServer 353
8.4.7 GenericAPIServer初始化 360
8.4.8 準備和啟動HTTPS服務 362
8.5 請求處理流程 367
8.6 權限控制體系 368
8.7 認證 369
8.7.1 RequestHeader認證 370
8.7.2 ClientCA認證 372
8.7.3 TokenAuth認證 373
8.7.4 ServiceAccountAuth認證 374
8.7.5 BootstrapToken認證 377
8.7.6 OIDC認證 379
8.7.7 WebhookTokenAuth認證 381
8.7.8 Anonymous認證 383
8.8 授權 383
8.8.1 AlwaysAllow授權 386
8.8.2 AlwaysDeny授權 387
8.8.3 ABAC授權 388
8.8.4 Webhook授權 389
8.8.5 RBAC授權 391
8.8.6 Node授權 396
8.9 準入控制器 397
8.9.1 內置插件介紹 398
8.9.2 內部實現(xiàn)原理 401
8.9.3 MutatingAdmissionWebhook準入控制器 404
8.9.4 ValidatingAdmissionWebhook準入控制器 411
8.10 信號處理機制 416
8.10.1 常駐進程實現(xiàn) 416
8.10.2 進程的優(yōu)雅關閉 417
8.10.3 向systemd報告進程狀態(tài) 419
8.11 List-Watch的實現(xiàn)原理 420
8.11.1 長連接通信協(xié)議 420
8.11.2 List-Watch的核心原理 425
第9章 kube-scheduler核心實現(xiàn) 430
9.1 初識kube-scheduler 430
9.1.1 kube-scheduler調度模型 430
9.1.2 kube-scheduler內部架構 431
9.1.3 kube-scheduler事件驅動 434
9.2 kube-scheduler啟動流程 437
9.2.1 Cobra命令行參數(shù)解析 438
9.2.2 實例化Scheduler對象 439
9.2.3 運行EventBroadcaster事件管理器 442
9.2.4 運行HTTPS Server 442
9.2.5 運行Informer同步資源 443
9.2.6 執(zhí)行Leader選舉 444
9.2.7 運行調度器 445
9.3 Scheduling Framework 445
9.3.1 誕生背景 445
9.3.2 核心架構 446
9.4 調度器運行流程 452
9.4.1 整體運行流程 452
9.4.2 Scheduling Cycle 454
9.4.3 Binding Cycle 462
9.5 優(yōu)先級與搶占機制 464
9.5.1 Pod優(yōu)先級 465
9.5.2 Pod驅逐搶占機制 466
9.6 內置調度插件介紹 473
第10章 kube-controller-manager核心實現(xiàn) 475
10.1 初識kube-controller-manager 475
10.2 架構設計詳解 477
10.2.1 控制器狀態(tài)模型 477
10.2.2 控制器執(zhí)行原理 478
10.3 啟動流程 479
10.3.1 Cobra命令行參數(shù)解析 480
10.3.2 運行EventBroadcaster事件處理器 481
10.3.3 運行HTTPS服務 481
10.3.4 執(zhí)行Leader選舉 482
10.3.5 啟動控制器主循環(huán) 482
10.4 ReplicaSet控制器 484
10.4.1 控制器初始化 485
10.4.2 主要執(zhí)行邏輯 485
10.4.3 慢啟動創(chuàng)建Pod 487
10.4.4 排序并刪除多余的Pod 487
10.4.5 Expectation機制 488
10.5 Deployment控制器 492
10.5.1 控制器初始化 492
10.5.2 主要執(zhí)行邏輯 492
10.5.3 調諧Pod的數(shù)量 495
10.5.4 更新策略 495
10.5.5 版本回滾 496
10.6 DaemonSet控制器 497
10.6.1 控制器初始化 498
10.6.2 主要執(zhí)行邏輯 498
10.6.3 調諧Pod的數(shù)量 500
10.6.4 更新策略 501
10.7 StatefulSet控制器 503
10.7.1 控制器初始化 503
10.7.2 主要執(zhí)行邏輯 503
10.7.3 調諧Pod的數(shù)量 504
10.7.4 更新策略 507
10.8 Job控制器 508
10.8.1 控制器初始化 508
10.8.2 主要執(zhí)行邏輯 508
10.8.3 調諧Pod的數(shù)量 511
10.9 CronJob控制器 512
10.9.1 控制器初始化 513
10.9.2 主要執(zhí)行邏輯 513
10.9.3 計算Job的啟動時間 515
10.9.4 Job并行策略 518
10.10 Endpoint控制器 519
10.10.1 控制器初始化 519
10.10.2 主要執(zhí)行邏輯 520
10.10.3 Subsets屬性的計算 523
10.11 EndpointSlice控制器 524
10.11.1 控制器初始化 524
10.11.2 主要執(zhí)行邏輯 525
10.11.3 EndpointSlice控制器的計算與填充 527
10.12 GarbageCollector控制器 531
10.12.1 控制器初始化 532
10.12.2 主要執(zhí)行邏輯 533
10.12.3 更新資源對象依賴關系圖 534
10.12.4 孤兒刪除 537
10.12.5 級聯(lián)刪除 537
10.13 NodeLifecycle控制器 539
10.13.1 控制器初始化 539
10.13.2 主要執(zhí)行邏輯 541
10.13.3 添加NoSchedule效果的Taint 543
10.13.4 Node健康狀態(tài)檢測 544
10.13.5 使用NoExecute Taint驅逐Node上的Pod 546
10.13.6 直接驅逐Node上的Pod 547
10.14 其他控制器 548
10.14.1 Namespace控制器 548
10.14.2 ServiceAccount控制器 550
10.14.3 PodGC控制器 550
10.14.4 SA Token控制器 551
10.14.5 ResourceQuota控制器 552
第11章 kube-proxy核心實現(xiàn) 553
11.1 初識kube-proxy 553
11.2 Service資源 553
11.3 架構設計詳解 554
11.4 kube-proxy初始化過程 555
11.4.1 生成iptables、ipvs、Kernel、IP Set接口 556
11.4.2 判斷是否支持ipvs代理模式 558
11.4.3 獲取宿主節(jié)點的Hostname 559
11.4.4 生成KubeClient和EventClient 559
11.4.5 獲取宿主節(jié)點的IP地址 560
11.4.6 確定代理模式 560
11.4.7 確定本地數(shù)據包判定方法 560
11.4.8 確定IP協(xié)議棧 561
11.4.9 生成Proxier結構體 562
11.5 iptables代理模式的執(zhí)行過程 562
11.5.1 統(tǒng)計Stale Service和Stale Endpoints 563
11.5.2 創(chuàng)建基礎iptables鏈和規(guī)則 564
11.5.3 初始化iptables內容緩沖區(qū) 566
11.5.4 配置KUBE-POSTROUTING鏈跳轉規(guī)則 567
11.5.5 配置KUBE-MARK-MASQ鏈跳轉規(guī)則 567
11.5.6 統(tǒng)計宿主節(jié)點IP地址 568
11.5.7 為每個Service Port配置iptables鏈和規(guī)則 568
11.5.8 配置KUBE-NODEPORTS鏈跳轉規(guī)則 576
11.5.9 配置KUBE-FORWARD鏈跳轉規(guī)則 577
11.5.10 將iptables緩沖區(qū)內容刷新到宿主機 577
11.5.11 清理殘留的UDP Conntrack記錄 577
11.6 ipvs代理模式的執(zhí)行過程 578
11.6.1 統(tǒng)計Stale Service和Stale Endpoints 579
11.6.2 初始化iptables內容緩沖區(qū) 580
11.6.3 創(chuàng)建基礎iptables鏈和規(guī)則 580
11.6.4 創(chuàng)建Dummy網卡 583
11.6.5 創(chuàng)建IP Set 583
11.6.6 統(tǒng)計宿主節(jié)點的IP地址 585
11.6.7 為每個Service Port配置規(guī)則 585
11.6.8 更新各個IP Set的內容 590
11.6.9 創(chuàng)建匹配IP Set的iptables規(guī)則 591
11.6.10 將iptables緩沖區(qū)內容刷新到宿主機 593
11.6.11 清理冗余的Service地址 594
11.6.12 清理殘留的UDP Conntrack記錄 595
第12章 kubelet核心實現(xiàn) 596
12.1 初識kubelet 596
12.2 kubelet架構設計 596
12.3 kubelet啟動流程 601
12.3.1 Cobra命令行參數(shù)解析 601
12.3.2 運行環(huán)境檢測與設置 603
12.3.3 Kubelet對象實例化 605
12.3.4 啟動kubelet主服務 606
12.3.5 啟動HTTP Server服務和gRPC Server服務 611
12.4 Pod生命周期管理 612
12.4.1 CRI 613
12.4.2 Pod啟動流程 616
12.4.3 Pod驅逐流程 629
12.5 cgroup資源隔離 637
12.6 垃圾回收原理 639
12.6.1 鏡像垃圾回收 639
12.6.2 容器垃圾回收 645
12.7 PLEG核心原理 652
12.7.1 PLEG產生原因 652
12.7.2 PLEG架構設計 652
12.7.3 PLEG原理剖析 653
12.8 HTTP服務接口 657
12.8.1 日志查詢接口 659
12.8.2 命令執(zhí)行接口 666
12.8.3 端口轉發(fā)接口 673
第13章 代碼生成器【通過讀者服務二維碼獲取】 679
附錄A Kubernetes組件配置參數(shù)介紹【通過讀者服務二維碼獲取】 680