kube-apiserver

kube-apiserver 是 Kubernetes 最重要的核心组件之一,主要提供以下的功能

  • 提供集群管理的 REST API 接口,包括认证授权、数据校验以及集群状态变更等

  • 提供其他模块之间的数据交互和通信的枢纽(其他模块通过 API Server 查询或修改数据,只有 API Server 才直接操作 etcd)

REST API

kube-apiserver 支持同时提供 https(默认监听在 6443 端口)和 http API(默认监听在 127.0.0.1 的 8080 端口),其中 http API 是非安全接口,不做任何认证授权机制,不建议生产环境启用。两个接口提供的 REST API 格式相同,参考 Kubernetes API Referencearrow-up-right 查看所有 API 的调用格式。

img

(图片来自 OpenShift Blogarrow-up-right

在实际使用中,通常通过 kubectlarrow-up-right 来访问 apiserver,也可以通过 Kubernetes 各个语言的 client 库来访问 apiserver。在使用 kubectl 时,打开调试日志也可以看到每个 API 调用的格式,比如

可通过 kubectl api-versionskubectl api-resources 查询 Kubernetes API 支持的 API 版本以及资源对象。

OpenAPI 和 Swagger

通过 /swaggerapi 可以查看 Swagger API,/openapi/v2 查看 OpenAPI。

开启 --enable-swagger-ui=true 后还可以通过 /swagger-ui 访问 Swagger UI。

根据 OpenAPI 也可以生成各种语言的客户端,比如可以用下面的命令生成 Go 语言的客户端:

访问控制

Kubernetes API 的每个请求都会经过多阶段的访问控制之后才会被接受,这包括认证、授权以及准入控制(Admission Control)等。

认证

开启 TLS 时,所有的请求都需要首先认证。Kubernetes 支持多种认证机制,并支持同时开启多个认证插件(只要有一个认证通过即可)。如果认证成功,则用户的 username 会传入授权模块做进一步授权验证;而对于认证失败的请求则返回 HTTP 401。

Kubernetes 不直接管理用户

虽然 Kubernetes 认证和授权用到了 username,但 Kubernetes 并不直接管理用户,不能创建 user 对象,也不存储 username。

更多认证模块的使用方法可以参考 Kubernetes 认证插件

授权

认证之后的请求就到了授权模块。跟认证类似,Kubernetes 也支持多种授权机制,并支持同时开启多个授权插件(只要有一个验证通过即可)。如果授权成功,则用户的请求会发送到准入控制模块做进一步的请求验证;而对于授权失败的请求则返回 HTTP 403.

更多授权模块的使用方法可以参考 Kubernetes 授权插件

准入控制

准入控制(Admission Control)用来对请求做进一步的验证或添加默认参数。不同于授权和认证只关心请求的用户和操作,准入控制还处理请求的内容,并且仅对创建、更新、删除或连接(如代理)等有效,而对读操作无效。准入控制也支持同时开启多个插件,它们依次调用,只有全部插件都通过的请求才可以放过进入系统。

更多准入控制模块的使用方法可以参考 Kubernetes 准入控制

启动 apiserver 示例

工作原理

kube-apiserver 提供了 Kubernetes 的 REST API,实现了认证、授权、准入控制等安全校验功能,同时也负责集群状态的存储操作(通过 etcd)。

流式列表响应 (Streaming List Responses)

从 Kubernetes v1.33 开始,API Server 引入了流式列表响应机制,解决大规模集群中 List API 调用的内存消耗问题:

技术原理:

  • 传统方式:将整个响应序列化为单个连续内存块,然后一次性传输

  • 流式编码:逐个处理和传输 "Items" 字段中的项目,允许内存在传输过程中逐步释放

性能优势:

  • 显著降低 API Server 内存占用(基准测试显示内存使用从 70-80GB 降至 3GB,提升约 20 倍)

  • 减少大规模集群中出现内存不足 (OOM) 的风险

  • 提高资源利用率和系统稳定性

  • 保持与现有编码器的字节级兼容性,无需客户端修改

应用场景:

  • 大规模集群(节点数 > 1000)的资源列表查询

  • 包含大量对象的命名空间列表操作

  • 监控系统的批量数据获取

  • CI/CD 系统的集群状态检查

/apis/batch/v2alpha1/jobs 为例,GET 请求的处理过程如下图所示:

img

POST 请求的处理过程为:

img

(图片来自 OpenShift Blogarrow-up-right

API 访问

有多种方式可以访问 Kubernetes 提供的 REST API:

kubectl

kubectl proxy

curl

API 参考文档

最近 3 个稳定版本的 API 参考文档为:

最后更新于