为什么 Kubernetes 控制平面(masters)必须是 linux?
Why Kubernetes control planes (masters) must be linux?
我正在深入研究 kubernetes 架构,在所有 Kubernetes 集群中 on-premises/Cloud 主节点 a.k.a 控制平面需要 Linux 内核,但我找不到为什么?
除了我们不想在 Windows 上测试控制平面外,没有什么好的理由。从理论上讲,这只是 Go 守护进程,应该可以在 Windows 上正常编译,但如果出现任何问题,您将自己解决。
首先我想说的是,从技术角度来看, 可以将控制平面 运行 连接到 Windows。这是完全可行的,但是,没有人愿意将时间投入到比现有解决方案更糟糕的解决方案上,并且需要相当长的时间才能完成这项工作。既然有勺子,为什么还要用叉子喝汤?
现在有人可能怀疑我是不是在夸大其词。因此,我将尝试解释 Windows 在容器化方面遇到的一些问题。为此,我必须先解释 容器的工作原理:
如今,每当人们谈论容器时,他们都是在谈论 Linux 容器(除非另有说明,否则我也会在本回答中这样做)。容器本质上使用 Linux 内核功能,最重要的是(但不限于)Linux namespaces。有许多不同的名称空间(PID、网络等)可用于“隔离”。例如,可以创建一个新的 PID 命名空间,为其分配一个进程,该进程将只能将自己视为 运行ning 进程(因为它是“孤立的”)。听起来很熟悉?好吧,如果您曾经在容器中执行过 ps aux
,这就是将要发生的事情。
由于不可能涵盖容器在单个 post 中工作所必需的所有不同类型的 Linux 功能,我希望到现在为止,“普通”容器是本质上依赖于 Linux.
好吧,如果我说的是真的,容器如何在 Windows 上工作?
你猜怎么着……他们没有。 Windows 实际上在做的是在后台启动一个轻量级的 Linux 机器,然后托管容器。听起来很荒谬?好吧,是的。 Here是微软文档中的一段话:
However, Windows images can run only on Windows hosts and Linux images can run on Linux hosts and Windows hosts (using a Hyper-V Linux VM, so far), where host means a server or a VM.
那么 Windows 个容器 又如何(与 Linux 个容器相反)?
Windows 容器通过使用 Windows 内核的特性在 Windows 上本地执行 运行,类似于 Linux 容器。开发人员试图尽可能地模仿 Linux 容器的行为,但是,由于 Windows 内核的设计不佳,这根本不可能,因此不得不使用许多 hack。可以想象,这一决定带来了很多问题,实际上无法一一列举。仅举一个:Windows 容器比 Linux 容器大得多。 Window 容器实际达到千兆字节的大小是很常见的。 Even after making Windows Server Core images smaller by 40% back in 2019 内部图像仍然超过 1GB(未压缩甚至超过 2.5GB)。
考虑到所有这些开销,Linux 在容器化(以及许多其他方面)方面在各个方面都更胜一筹,而且从来不需要 Windows控制平面。
TL;DR
因为 Windows 在容器化(以及许多其他方面)方面是一个糟糕的操作系统。
响应非常明确,因为 Linux 自 2002 年以来就带有内核:
- 命名空间
- C组
有关此技术的更多详细信息,请访问:
namespace and cgroup
这两个在创建 Linux 容器之后使用,并在 Docker 使用之后创建容器。
并且由于 k8s 是一个容器编排系统,所以它将基于 Linux 系统,因为它本身包含(命名空间和 cgroup),而且 Linux 命令很丰富,因为它有很多用于管理文件、网络和其他内容的实用程序....
我希望我的回复能澄清为什么 k8s master 运行 在 Linux 上。
我正在深入研究 kubernetes 架构,在所有 Kubernetes 集群中 on-premises/Cloud 主节点 a.k.a 控制平面需要 Linux 内核,但我找不到为什么?
除了我们不想在 Windows 上测试控制平面外,没有什么好的理由。从理论上讲,这只是 Go 守护进程,应该可以在 Windows 上正常编译,但如果出现任何问题,您将自己解决。
首先我想说的是,从技术角度来看, 可以将控制平面 运行 连接到 Windows。这是完全可行的,但是,没有人愿意将时间投入到比现有解决方案更糟糕的解决方案上,并且需要相当长的时间才能完成这项工作。既然有勺子,为什么还要用叉子喝汤?
现在有人可能怀疑我是不是在夸大其词。因此,我将尝试解释 Windows 在容器化方面遇到的一些问题。为此,我必须先解释 容器的工作原理:
如今,每当人们谈论容器时,他们都是在谈论 Linux 容器(除非另有说明,否则我也会在本回答中这样做)。容器本质上使用 Linux 内核功能,最重要的是(但不限于)Linux namespaces。有许多不同的名称空间(PID、网络等)可用于“隔离”。例如,可以创建一个新的 PID 命名空间,为其分配一个进程,该进程将只能将自己视为 运行ning 进程(因为它是“孤立的”)。听起来很熟悉?好吧,如果您曾经在容器中执行过 ps aux
,这就是将要发生的事情。
由于不可能涵盖容器在单个 post 中工作所必需的所有不同类型的 Linux 功能,我希望到现在为止,“普通”容器是本质上依赖于 Linux.
好吧,如果我说的是真的,容器如何在 Windows 上工作?
你猜怎么着……他们没有。 Windows 实际上在做的是在后台启动一个轻量级的 Linux 机器,然后托管容器。听起来很荒谬?好吧,是的。 Here是微软文档中的一段话:
However, Windows images can run only on Windows hosts and Linux images can run on Linux hosts and Windows hosts (using a Hyper-V Linux VM, so far), where host means a server or a VM.
那么 Windows 个容器 又如何(与 Linux 个容器相反)?
Windows 容器通过使用 Windows 内核的特性在 Windows 上本地执行 运行,类似于 Linux 容器。开发人员试图尽可能地模仿 Linux 容器的行为,但是,由于 Windows 内核的设计不佳,这根本不可能,因此不得不使用许多 hack。可以想象,这一决定带来了很多问题,实际上无法一一列举。仅举一个:Windows 容器比 Linux 容器大得多。 Window 容器实际达到千兆字节的大小是很常见的。 Even after making Windows Server Core images smaller by 40% back in 2019 内部图像仍然超过 1GB(未压缩甚至超过 2.5GB)。
考虑到所有这些开销,Linux 在容器化(以及许多其他方面)方面在各个方面都更胜一筹,而且从来不需要 Windows控制平面。
TL;DR
因为 Windows 在容器化(以及许多其他方面)方面是一个糟糕的操作系统。
响应非常明确,因为 Linux 自 2002 年以来就带有内核:
- 命名空间
- C组
有关此技术的更多详细信息,请访问: namespace and cgroup
这两个在创建 Linux 容器之后使用,并在 Docker 使用之后创建容器。
并且由于 k8s 是一个容器编排系统,所以它将基于 Linux 系统,因为它本身包含(命名空间和 cgroup),而且 Linux 命令很丰富,因为它有很多用于管理文件、网络和其他内容的实用程序....
我希望我的回复能澄清为什么 k8s master 运行 在 Linux 上。