扩展 Kubernetes

更改 Kubernetes 集群行为的不同方法。

Kubernetes 具有高度可配置性和可扩展性。因此,很少需要对 Kubernetes 项目代码进行分支或提交补丁。

本指南介绍了自定义 Kubernetes 集群的选项。它面向希望了解如何根据其工作环境需求调整 Kubernetes 集群的集群运维人员。希望成为平台开发人员或 Kubernetes 项目贡献者的开发人员也会发现它很有用,可以作为对现有扩展点和模式及其权衡和限制的介绍。

自定义方法可以大致分为配置扩展,前者只涉及更改命令行参数、本地配置文件或 API 资源;而后者涉及运行其他程序、其他网络服务或两者兼而有之。本文档主要介绍*扩展*。

配置

在线文档的参考部分记录了*配置文件*和*命令行参数*,每个二进制文件都有一个页面。

在托管 Kubernetes 服务或具有托管安装的版本中,命令行参数和配置文件可能并不总是可以更改的。如果可以更改,通常只有集群运维人员才能更改。此外,它们可能会在未来的 Kubernetes 版本中发生变化,并且设置它们可能需要重新启动进程。因此,只有在没有其他选择的情况下才应使用它们。

内置*策略 API*,例如ResourceQuotaNetworkPolicy和基于角色的访问控制(RBAC),是 Kubernetes 内置的 API,提供声明式配置的策略设置。API 通常即使在托管 Kubernetes 服务和托管 Kubernetes 安装中也可以使用。内置策略 API 遵循与其他 Kubernetes 资源(如 Pod)相同的约定。当你使用稳定的策略 API 时,你将像其他 Kubernetes API 一样受益于定义的支持策略。因此,建议在适用情况下使用策略 API,而不是*配置文件*和*命令行参数*。

扩展

扩展是与 Kubernetes 深度集成并对其进行扩展的软件组件。它们对其进行调整以支持新类型和新类型的硬件。

许多集群管理员使用 Kubernetes 的托管或发行版实例。这些集群预装了扩展。因此,大多数 Kubernetes 用户不需要安装扩展,甚至更少的用户需要编写新的扩展。

扩展模式

Kubernetes 旨在通过编写客户端程序实现自动化。任何读取和/或写入 Kubernetes API 的程序都可以提供有用的自动化。*自动化*可以在集群上或集群外运行。通过遵循本文档中的指导,你可以编写高可用性和健壮的自动化。自动化通常适用于任何 Kubernetes 集群,包括托管集群和托管安装。

有一种称为控制器模式的特定模式,用于编写与 Kubernetes 配合良好的客户端程序。控制器通常读取对象的 .spec,可能会执行一些操作,然后更新对象的 .status

控制器是 Kubernetes API 的客户端。当 Kubernetes 是客户端并调用远程服务时,Kubernetes 将其称为*Webhook*。远程服务称为*Webhook 后端*。与自定义控制器一样,Webhook 确实增加了一个故障点。

在 Webhook 模型中,Kubernetes 向远程服务发出网络请求。使用另一种*二进制插件*模型,Kubernetes 执行二进制文件(程序)。二进制插件由 kubelet(例如,CSI 存储插件CNI 网络插件)和 kubectl(请参阅使用插件扩展 kubectl)使用。

扩展点

此图显示了 Kubernetes 集群中的扩展点以及访问它的客户端。

Symbolic representation of seven numbered extension points for Kubernetes

Kubernetes 扩展点

图例

  1. 用户经常使用 kubectl 与 Kubernetes API 交互。插件可以自定义客户端的行为。有一些通用扩展可以应用于不同的客户端,以及扩展 kubectl 的特定方法。

  2. API 服务器处理所有请求。API 服务器中的几种类型的扩展点允许根据请求的内容对请求进行身份验证或阻止请求、编辑内容和处理删除。这些内容将在API 访问扩展部分中进行描述。

  3. API 服务器提供各种*资源*。*内置资源种类*(例如 pods)由 Kubernetes 项目定义,不能更改。阅读API 扩展以了解如何扩展 Kubernetes API。

  4. Kubernetes 调度器决定将 Pod 放置在哪些节点上。有几种扩展调度的方法,这些方法将在调度扩展部分中进行描述。

  5. Kubernetes 的许多行为都是由称为控制器的程序实现的,这些程序是 API 服务器的客户端。控制器通常与自定义资源一起使用。阅读将新 API 与自动化相结合更改内置资源以了解更多信息。

  6. kubelet 在服务器(节点)上运行,并帮助 Pod 在集群网络上显示为具有自己的 IP 的虚拟服务器。网络插件允许实现不同的 Pod 网络。

  7. 你可以使用设备插件来集成自定义硬件或其他特殊的节点本地设施,并使它们可供在集群中运行的 Pod 使用。kubelet 包括对使用设备插件的支持。

    kubelet 还为 Pod 及其容器挂载和卸载。你可以使用存储插件来添加对新类型存储和其他卷类型的支持。

扩展点选择流程图

如果你不确定从哪里开始,此流程图可以为你提供帮助。请注意,某些解决方案可能涉及多种类型的扩展。

Flowchart with questions about use cases and guidance for implementers. Green circles indicate yes; red circles indicate no.

选择扩展方法的流程图指南


客户端扩展

kubectl 的插件是独立的二进制文件,可以添加或替换特定子命令的行为。kubectl 工具还可以与凭据插件集成。这些扩展只影响单个用户的本地环境,因此不能强制执行站点范围的策略。

