扩展 Kubernetes
Kubernetes 具有高度可配置性和可扩展性。因此,很少需要派生或向 Kubernetes 项目代码提交补丁。
本指南描述了自定义 Kubernetes 集群的选项。它面向希望了解如何使 Kubernetes 集群适应其工作环境需求的集群操作员。对于未来成为平台开发者或 Kubernetes 项目贡献者的开发者来说,它也很有用,可作为对现有扩展点、模式及其权衡和限制的介绍。
定制方法大致可分为仅涉及更改命令行参数、本地配置文件或 API 资源的配置;以及涉及运行额外程序、额外网络服务或两者兼有的扩展。本文档主要关注**扩展**。
配置
**配置文件**和**命令参数**在在线文档的参考部分中进行了文档说明,每个二进制文件都有一个页面。
在托管的 Kubernetes 服务或具有托管安装的发行版中,命令参数和配置文件可能并非总是可更改的。当它们可更改时,通常只有集群操作员才能更改。此外,它们在未来的 Kubernetes 版本中可能会发生变化,并且设置它们可能需要重新启动进程。由于这些原因,它们应仅在没有其他选择时使用。
内置的**策略 API**,例如ResourceQuota、NetworkPolicy 和基于角色的访问控制(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 确实增加了故障点。
注意
在 Kubernetes 之外,“webhook”通常指异步通知机制,其中 webhook 调用作为对其他系统或组件的单向通知。在 Kubernetes 生态系统中,即使同步 HTTP 调用也经常被称为“webhooks”。在 Webhook 模型中,Kubernetes 向远程服务发出网络请求。而在另一种**二进制插件**模型中,Kubernetes 执行一个二进制文件(程序)。二进制插件由 kubelet(例如,CSI 存储插件和CNI 网络插件)和 kubectl(参阅使用插件扩展 kubectl)使用。
扩展点
此图显示了 Kubernetes 集群中的扩展点以及访问它的客户端。

Kubernetes 扩展点
图例
用户通常使用`kubectl`与 Kubernetes API 进行交互。插件自定义客户端的行为。有适用于不同客户端的通用扩展,以及扩展`kubectl`的特定方式。
API 服务器处理所有请求。API 服务器中的几种类型的扩展点允许认证请求,或根据其内容阻止请求,编辑内容和处理删除。这些在API 访问扩展部分中描述。
API 服务器提供各种**资源**。**内置资源类型**,如`pods`,由 Kubernetes 项目定义,不可更改。阅读API 扩展以了解如何扩展 Kubernetes API。
Kubernetes 的大部分行为都是由被称为控制器的程序实现的,这些程序是 API 服务器的客户端。控制器通常与自定义资源结合使用。阅读将新 API 与自动化结合和更改内置资源以了解更多信息。
kubelet 运行在服务器(节点)上,并帮助 Pod 像具有自己的 IP 的虚拟服务器一样出现在集群网络上。网络插件允许不同的 Pod 网络实现。
您可以使用设备插件来集成定制硬件或其他特殊的节点本地设施,并使这些设施可用于在集群中运行的 Pod。
扩展点选择流程图
如果你不确定从哪里开始,这个流程图可以帮助你。请注意,有些解决方案可能涉及多种类型的扩展。
选择扩展方法的流程图指南
客户端扩展
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 镜像凭据提供程序。
调度扩展
调度器是一种特殊类型的控制器,它监视 Pod 并将 Pod 分配给节点。默认调度器可以完全替换,同时继续使用其他 Kubernetes 组件,或者可以同时运行多个调度器。
这是一个重大的工作,几乎所有 Kubernetes 用户都发现他们不需要修改调度器。
您可以控制哪些调度插件处于活动状态,或者将插件集与不同的命名调度器配置文件关联起来。您还可以编写自己的插件,使其与 kube-scheduler 的一个或多个扩展点集成。
最后,内置的`kube-scheduler`组件支持一个webhook,它允许远程 HTTP 后端(调度器扩展)过滤和/或优先排序 kube-scheduler 为 Pod 选择的节点。
注意
您只能通过调度器扩展 Webhook 影响节点过滤和节点优先级;其他扩展点无法通过 Webhook 集成使用。下一步
- 了解有关基础设施扩展的更多信息
- 了解kubectl 插件
- 了解更多关于自定义资源的信息
- 了解更多关于扩展 API 服务器的信息
- 了解动态准入控制
- 了解Operator 模式