8 分钟介绍 Kubernetes

2025-05-27

8 分钟介绍 Kubernetes

核心概念、特征和构建模块

这是我在读完“ Kubernetes:启动并运行”之后为自己写的一篇总结文章。我觉得这是一个很好的方法,可以强迫自己回顾所读内容,并总结出来,方便其他喜欢看“TL;DR”的人阅读。如果我有的话,我也会这么做。

K8s(“Kubernetes”)构建于 Google Borg之上,是一个功能强大的容器编排系统。K8s 及其整个生态系统(工具、模块、插件等)均采用 Golang 编写,这使其本质上是一个面向 API 的、运行速度极快的二进制文件的集合,这些文件拥有完善的文档,并且易于贡献代码或构建应用程序。

它有一些核心概念,任何开发/操作/感兴趣的读者都应该熟悉这些概念,以掌握系统、它的不同能力并理解为什么几乎每个人都在使用它。

在继续之前,我想先提一下 Kubernetes 的几大“朋友”(或者说“对手”):ECS、Nomad 和 Mesos。ECS 是 AWS 自己的编排解决方案,AWS 最近推出了 EKS——一个在 AWS 上托管的 Kubernetes 系统。两者都提供FARGATE 功能,让用户无需再担心物理资源的运行。

虽然 K8S 毫无疑问在采用数量上是最大的赢家,这得益于它是一个开源系统,而且三大云提供商也都提供托管版本;然而,它比其他方案更加复杂和繁琐。K8S 几乎可以处理任何类型的容器化工作负载,并且拥有许多独到之处,但这并不意味着每个人都应该使用它。其他解决方案也同样适合公司,例如,那些完全部署在 AWS 上的互联网产品公司,使用 ECS 而不是 K8S,甚至 EKS,更有可能享受其生产生命周期。

话虽如此,K8S 也有其魔力——它可以部署在任何地方,拥有一个由数百名核心开发人员组成的活跃社区,以及在其周围广泛的生态系统中成千上万的其他开源贡献者。它快速、创新、模块化且面向 API,使其成为一个构建附加组件或服务的超级友好系统。

事不宜迟,让我们开始吧;11 个步骤介绍 k8s:

1. 豆荚

Pod是 Kubernetes 中最小的可交互单元。一个 Pod 可以由多个容器组成,这些容器将组成一个单元,共同部署在单个节点上。每个 Pod 拥有一个 IP 地址,该 IP 地址由其容器共享。
在微服务领域,Pod 可以作为微服务的单个实例,执行一些后台工作或处理传入的请求。

2. 节点

节点是机器。它们是 Kubernetes 在其上部署 Pod 的“裸机”(也可以是虚拟机)。节点为 Kubernetes 提供可用的集群资源,用于保存数据、运行作业、维护工作负载以及创建网络路由。

3. 标签和注释

标签是 K8S 及其最终用户在系统中筛选类似资源的方式,它们也是某个资源需要“访问”或关联另一个资源的粘合剂。例如,一个服务需要为部署打开端口。无论是用于监控、日志记录、调试还是测试,任何 K8S 资源都应该被标记以便进一步检查。例如:app=worker,这是分配给系统中所有工作 Pod 的标签,稍后可以使用 kubectl 工具或 K8S API 中的 --selector 字段来选择这些 Pod。

注释与标签非常相似,但通常用于以自由式字符串的形式保存不同对象的元数据,例如“更改原因:升级应用程序版本的安全补丁”。

4. 服务发现

作为一个编排器,K8S 控制着不同工作负载的众多资源,它管理着 Pod、作业以及任何需要通信的物理资源的网络。为了管理这些网络,K8S 使用ETCD。ETCD
是 K8S 的“内部”数据库,主节点使用它来了解所有资源的位置。K8S 还为您的服务提供了实际的“服务发现”功能——它使用所有 Pod 都在使用的自定义 DNS 服务器,您可以解析其他服务的名称以获取其 IP 地址和端口。它在 K8S 集群中“开箱即用”,无需任何设置。

5. 副本集

虽然 Pod 是一个物理运行的任务,但通常情况下,仅使用一个 Pod 实例是不够的。为了实现冗余和负载处理,出于各种原因(例如“扩展”),必须复制 Pod。为了实现负责扩展和复制的层,K8S 使用ReplicaSet。该层以副本数量表示系统的期望状态,并保存系统在任何给定时刻的当前状态。

这也是配置自动扩展的地方,当系统加载时会创建额外的复制,当不再需要这些资源来支持正在运行的工作负载时,也会进行扩展。

6. DaemonSets

有时,某些应用程序只需要在每个节点上部署一个实例。一个很好的例子就是日志收集器,例如FileBeat。为了使代理能够从节点收集日志,它需要部署在所有节点上,但只需部署一个实例。为了创建这样的工作负载,Kubernetes 提供了DaemonSet来实现这一点。

7. StatefulSets

尽管大多数微服务领域都涉及不可变的无状态应用程序,但其中一些并非如此。有状态工作负载需要某种磁盘卷的可靠支持。虽然应用程序容器本身可以是不可变的,并且可以被更新的版本或更健康的实例替换,但它们需要即使有其他副本也能持久保存数据。为此,StatefulSet允许部署在其整个生命周期内需要使用同一节点的应用程序。它还保留其“名称”;hostname容器内部的名称和整个集群中服务发现的名称。一个包含 3 个 ZooKeeper 的 StatefulSet 可以命名为 zk-1、zk-2 和 zk-3,它还可以扩展以包含其他成员,如 zk-4、zk-5 等…StatefulSet 还管理 PersistentVolumeClaim(连接到 Pod 的磁盘)。

