扩展 Kubernetes

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

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

本指南介绍了定制 Kubernetes 集群的选项。它的目标读者是希望了解如何根据其工作环境的需求调整 Kubernetes 集群的集群运维人员。对于那些有意成为平台开发者或 Kubernetes 项目贡献者的开发者来说,本指南作为扩展点和模式的介绍也很有用,其中涵盖了它们的权衡和局限性。

定制方法大致可以分为配置,它只涉及修改命令行参数、本地配置文件或 API 资源;以及扩展,它涉及运行附加程序、附加网络服务或两者。本文主要介绍扩展

配置

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

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

内置的策略 API,例如ResourceQuotaNetworkPolicy 和基于角色的访问控制(RBAC),是提供声明式配置策略设置的内置 Kubernetes API。即使在托管的 Kubernetes 服务和托管的 Kubernetes 安装中,这些 API 通常也是可用的。内置的策略 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 Groups。你不能替换或更改现有的 API Group。添加 API 并不能直接影响现有 API(例如 Pod)的行为,而API 访问扩展可以做到这一点。

API 访问扩展

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

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

身份认证

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

Kubernetes 支持多种内置的身份认证方法。它也可以位于身份认证代理之后,并且如果这些方法不满足你的需求,它可以将 Authorization: 头部中的令牌发送到远程服务进行验证(一个身份认证 webhook)。

授权

授权决定特定用户是否可以在 API 资源上执行读取、写入和其他操作。它在整个资源层面工作——不基于任意对象字段进行区分。

如果内置的授权选项不满足你的需求,一个授权 webhook 允许调用自定义代码来做出授权决定。

动态准入控制

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

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

基础设施扩展

设备插件

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

存储插件

容器存储接口(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 选择的节点。

下一步

上次修改时间 December 29, 2023 at 9:47 PM PST:修复过时的链接/锚点 (bcc55ae7c9)