13

考虑到其他编排工具,如dokku、dcos、deis、flynn、docker swarm 等。就代码行数而言,Kubernetes 与它们相差甚远,平均而言,这些工具大约有 100k-200k 行代码。

直觉上,管理容器(即检查运行状况、上下扩展容器、杀死它们、重新启动它们等)并不一定包含240 万多行代码(这是整个操作系统的规模),这感觉很奇怪代码库),我觉得还有更多的东西。

与其他使其如此庞大的编排解决方案相比,Kubernetes 有什么不同?

我对维护超过 5-6 台服务器一无所知。请解释它为什么这么大,什么功能在其中起重要作用

4

2 回答 2

14

首先也是最重要的:不要被代码的行数误导,其中大部分是vendor文件夹中的依赖项,不考虑核心逻辑(实用程序、客户端库、gRPC、etcd等)。

使用 cloc 进行原始 LoC 分析

换个角度看,对于Kubernetes

$ cloc kubernetes --exclude-dir=vendor,_vendor,build,examples,docs,Godeps,translations
    7072 text files.
    6728 unique files.                                          
    1710 files ignored.

github.com/AlDanial/cloc v 1.70  T=38.72 s (138.7 files/s, 39904.3 lines/s)
--------------------------------------------------------------------------------
Language                      files          blank        comment           code
--------------------------------------------------------------------------------
Go                             4485         115492         139041        1043546
JSON                             94              5              0         118729
HTML                              7            509              1          29358
Bourne Shell                    322           5887          10884          27492
YAML                            244            374            508          10434
JavaScript                       17           1550           2271           9910
Markdown                         75           1468              0           5111
Protocol Buffers                 43           2715           8933           4346
CSS                               3              0              5           1402
make                             45            346            868            976
Python                           11            202            305            958
Bourne Again Shell               13            127            213            655
sed                               6              5             41            152
XML                               3              0              0             88
Groovy                            1              2              0             16
--------------------------------------------------------------------------------
SUM:                           5369         128682         163070        1253173
--------------------------------------------------------------------------------

对于Docker(而不是 Swarm 或 Swarm 模式,因为它包含更多功能,例如卷、网络和这些存储库中不包含的插件)。我们不包括MachineComposelibnetwork等项目,因此实际上整个 docker 平台可能包含更多的 LoC:

$ cloc docker --exclude-dir=vendor,_vendor,build,docs
    2165 text files.
    2144 unique files.                                          
     255 files ignored.

github.com/AlDanial/cloc v 1.70  T=8.96 s (213.8 files/s, 30254.0 lines/s)
-----------------------------------------------------------------------------------
Language                         files          blank        comment           code
-----------------------------------------------------------------------------------
Go                                1618          33538          21691         178383
Markdown                           148           3167              0          11265
YAML                                 6            216            117           7851
Bourne Again Shell                  66            838            611           5702
Bourne Shell                        46            768            612           3795
JSON                                10             24              0           1347
PowerShell                           2             87            120            292
make                                 4             60             22            183
C                                    8             27             12            179
Windows Resource File                3             10              3             32
Windows Message File                 1              7              0             32
vim script                           2              9              5             18
Assembly                             1              0              0              7
-----------------------------------------------------------------------------------
SUM:                              1915          38751          23193         209086
-----------------------------------------------------------------------------------

请注意,这些是非常原始的估计,使用cloc。这可能值得更深入的分析。

粗略地说,该项目似乎占问题中提到的 LoC(~1250K LoC)的一半(您是否重视依赖关系,这是主观的)。

Kubernetes 中包含什么使其如此庞大?

大多数膨胀来自支持各种云提供商的库,以简化其平台上的引导或通过插件支持特定功能(卷等)。它还有很多示例可以从行数中剔除。一个公平的 LoC 估计需要排除许多不必要的文档和示例目录。

与Docker SwarmNomadDokku相比,它的功能也更加丰富,仅举几例。它支持高级网络场景,内置负载均衡,包括PetSets集群联合、卷插件或其他项目尚不支持的其他功能。

它支持多个容器引擎,因此它不仅可以运行 docker 容器,还可以运行其他引擎(例如rkt)。

许多核心逻辑涉及与其他组件的交互:键值存储、客户端库、插件等,远远超出了简单的场景。

分布式系统是出了名的难Kubernetes似乎支持容器行业主要参与者的大多数工具而不妥协(其他解决方案正在做出这样的妥协)。结果,该项目可能看起来人为地臃肿并且对于其核心任务(大规模部署容器)来说太大了。实际上,这些统计数据并不令人惊讶。

关键思想

KubernetesDockerDokku进行比较并不合适。该项目的范围要大得多,并且包含更多功能,因为它不仅限于 Docker 工具系列。

虽然 Docker 的许多特性分散在多个库中,但 Kubernetes 倾向于将所有内容都放在其核心存储库中(这大大增加了行数,但也解释了该项目的受欢迎程度)。

考虑到这一点,LoC 统计数据并不令人惊讶。

于 2017-01-11T10:52:26.163 回答
8

除了@abronan 给出的原因之外,Kubernetes 代码库包含大量重复和生成的文件,这会人为地增加代码大小。执行“实际工作”的代码的实际大小要小得多。

例如,看一下暂存目录。这个目录是 500,000 LOC 但里面没有原始代码;它都是从 Kubernetes 存储库中的其他地方复制并重新排列的。这人为地夸大了总 LOC。

还有诸如 Swagger API 生成之类的东西,它们是自动生成的文件,以OpenAPI格式描述 Kubernetes API。以下是我找到这些文件的一些地方:

这些文件总共占了 ~116,000 LOC,它们所做的只是以 OpenAPI 格式描述 Kubernetes API!

这些只是 OpenAPI 定义文件——支持 OpenAPI 所需的 LOC 总数可能要高得多。例如,我发现了一个 ~ 12,000 LOC 文件和一个~13,000 LOC 文件,它们与支持 Swagger/OpenAPI 相关。我敢肯定还有更多与此功能相关的文件。

关键是,在幕后进行实际繁重工作的代码可能只是使 Kubernetes 成为可维护和可扩展项目所需的支持代码的一小部分。

于 2017-01-11T18:17:22.033 回答