8. 乔布斯

K8s 核心团队已经考虑到了绝大多数需要使用编排系统的应用程序。虽然大多数应用程序需要持续正常运行以同时处理服务器请求(例如 Web 服务器),但有时我们需要生成一批作业并在完成后进行清理。您可以将其称之为一个微型无服务器环境。为了在 K8s 中实现这一点,我们可以使用作业资源。作业顾名思义,是一种工作负载,它会启动容器来完成特定工作,并在成功完成后销毁。一个很好的例子是一组工作线程,它们从待处理和存储的数据队列中读取作业。一旦队列为空,就不再需要这些工作线程,直到下一批作业准备好处理为止。

9. ConfigMap 和 Secrets

如果您还不熟悉十二要素应用清单,那么您应该了解一下。现代应用程序的关键概念之一是无需依赖环境,并且可以通过注入的环境变量进行配置。应用程序应该完全不受其位置影响。为了在 Kubernetes 中实现这一重要概念,我们提供了ConfigMap。这些本质上是键值环境变量的列表,它们会传递给正在运行的工作负载,以确定不同的运行时行为。在同一范围内,我们拥有Secret,它类似于普通的配置条目,但经过加密以防止密钥、密码、证书等敏感信息的泄露。

就我个人而言,在任何系统上使用机密信息的最佳选择是 Hashicorp 的 Vault。请务必阅读我去年写的一篇关于它的文章,其中解释了为什么应该将 Vault 作为生产环境的一部分,以及我的一位同事写的另一篇精彩且更具技术性的文章。

10.部署

当你的 Pod 运行良好时,即使使用了 ReplicaSet,在负载高的时候也能扩展,这一切都很棒。但我们聚集在这里,是为了快速将应用程序更新到新版本。我们希望以小块的方式构建、测试和发布,以享受更短的反馈循环。K8s 让我们能够使用Deployment持续部署新软件;Deployment 是一组描述特定正在运行的工作负载的新需求的元数据。一个很好的例子是新版本发布、错误修复,甚至是回滚(这是 K8s 的另一个内部选项)。

在 k8s 中部署软件主要有两种策略

  1. 替换——顾名思义,就是用新的需求替换掉你的整个工作负载,并自然而然地强制停机。这对于快速替换非生产资源非常有用。

  2. RollingUpdate 是 k8s 通过监听两个特定配置来缓慢地用新容器替换容器的方式:a. MaxAvailable 是部署新版本时应可用的工作负载百分比(或确切数字),100% 表示“我有 2 个容器,在整个部署过程中保持 2 个容器处于活动状态并处理请求”。b. MaxSurge 是设置在当前活动容器之上部署的工作负载百分比(或数量),100% 表示“我有 X 个容器,部署另外 X 个容器,然后开始推出旧容器”。

11. 存储

K8s 在存储之上添加了一层抽象。工作负载可以为不同的任务请求特定的存储,甚至可以管理超出特定 Pod 生命周期的持久性。为了简洁起见,我想推荐您参考我最近发布的一篇关于 K8s 存储的文章,其中特别解释了为什么它无法完全解决数据库部署等数据持久性需求。

概念理解

K8S 的设计和开发遵循一些指导方针(现在依然如此),每个功能、概念和理念都考虑到社区的性质而融入到系统中。此外,虽然没有强制要求,但最终用户会被引导以特定的方式使用系统;最佳实践是已知的,但作为一个开源且免费的系统,它不属于任何人,您可以随意使用它。

面向 API——系统中的每个部分都以可通过完善文档和操作的 API 进行交互的方式构建。核心开发人员确保您作为最终用户可以进行更改、查询和更新,这样您就不会被屏蔽在幕后或不必要的过滤器中。

欢迎使用包装器工具——作为上一点的衍生,Kubernetes 欢迎在其 API 之上构建工具和包装器。它以高度可定制的方式构建,是一个原始平台,可供其他人使用,并进一步开发针对不同用例的工具。其中一些工具已经非常知名且被广泛使用,例如SpinnakerIstio等。

声明式状态——鼓励用户使用声明式描述而非命令式描述来使用系统。这意味着,系统的状态和组件最好描述为在类似 Git 的版本控制系统中管理的代码,而不是导致某一特定点的手动更改的结果。这样,Kubernetes 更能抵御灾难恢复(DR),易于在团队之间共享和职责转移。

就是这样

为了将重点放在 Kubernetes 的介绍和主要概念上,我们列出了一些在接触这个伟大系统时需要了解的知识。
当然,Kubernetes 还有其他非常重要的领域,例如kubeletkube-proxyapi-server等物理系统构建块,以及终极控制工具kubectl。我将在下一篇文章中讨论这些以及其他一些很酷的功能。请持续关注并了解更多。

我叫 Omer,是ProdOps的一名工程师。ProdOps 是一家全球咨询公司,秉承 DevOps 文化,以可靠、安全、便捷的方式交付软件。请在下方评论区留言,或者直接在 Twitter 上联系我@ omergsr。如果您喜欢,请点赞,这有助于我专注于未来的写作。

文章来源:https://dev.to/prodopsio/an-8-minute-introduction-to-kubernetes-1oi
PREV
如何像专业人士一样构建你的 React 作品集项目 - 第一部分
NEXT
初学者的终极 DevOps 路线图:技能、工具和资源