第 4 章 使用 Kubernetes 对象 使用 Kubernetes 对象
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
我不明白为什么人们害怕新思想。我害怕的是旧观念。
约翰-凯奇
在第 2 章中,你构建并向 Kubernetes 部署了一个应用程序。在本章中,你将了解该过程中涉及的 Kubernetes 基本对象:Pod、部署和服务。你还将了解如何使用基本的 Helm 工具来管理 Kubernetes 中的应用程序。
在完成"运行演示应用程序 "中的示例后,你应该已经在 Kubernetes 集群中运行了一个容器镜像,但它究竟是如何运行的呢?在引擎盖下,kubectl run 命令会创建一个名为 "部署"(Deployment)的 Kubernetes 资源。那这是什么?部署又是如何实际运行你的容器镜像的呢?
部署
回想一下您是如何使用 Docker 运行演示应用程序的。docker container run 命令启动了容器,它一直运行到你用docker stop 杀死它为止。
但假设容器因其他原因退出:可能是程序崩溃,可能是系统出错,可能是机器磁盘空间耗尽,也可能是宇宙射线在错误的时刻击中了 CPU(可能性不大,但确实发生过)。假设这是一个生产应用程序,这就意味着你现在有了不开心的用户,直到有人可以在终端上输入docker container run 重新启动容器。
这种安排并不令人满意。你真正需要的是一种监督程序,它能持续检查容器是否在运行,如果容器停止,就会立即重新启动。在传统服务器上,你可以使用systemd 、runit 或supervisord 这样的工具来做到这一点;Docker 也有类似的功能,而且你知道 Kubernetes 也有监督程序功能也不会感到惊讶:部署。
监督和调度
对于 Kubernetes 需要监管的每个程序,它都会创建一个相应的部署对象,该对象会记录有关程序的一些信息:容器镜像的名称、想要运行的副本数量,以及启动容器所需的其他信息。
与部署资源一起工作的是一种名为控制器的 Kubernetes 组件。控制器基本上是在循环中持续运行的代码片段,它负责监视资源,确保资源存在并正常运行。如果某个部署由于某种原因没有运行足够的副本,控制器就会创建一些新的副本。(如果由于某种原因副本数量过多,控制器就会关闭多余的副本。无论如何,控制器都会确保实际状态与所需状态一致)。
实际上,部署并不直接管理副本:相反,它会自动创建一个名为 ReplicaSet 的关联对象来处理副本。稍后我们将在"ReplicaSets"(副本集)一文中详细介绍副本集,但由于我们通常只与部署进行交互,所以我们先来熟悉一下副本集。
重启容器
乍一看,部署的行为方式可能有点出人意料。如果容器完成工作并退出,部署就会重新启动它。如果它崩溃了,或者你用信号杀死了它,或者用kubectl 终止了它,部署就会重新启动它。(这是你在概念上应该考虑的问题;实际情况要复杂一些,我们会看到)。
大多数 Kubernetes 应用程序都被设计成长期运行且可靠的,因此这种行为是合理的:容器会因各种原因退出,在大多数情况下,人工操作员要做的就是重启它们,所以 Kubernetes 默认就是这么做的。
可以针对单个容器更改此策略:例如,永远不重启,或仅在失败时重启,而不是在正常退出时重启(请参阅"重启策略")。不过,默认行为(始终重新启动)通常是您想要的。
部署的工作就是监视其关联的容器,并确保指定数量的容器始终在运行。如果数量较少,它会启动更多。如果数量过多,它会终止其中一些。这比传统的监控程序要强大和灵活得多。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access