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