我经常被问及Kubernetes 是否复杂。在这篇文章中,我将逐一讨论这些论点并给出答案。当您需要和不需要 Kubernetes 时,我也会向您解释。
(资料图片仅供参考)
与虚拟机相比,使用容器的优势在了解 Kubernetes 本身的复杂性之前,我们需要了解一下 Docker 容器,因为它也增加了复杂性。这种复杂性值得吗?
几乎每个人都会同意,即使您决定不使用 Kubernetes,您仍然应该使用 Docker。在没有 Kubernetes 的情况下,将 Docker 容器部署到 AWS 或其他云提供商也不难。您只需要在虚拟机上设置一个运行 Docker 守护进程。
Docker 容器的主要优点是它们是独立的包。它们将应用程序的环境与其运行的机器分离。您不再需要关心主机上存在什么库或 Python 版本,因为 Dockerfile 使您的依赖关系明确。如果它可以在您自己的机器上运行,那么它也可以在任何相同CPU架构上的机器运行。Docker 不完全是基础设施即代码,但 Dockerfiles 确实允许您将应用程序运行时定义为 git 存储库中的一个简单文件。
Docker 容器的另一个好处是它们是分布式应用程序包,专为不可变基础架构的世界而设计。换句话说,它们被设计成无状态的。容器本质上是短暂的。如果他们死了并重新启动也没关系。
什么时候不需要使用 kubernetes当满足以下四个条件时,您不需要 Kubernetes:
将极少数容器部署到极少数机器(主机),换句话说你的用户数量有限。容器和机器的数量是静态的,不会经常出现扩容或者缩容。您的容器和机器不会经常出现故障。您不需要持久存储、负载均衡、配置管理、服务发现、自动修复、自动缩放等其他功能。或者您确实需要这些功能,但您的要求非常有限并且不介意供应商锁定。换句话说,如果您有简单的要求,那么有一个更简单的 Kubernetes 替代方案。您可以将容器直接部署到运行在几个虚拟机上的 Docker 守护进程。
复杂的需求就需要复杂的解决方案当您拥有的业务正在快速成长,用户量激增,那么您可能确实需要 Kubernetes:
您的应用需要处理可变的用户负载量您需要使用计算之外的其他云服务 - 例如,持久存储、负载均衡器、配置管理等。节点过多,经常出错,您的应用需要自动恢复能力您希望以一致的方式管理多个应用程序和系统您有上百个团队在相同的环境中工作或使用彼此的微服务其它复杂场景对于上述要求,您需要引入容器基础设施,这意味着为大规模、动态地部署 Docker 容器并将它们相互连接以及与其他云服务(如存储)进行优化的基础设施。
该基础设施最流行的形式是 Kubernetes。如果这些是您的要求,为什么不运行 Kubernetes?当然它很复杂,但是满足这些要求的每个解决方案都将具有相似的复杂性。
至少对于 Kubernetes,复杂性是开源的,并且以声明式 Kubernetes API 的形式标准化。这优于其他公共云或内部解决方案。
没有 Kubernetes 和 Docker 的企业基础架构这是仇恨者的典型主张:
Kubernetes 和 Docker 是不必要的,因为自动缩放很容易,systemd 可以自我修复,云提供商有用于持久卷的 API,备份应该用主机上的 cronjobs 完成,秘密用 MyFavoriteSecretVault 完成,Consul 做配置管理,服务发现是 DNS ,健康检查不是必需的,Reddit 上的一个家伙在他的上一家公司写了一个 3000 行的 Perl 脚本用于滚动更新,因此显然 Kubernetes 是不必要的。
对于这些人,我只能说祝你好运。此外,您重新发明了 Kubernetes。
让初学者更容易使用 KubernetesKubernetes 的最大缺点是它预先加载了很多复杂性,但是复杂性是合理的,这就导致又很多东西需要预先学习。