扩展 Kubernetes

改变 Kubernetes 集群行为的不同方式。

Kubernetes 具有高度可配置性和可扩展性。因此,很少需要派生或向 Kubernetes 项目代码提交补丁。

本指南描述了自定义 Kubernetes 集群的选项。它面向希望了解如何使 Kubernetes 集群适应其工作环境需求的集群操作员。对于未来成为平台开发者或 Kubernetes 项目贡献者的开发者来说,它也很有用,可作为对现有扩展点、模式及其权衡和限制的介绍。

定制方法大致可分为仅涉及更改命令行参数、本地配置文件或 API 资源的配置;以及涉及运行额外程序、额外网络服务或两者兼有的扩展。本文档主要关注**扩展**。

配置

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

在托管的 Kubernetes 服务或具有托管安装的发行版中,命令参数和配置文件可能并非总是可更改的。当它们可更改时,通常只有集群操作员才能更改。此外,它们在未来的 Kubernetes 版本中可能会发生变化,并且设置它们可能需要重新启动进程。由于这些原因,它们应仅在没有其他选择时使用。

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

扩展

扩展是软件组件,它们扩展并深度集成到 Kubernetes 中。它们通过适应来支持新类型和新硬件类型。

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

扩展模式

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

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

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

在 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 还会为 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 和控制循环的组合被称为控制器模式。如果您的控制器替代了根据所需状态部署基础设施的人工操作员,那么该控制器可能也遵循操作器模式。操作器模式用于管理特定的应用程序;通常,这些应用程序维护状态并需要谨慎管理。

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

更改内置资源

当您通过添加自定义资源来扩展 Kubernetes API 时,添加的资源始终属于新的 API 组。您不能替换或更改现有 API 组。添加 API 不会直接让您影响现有 API(例如 Pods)的行为,而**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 [stable]
Kubelet 镜像凭据提供商是 kubelet 的插件,用于动态检索镜像注册表凭据。这些凭据随后用于从符合配置的容器镜像注册表拉取镜像时。

插件可以与外部服务通信或使用本地文件获取凭据。这样,kubelet 无需为每个注册表都拥有静态凭据,并且可以支持各种认证方法和协议。

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

调度扩展

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

这是一个重大的工作,几乎所有 Kubernetes 用户都发现他们不需要修改调度器。

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

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

下一步

上次修改于 2023 年 12 月 29 日 太平洋标准时间晚上 9:47:修复过时链接/锚点 (bcc55ae7c9)