扩展 Kubernetes

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

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

本指南介绍了自定义 Kubernetes 集群的选项。它面向想要了解如何根据其工作环境需求调整 Kubernetes 集群的集群操作员。作为潜在的平台开发者或 Kubernetes 项目贡献者的开发者也会发现它有助于了解存在哪些扩展点和模式及其权衡和限制。

自定义方法可以大致分为配置(仅涉及更改命令行参数、本地配置文件或 API 资源)和扩展(涉及运行其他程序、其他网络服务或两者)。本文档主要介绍扩展

配置

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

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

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

扩展

扩展是扩展并与 Kubernetes 深度集成的软件组件。它们使 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:修复过时的链接/锚点 (bcc55ae7c9)