Kubernetes API
Kubernetes 的控制面的核心是API 服务器。API 服务器公开 HTTP API,允许最终用户、集群的不同部分和外部组件相互通信。
Kubernetes API 允许你查询和操作 Kubernetes 中的 API 对象的状态(例如:Pod、命名空间、ConfigMap 和事件)。
大多数操作可以通过 kubectl 命令行接口或其他命令行工具(例如 kubeadm,它们反过来使用 API)执行。但是,你也可以使用 REST 调用直接访问 API。Kubernetes 为那些希望使用 Kubernetes API 编写应用程序的人提供了一组客户端库。
每个 Kubernetes 集群都会发布该集群所服务的 API 的规范。Kubernetes 使用两种机制来发布这些 API 规范;两者对于实现自动互操作性都很有用。例如,kubectl
工具会获取并缓存 API 规范,以启用命令行完成和其他功能。支持的两种机制如下:
发现 API 提供有关 Kubernetes API 的信息:API 名称、资源、版本和支持的操作。这是一个 Kubernetes 特定的术语,因为它是一个与 Kubernetes OpenAPI 分开的 API。它旨在作为可用资源的简要摘要,并且不详细说明资源的具体模式。有关资源模式的参考,请参阅 OpenAPI 文档。
Kubernetes OpenAPI 文档为所有 Kubernetes API 端点提供(完整)OpenAPI v2.0 和 3.0 模式。OpenAPI v3 是访问 OpenAPI 的首选方法,因为它提供了更全面、更准确的 API 视图。它包括所有可用的 API 路径,以及每个端点上每个操作消耗和生成的所有资源。它还包括集群支持的任何可扩展性组件。该数据是一个完整的规范,并且比发现 API 中的数据大得多。
发现 API
Kubernetes 通过发现 API 发布所有受支持的组版本和资源的列表。其中包括每个资源的以下内容:
- 名称
- 集群或命名空间作用域
- 端点 URL 和支持的谓词
- 备用名称
- 组、版本、种类
API 以聚合和非聚合形式提供。聚合发现服务两个端点,而非聚合发现为每个组版本服务一个单独的端点。
聚合发现
Kubernetes v1.30 [稳定]
(默认启用:true)Kubernetes 为*聚合发现*提供稳定的支持,通过两个端点(/api
和 /apis
)发布集群支持的所有资源。请求此端点会大大减少从集群获取发现数据时发送的请求数量。你可以通过请求相应的端点并使用 Accept
标头指示聚合发现资源来访问数据:Accept: application/json;v=v2;g=apidiscovery.k8s.io;as=APIGroupDiscoveryList
。
如果不使用 Accept
标头指示资源类型,则 /api
和 /apis
端点的默认响应是非聚合发现文档。
内置资源的 发现文档可以在 Kubernetes GitHub 存储库中找到。如果 Kubernetes 集群不可用于查询,则可以使用此 Github 文档作为可用基本资源集的参考。
该端点还支持 ETag 和 protobuf 编码。
非聚合发现
在没有发现聚合的情况下,发现分层发布,根端点发布下游文档的发现信息。
集群支持的所有组版本的列表发布在 /api
和 /apis
端点。示例:
{
"kind": "APIGroupList",
"apiVersion": "v1",
"groups": [
{
"name": "apiregistration.k8s.io",
"versions": [
{
"groupVersion": "apiregistration.k8s.io/v1",
"version": "v1"
}
],
"preferredVersion": {
"groupVersion": "apiregistration.k8s.io/v1",
"version": "v1"
}
},
{
"name": "apps",
"versions": [
{
"groupVersion": "apps/v1",
"version": "v1"
}
],
"preferredVersion": {
"groupVersion": "apps/v1",
"version": "v1"
}
},
...
}
需要额外的请求才能在 /apis/<group>/<version>
(例如:/apis/rbac.authorization.k8s.io/v1alpha1
)获取每个组版本的发现文档,该文档通告在特定组版本下提供的资源列表。kubectl 使用这些端点来获取集群支持的资源列表。
OpenAPI 接口定义
有关 OpenAPI 规范的详细信息,请参阅OpenAPI 文档。
Kubernetes 提供 OpenAPI v2.0 和 OpenAPI v3.0。OpenAPI v3 是访问 OpenAPI 的首选方法,因为它提供了 Kubernetes 资源的更全面的(无损)表示。由于 OpenAPI 版本 2 的限制,某些字段将从发布的 OpenAPI 中删除,包括但不限于 default
、nullable
、oneOf
。
OpenAPI V2
Kubernetes API 服务器通过 /openapi/v2
端点提供聚合的 OpenAPI v2 规范。你可以使用请求标头按如下方式请求响应格式:
标头 | 可能的值 | 备注 |
---|---|---|
Accept-Encoding | gzip | 不提供此标头也是可以接受的 |
Accept | application/[email protected]+protobuf | 主要用于集群内使用 |
application/json | 默认值 | |
* | 服务application/json |
OpenAPI V3
Kubernetes v1.27 [稳定]
(默认启用:true)Kubernetes 支持以 OpenAPI v3 的形式发布其 API 的描述。
提供了一个发现端点 /openapi/v3
以查看所有可用的组/版本的列表。此端点仅返回 JSON。这些组/版本以以下格式提供:
{
"paths": {
...,
"api/v1": {
"serverRelativeURL": "/openapi/v3/api/v1?hash=CC0E9BFD992D8C59AEC98A1E2336F899E8318D3CF4C68944C3DEC640AF5AB52D864AC50DAA8D145B3494F75FA3CFF939FCBDDA431DAD3CA79738B297795818CF"
},
"apis/admissionregistration.k8s.io/v1": {
"serverRelativeURL": "/openapi/v3/apis/admissionregistration.k8s.io/v1?hash=E19CC93A116982CE5422FC42B590A8AFAD92CDE9AE4D59B5CAAD568F083AD07946E6CB5817531680BCE6E215C16973CD39003B0425F3477CFD854E89A9DB6597"
},
....
}
}
相对 URL 指向不可变的 OpenAPI 描述,以便改进客户端缓存。API 服务器也为此目的设置了正确的 HTTP 缓存标头(Expires
为未来 1 年,Cache-Control
为 immutable
)。当使用过时的 URL 时,API 服务器将返回重定向到最新的 URL。
Kubernetes API 服务器在 /openapi/v3/apis/<group>/<version>?hash=<hash>
端点发布每个 Kubernetes 组版本的 OpenAPI v3 规范。
有关接受的请求标头,请参阅下表。
标头 | 可能的值 | 备注 |
---|---|---|
Accept-Encoding | gzip | 不提供此标头也是可以接受的 |
Accept | application/[email protected]+protobuf | 主要用于集群内使用 |
application/json | 默认值 | |
* | 服务application/json |
在包 k8s.io/client-go/openapi3
中提供了获取 OpenAPI V3 的 Golang 实现。
Kubernetes 1.32 发布 OpenAPI v2.0 和 v3.0;近期没有计划支持 3.1。
Protobuf 序列化
Kubernetes 实现了一种基于 Protobuf 的替代序列化格式,该格式主要用于集群内通信。有关此格式的更多信息,请参阅 Kubernetes Protobuf 序列化 设计提案以及位于 Go 包中的每个架构的接口定义语言 (IDL) 文件,这些包定义了 API 对象。
持久化
Kubernetes 通过将对象的序列化状态写入 etcd 来存储。
API 组和版本控制
为了更容易地删除字段或重构资源表示,Kubernetes 支持多个 API 版本,每个版本都位于不同的 API 路径上,例如 /api/v1
或 /apis/rbac.authorization.k8s.io/v1alpha1
。
版本控制是在 API 级别而不是在资源或字段级别完成的,以确保 API 提供对系统资源和行为的清晰、一致的视图,并允许控制对生命周期结束和/或实验性 API 的访问。
为了更容易地发展和扩展其 API,Kubernetes 实现了可以启用或禁用的API 组。
API 资源通过其 API 组、资源类型、命名空间(对于命名空间资源)和名称来区分。API 服务器透明地处理 API 版本之间的转换:所有不同的版本实际上是同一持久数据的表示。API 服务器可以通过多个 API 版本服务相同的底层数据。
例如,假设同一个资源存在两个 API 版本:v1
和 v1beta1
。如果你最初使用 v1beta1
版本的 API 创建了一个对象,那么之后你可以使用 v1beta1
或 v1
版本的 API 来读取、更新或删除该对象,直到 v1beta1
版本被弃用并移除。届时,你可以继续使用 v1
API 来访问和修改该对象。
API 变更
任何成功的系统都需要随着新的用例出现或现有用例的改变而成长和变化。因此,Kubernetes 将 Kubernetes API 设计为持续变化和增长。Kubernetes 项目的目标是不破坏与现有客户端的兼容性,并保持这种兼容性一段时间,以便其他项目有机会进行调整。
一般来说,新的 API 资源和新的资源字段可以经常和频繁地添加。删除资源或字段需要遵循 API 弃用策略。
Kubernetes 强烈承诺,一旦官方 Kubernetes API 达到正式可用 (GA) 状态(通常是 API 版本 v1
),就会保持其兼容性。此外,Kubernetes 还会保持与通过官方 Kubernetes API 的 *beta* 版本持久化的数据的兼容性,并确保当该功能稳定时,数据可以通过 GA API 版本转换和访问。
如果你采用了 beta API 版本,则需要在 API 升级后过渡到后续的 beta 或稳定 API 版本。最好的时机是在 beta API 处于弃用期间,因为此时可以通过两个 API 版本同时访问对象。一旦 beta API 完成其弃用期并且不再提供服务,则必须使用替换的 API 版本。
注意
虽然 Kubernetes 也致力于保持与 *alpha* API 版本的兼容性,但在某些情况下这是不可能的。如果你使用任何 alpha API 版本,请在升级集群时查看 Kubernetes 的发行说明,以防 API 发生了不兼容的更改,需要先删除所有现有的 alpha 对象才能进行升级。有关 API 版本级别定义的更多详细信息,请参阅 API 版本参考。
API 扩展
可以通过以下两种方式之一扩展 Kubernetes API:
下一步
- 了解如何通过添加你自己的 CustomResourceDefinition 来扩展 Kubernetes API。
- 控制对 Kubernetes API 的访问 介绍了集群如何管理 API 访问的身份验证和授权。
- 通过阅读 API 参考 了解有关 API 端点、资源类型和示例的信息。
- 从 API 变更 中了解什么构成兼容性变更以及如何更改 API。