如果你想扩展 kubectl 工具,请阅读使用插件扩展 kubectl

API 扩展

自定义资源定义

如果你想定义新的控制器、应用程序配置对象或其他声明式 API,并使用 Kubernetes 工具(例如 kubectl)来管理它们,请考虑向 Kubernetes 添加*自定义资源*。

有关自定义资源的更多信息,请参阅自定义资源概念指南。

API 聚合层

您可以使用 Kubernetes 的 API 聚合层将 Kubernetes API 与其他服务集成,例如用于指标的服务。

将新 API 与自动化相结合

自定义资源 API 和控制循环的组合称为控制器模式。如果您的控制器代替人工操作员根据所需状态部署基础设施,则该控制器也可能遵循operator 模式。Operator 模式用于管理特定的应用程序;通常,这些应用程序维护状态并需要对其管理方式进行谨慎处理。

您还可以创建自己的自定义 API 和控制循环,以管理其他资源(例如存储)或定义策略(例如访问控制限制)。

更改内置资源

当您通过添加自定义资源来扩展 Kubernetes API 时,添加的资源始终属于新的 API 组。您不能替换或更改现有的 API 组。添加 API 不会直接影响现有 API(例如 Pod)的行为,而*API 访问扩展*可以。

API 访问扩展

当请求到达 Kubernetes API 服务器时,它首先被*身份验证*,然后被*授权*,然后进行各种类型的*准入控制*(实际上,某些请求未经身份验证,并得到特殊处理)。有关此流程的更多信息,请参阅控制对 Kubernetes API 的访问

Kubernetes 身份验证/授权流程中的每个步骤都提供了扩展点。

身份验证

身份验证将所有请求中的标头或证书映射到发出请求的客户端的用户名。

Kubernetes 有几种它支持的内置身份验证方法。它也可以位于身份验证代理之后,并且如果这些方法不能满足您的需求,它可以将来自Authorization:标头的令牌发送到远程服务以进行验证(身份验证 Webhook)。

授权

授权确定特定用户是否可以对 API 资源执行读取、写入和其他操作。它在整个资源级别上工作——它不会根据任意对象字段进行区分。

如果内置授权选项不能满足您的需求,则授权 Webhook允许调用自定义代码来做出授权决定。

动态准入控制

请求获得授权后,如果它是写操作,它还会经过准入控制步骤。除了内置步骤之外,还有几个扩展

  • 镜像策略 Webhook限制了可以在容器中运行哪些镜像。
  • 要做出任意的准入控制决定,可以使用通用的准入 Webhook。准入 Webhook 可以拒绝创建或更新。一些准入 Webhook 会在 Kubernetes 进一步处理传入请求数据之前对其进行修改。

基础设施扩展

设备插件

*设备插件*允许节点通过设备插件发现新的节点资源(除了 cpu 和内存等内置资源之外)。

存储插件

容器存储接口 (CSI) 插件提供了一种使用对新型卷的支持来扩展 Kubernetes 的方法。卷可以由持久的外部存储支持,也可以提供临时存储,或者它们可以使用文件系统范例提供对信息的只读接口。

Kubernetes 还包括对FlexVolume插件的支持,这些插件自 Kubernetes v1.23 起已弃用(支持 CSI)。

FlexVolume 插件允许用户挂载 Kubernetes 本身不支持的卷类型。当您运行依赖于 FlexVolume 存储的 Pod 时,kubelet 会调用二进制插件来挂载卷。存档的FlexVolume设计提案对此方法有更详细的说明。

面向存储供应商的 Kubernetes 卷插件常见问题解答包含有关存储插件的常规信息。

网络插件

您的 Kubernetes 集群需要一个*网络插件*才能拥有可用的 Pod 网络并支持 Kubernetes 网络模型的其他方面。

网络插件允许 Kubernetes 使用不同的网络拓扑和技术。

Kubelet 镜像凭据提供程序插件

功能状态: Kubernetes v1.26 [稳定]
Kubelet 镜像凭据提供程序是 kubelet 用于动态检索镜像仓库凭据的插件。然后,在从与配置匹配的容器镜像仓库中拉取镜像时使用这些凭据。

插件可以与外部服务通信或使用本地文件来获取凭据。这样,kubelet 不需要为每个仓库都具有静态凭据,并且可以支持各种身份验证方法和协议。

有关插件配置的详细信息,请参阅配置 kubelet 镜像凭据提供程序

调度扩展

调度程序是一种特殊类型的控制器,它监视 Pod 并将 Pod 分配给节点。默认调度程序可以完全替换,同时继续使用其他 Kubernetes 组件,或者多个调度程序可以同时运行。

这是一项艰巨的任务,几乎所有 Kubernetes 用户都发现他们不需要修改调度程序。

您可以控制哪些调度插件处于活动状态,或者将插件集与不同的命名调度程序配置文件相关联。您还可以编写自己的插件,该插件与 kube-scheduler 的一个或多个扩展点集成。

最后,内置的kube-scheduler组件支持一个Webhook,该 Webhook 允许远程 HTTP 后端(调度程序扩展)过滤和/或确定 kube-scheduler 为 Pod 选择的节点的优先级。

下一步

上次修改时间:2023 年 12 月 29 日下午 9:47 PST:修复过时的链接/锚点 (bcc55ae7c9)