向我的 Uber 司机解释 Kubernetes
开始对话
结论
一周前,我参加了在芝加哥举办的 Kubecon 2023。我读了一些博客,也参加了一些 101 个会场教程,但对这项技术仍然没有很好的理解。最糟糕的是会议的最后一天——我叫了一辆 Uber 送我回酒店。司机问我:“这次大会是关于什么的?”我回答说:“是关于 Kubernetes 的”,但解释了几遍之后,我显然完全不知道自己在说什么。
想象一下,参加完三天的会议,却无法向 Uber 司机描述这项技术,真是令人尴尬。所以,为了弥补过失,我重新整理了与 Uber 司机的对话。
开始对话
我:想象一下,你是一家繁忙餐厅厨房的厨师。你手下有一群厨师,每个人都负责准备菜肴的不同部分——一组负责开胃菜,一组负责主菜,另一组负责甜点。你的工作就是协调这些厨师,确保菜肴准时送到顾客手中。你脑子里有这样的画面吗?
司机:知道了。
我:在这种情况下,主厨就是 Kubernetes。就像主厨需要管理厨房里的所有厨师一样,Kubernetes 也帮助管理运行软件所需的所有不同组件。Kubernetes 的官方定义是“容器编排工具”,但由于“容器”一词在这里比较抽象,你可以用“容器”代替“厨师”。所以 Kubernetes 可以理解为“厨师编排工具”。这样,每次听到这个词,你脑海中就能浮现出厨房的画面。
司机:好的,目前为止说得通。但是这些容器是什么?我总不能一直把它们想象成厨师吧。
我:是啊,说得对。现在你已经在脑子里对 Kubernetes 厨房有了大致的了解,接下来让我们从小到大,深入探讨一下不同厨房角色如何映射到 Kubernetes 概念上。
容器
这个难题中最小的部分是容器,它基本上是任何软件的一部分。例如,它可以是一个托管 Web 应用程序的 Node.js Web 服务器,或者一个用于存储数据的 MongoDB 数据库容器(这句话更适合阅读这篇博客的工程师,我不会对我的 Uber 司机这么说😛)。在厨房里,想象一下你正在提供汤和沙拉作为开胃菜。汤就是你的容器。沙拉也是它自己的容器。
我知道这个定义现在看起来有点武断,但是一旦我在即将到来的组件的背景下解释它,它就会更有意义。
Pod
在厨房里,Pod 指的是盛放汤和沙拉的盘子/托盘。在 Kubernetes 中,Pod 指的是可以容纳一个或多个容器的容器。这样做的原因是 Pod 中的容器可以相互通信。
对于工程师来说:举个例子,假设我的 pod 中有一个 Web 服务器容器和一个数据库容器。它们可以通过 localhost 相互通信。
至于用厨房来打个恰当的比方,我实在想不出什么。想象一下《香肠派对》里的滑稽场景:拟人化的汤和沙拉开始互相聊天。但开胃菜盘里的汤和沙拉无法与晚餐盘里的牛排和土豆对话,因为它们在不同的盘子里(也就是说,不同的pod不共享相同的网络命名空间,因此无法相互通信)。
主节点
管理和监督整个厨房的主厨。这就是我们之前讨论过的“容器编排”或“厨师编排”的概念。以下是一些实际生活中主节点编排工作的示例:扩展,也就是根据 CPU 利用率调整正在运行的 Pod 数量。在繁忙的厨房里,当顾客需求激增时,厨师可能需要通过准备更多份菜肴来扩大运营规模。顺便说一句,在这个可视化图中需要注意一点——你可能想象的是厨房正在招聘新厨师,但我希望你想象的更像是现有厨师被克隆的过程。当扩展发生时,Pod 本质上就是被复制。
自动部署,也就是在 YAML 文件中定义应用程序的依赖项和运行时指令,以便应用程序能够基于此配置进行部署。在厨房中,这个 YAML 文件类似于一份书面菜谱,它告诉厨师如何制作这道菜,以确保一致性和效率。
负载均衡,也就是在不同的pod之间分配网络流量。在厨房里,负载均衡指的是将任务分配给烹饪台的不同厨师。比如,甜点台的Bob接到了太多冰淇淋订单,于是主厨克隆了Bob,让Bob 2.0从Bob 1.0手中接过一些冰淇淋订单。
同样需要注意的是:每个工作节点都有一个叫做“kubelet”的东西。在厨房的场景中,“kubelet”类似于每张餐桌旁的厨师。厨师有很多工作要做,比如确保食物托盘正确摆放、帮助准备食材以及丢弃残羹剩饭。同样,“kubelet”的作用包括确保 Pod 中的容器正常运行、协助初始化 Pod(例如安装必要的依赖项)、协助垃圾收集等等。
为工程师提供一些额外的背景信息:Kubelet 是一个开源的、可执行的二进制文件(即带有 CPU 可以直接执行的机器代码指令的文件),用 Go 编程语言编写。
我们就此打住。如果你理解了我到目前为止所说的一切,那么你就理解了 Kubernetes 架构的基础知识!如果你不想永远依赖厨房的形象化描述,我已经在下图中将所有厨房图纸替换成了 Kubernetes 术语。
Driver:其实,这些都很有道理。我知道 Kubernetes 是什么。但我仍然不明白它为什么有用。比如,拥有它或学习它有什么意义?
我:是的,难题的最后一部分是理解如何使用 Kubernetes。人类如何与 Kubernetes 互动?Kubernetes 在科技世界中有何关联/用途?让我们先回顾一下厨房的比喻,解释一下其他一些概念。
-
餐厅/特许经营店的所有者类似于正在构建应用程序或服务的软件开发人员。在麦当劳,特许经营店所有者(假设他们的名字是 Francis Cockadoodledoo)希望了解每个麦当劳门店的盈利情况,并能够根据需要解雇/雇用员工。为此,Francis Cockadoodledoo 可能会拿起电话致电大厨以获取信息并下达订单。在 Kubernetes 中,软件工程师实际上无法拿起电话与他们的 Kubernetes 集群交互,但“主节点”有一个可以调用的 API 服务器,这使您可以访问所有任务。例如,工程师可以获取有关所有 pod、节点、服务的信息,了解健康和指标信息,并能够删除或创建资源。
-
在餐厅用餐的顾客类似于应用程序或服务的用户。就像麦当劳厨房为我制作巨无霸一样,Spotify Kubernetes 集群也为我提供了通过 Web 浏览器收听海量音乐的服务。
我已将这些新信息纳入下面的绘图中。您看到的内容实际上与您在 Google 搜索“Kubernetes 架构”时看到的图表非常相似。
当然,我意识到我的解释中遗漏了一些抽象概念,因为我觉得它们对于构建 Kubernetes 的基本思维模型并不重要。欢迎大家进一步深入探讨。随着我自己深入研究,我可能会在这篇博客中添加一些我认为有用的资源链接。
结论
我之所以选择这种讲故事的模式(通过与 Uber 司机对话的视角来描述技术),是因为我想将 Kubernetes 分解成一种普遍可以理解且感觉平易近人的东西。
感谢阅读!如果你有任何关于改进我的写作(或者我糟糕的画作)的建设性反馈,请在评论区留言。
欣赏这张我和我的同事在#Kubecon 2023 的照片。顺便说一句,我们在那里推广我开发的产品。
如果你感兴趣,不妨试试。它以现代方式诠释了过时的终端(命令行)体验,能够帮助你成为更优秀的开发者。访问https://www.warp.dev/了解更多信息。
文章来源:https://dev.to/therubberduckiee/explaining-kubernetes-to-my-uber-driver-4f60