扩展 Kubernetes
Kubernetes 具有高度的可配置性和可扩展性。因此,很少需要对 Kubernetes 项目代码进行 fork 或提交补丁。
本指南介绍了自定义 Kubernetes 集群的选项。它面向希望了解如何根据其工作环境需求调整 Kubernetes 集群的 集群运营商。希望成为 平台开发人员 或 Kubernetes 项目 贡献者 的开发人员也会发现它有用,因为它介绍了现有的扩展点和模式,以及它们的权衡和限制。
自定义方法可以大体上分为 配置,它只涉及更改命令行参数、本地配置文件或 API 资源;以及 扩展,它涉及运行额外的程序、额外的网络服务或两者兼而有之。本文档主要介绍的是扩展。
配置
配置文件和命令行参数在在线文档的 参考 部分中进行了介绍,每个二进制文件都有一个页面
在托管 Kubernetes 服务或具有管理安装的发布版中,命令行参数和配置文件可能并非始终可更改。如果它们可以更改,则通常只能由集群运营商更改。此外,它们可能会在未来的 Kubernetes 版本中发生更改,设置它们可能需要重新启动进程。出于这些原因,它们应该仅在没有其他选择时使用。
内置策略 API,如 ResourceQuota、NetworkPolicy 和基于角色的访问控制 (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 会增加一个故障点。
注意
在 Kubernetes 之外,“Webhook”一词通常指的是用于异步通知的机制,其中 Webhook 调用充当向另一个系统或组件发出的单向通知。在 Kubernetes 生态系统中,即使同步 HTTP 调用也经常被描述为“Webhook”。在 Webhook 模型中,Kubernetes 向远程服务发出网络请求。在备选的二进制插件模型中,Kubernetes 会执行一个二进制文件(程序)。二进制插件由 kubelet 使用(例如,CSI 存储插件 和 CNI 网络插件),以及由 kubectl 使用(参见 使用插件扩展 kubectl)。
扩展点
该图显示了 Kubernetes 集群中的扩展点以及访问它的客户端。
图例
用户通常使用
kubectl
与 Kubernetes API 交互。 插件 自定义客户端的行为。存在可应用于不同客户端的通用扩展,以及特定于扩展kubectl
的方法。API 服务器处理所有请求。API 服务器中的几种扩展点允许对请求进行身份验证,或者根据其内容阻止它们,编辑内容以及处理删除。这些在 API 访问扩展 部分中进行了描述。
API 服务器提供各种资源。内置资源种类,如
pods
,由 Kubernetes 项目定义,不能更改。阅读 API 扩展 以了解有关扩展 Kubernetes API 的信息。Kubernetes 调度程序 决定 将 Pod 放置在哪个节点上。有几种方法可以扩展调度,这些方法在 调度扩展 部分中进行了描述。
Kubernetes 的大部分行为都是由称为 控制器 的程序实现的,这些程序是 API 服务器的客户端。控制器通常与自定义资源结合使用。阅读 将新 API 与自动化相结合 和 更改内置资源 以了解更多信息。
kubelet 在服务器(节点)上运行,并帮助 Pod 成为具有自己的 IP 地址的虚拟服务器,这些服务器位于集群网络上。 网络插件 允许使用不同的 Pod 网络实现。
您可以使用 设备插件 集成自定义硬件或其他特殊的节点本地设施,并使这些设施可用于在您的集群中运行的 Pod。kubelet 包括对使用设备插件的支持。
扩展点选择流程图
如果您不确定从哪里开始,此流程图可以提供帮助。请注意,某些解决方案可能涉及几种类型的扩展。
客户端扩展
kubectl 的插件是独立的二进制文件,它们添加或替换特定子命令的行为。kubectl
工具还可以与 凭据插件 集成。这些扩展只影响单个用户的本地环境,因此无法强制执行站点范围的策略。
如果您想扩展 kubectl
工具,请阅读 使用插件扩展 kubectl。
API 扩展
自定义资源定义
如果您想定义新的控制器、应用程序配置对象或其他声明式 API,并使用 Kubernetes 工具(如 kubectl
)管理它们,请考虑向 Kubernetes 添加自定义资源。
有关自定义资源的更多信息,请参见 自定义资源 概念指南。
API 聚合层
您可以使用 Kubernetes 的 API 聚合层 将 Kubernetes API 与其他服务集成,例如用于 指标 的服务。
将新 API 与自动化相结合
将自定义资源 API 和控制循环结合在一起,被称为 控制器 模式。如果您的控制器取代了人类操作员根据期望状态部署基础设施,那么控制器也可能遵循 操作符模式。操作符模式用于管理特定的应用程序;通常,这些应用程序会维护状态,并且需要仔细管理它们。
您还可以创建自己的自定义 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 镜像凭据提供者。
调度扩展
调度程序是一种特殊的控制器,它会监视 Pod 并将 Pod 分配到节点。默认调度程序可以完全替换,同时继续使用其他 Kubernetes 组件,或者可以同时运行 多个调度程序。
这是一项重大的工作,几乎所有 Kubernetes 用户都发现他们不需要修改调度程序。
您可以控制哪些 调度插件 处于活动状态,或者将插件集与不同的命名 调度程序配置文件 关联起来。您还可以编写自己的插件,该插件与 kube-scheduler 的一个或多个 扩展点 集成。
最后,内置的 kube-scheduler
组件支持一个 Webhook,它允许远程 HTTP 后端(调度程序扩展)过滤和/或优先化 kube-scheduler 为 Pod 选择的节点。
注意
您只能使用调度程序扩展器 Webhook 影响节点过滤和节点优先级;其他扩展点无法通过 Webhook 集成使用。下一步
- 了解有关基础设施扩展的更多信息
- 了解有关 kubectl 插件 的更多信息
- 了解有关 自定义资源 的更多信息
- 了解有关 扩展 API 服务器 的更多信息
- 了解有关 动态准入控制 的更多信息
- 了解有关 操作符模式 的更多信息