Kubernetes 控制面的核心是API 服务器(kube-apiserver),其通过暴露 HTTP API 实现多主体间通信,具体功能包括:
kubectl、kubeadm 等命令行工具的底层依赖(工具背后均调用 API),同时也支持通过 REST 调用直接访问。{% fold danger @ kubectl 和 kubeadm 是什么 %}
在 Kubernetes(K8s)生态系统中,kubectl 和 kubeadm 是两个最核心的命令行工具,它们的作用如下:
1. kubectl (Kubernetes Command-Line Tool)
它是 Kubernetes 的日常操作工具,也是开发者和管理员最常用的工具。
2. kubeadm (Kubernetes Admin)
它是 Kubernetes 的集群生命周期管理工具。
kubeadm init:用于初始化一个 Master 节点(控制平面)。kubeadm join:用于将 Worker 节点加入到现有的集群中。kubeadm upgrade:用于升级集群版本。总结两者的区别:kubeadm 是用来盖房子的(创建和设置集群)。kubectl 是用来在房子里生活的(在集群里部署和管理应用)。
{% endfold %}
Kubernetes 提供两种机制发布 API 规范,均用于实现自动互操作(如 kubectl 的命令行补全功能),具体对比如下:
| 机制 | 核心功能 | 关键特点 |
|---|---|---|
| Discovery API(发现 API) | 提供 API 名称、资源、版本、支持操作等简要信息,不包含资源具体模式 | - 分为聚合式和非聚合式两种形式; - 独立于 Kubernetes OpenAPI,仅作资源概要展示 |
| Kubernetes OpenAPI 文档 | 提供完整的 API 规范(含所有端点、资源收发数据、可扩展组件) | - 支持 OpenAPI v2.0 和 v3.0(v3.0 为首选,无字段丢失,描述更全面); - 规范体积大于 Discovery API |
{% fold danger @ 为什么要提供两种机制 %}
在 Kubernetes 中提供 Discovery API(发现 API) 和 OpenAPI 规范 这两种机制,主要是为了在性能效率、使用场景以及信息详情之间取得平衡。
具体原因可以归纳为以下几点:
1. 性能与体积的权衡 (Efficiency vs. Size)
2. 使用场景的不同 (Different Use Cases)
3. 引导过程的需要 (Bootstrapping)
客户端通常需要一个“两步走”的过程:
简单来说,Discovery API 是“导游图”(告诉你哪有景点,很快就能看完),而 OpenAPI 是“建筑图纸”(告诉你每个景点的砖头是怎么砌的,内容极其详细)。对于大多数日常操作,看一眼“导游图”就够了;只有在需要精确施工(如开发插件或生成代码)时,才需要查阅“建筑图纸”。
{% endfold %}
AggregatedDiscoveryEndpoint 特性门控启用)/api 和 /apis,可一次性获取集群所有支持的资源,减少请求数量。Accept: application/json;v=v2beta1;g=apidiscovery.k8s.io;as=APIGroupDiscoveryList,否则默认返回非聚合文档。/api 和 /apis,仅返回集群支持的所有组版本列表(示例含 apiregistration.k8s.io/v1、apps/v1 等)。/apis/<group>/<version>(如 /apis/rbac.authorization.k8s.io/v1alpha1),kubectl 依赖此方式获取资源列表。{% fold danger @ 什么是聚合和非聚合 %}
在 Kubernetes API 的语境下,“聚合”(Aggregated)和“非聚合”(Non-aggregated)主要出现在 Discovery API(发现 API) 和 API 扩展机制这两个场景中。
1. Discovery API(发现 API)中的聚合与非聚合
这是 kubectl 等客户端用来了解集群支持哪些资源(如 Pod, Deployment 等)的机制。
2. API Server 的聚合层 (Aggregation Layer)
这是 Kubernetes 的一种架构模式,用于扩展 API。
非聚合(内置 API / CRD)
标准的 API(如 Pod)或通过 CRD(Custom Resource Definition)定义的资源。它们直接由 Kubernetes 核心 API Server 处理,数据存储在 etcd 中。
聚合层 (Aggregation Layer / API Aggregation)
总结
{% endfold %}
/openapi/v2(聚合式规范)。| 头部 | 可选值 | 说明 |
|---|---|---|
Accept-Encoding |
gzip |
不指定也可正常响应 |
Accept |
application/com.github.proto-openapi.spec.v2@v1.0+protobuf(集群内部用)、application/json(默认)、*(返回 application/json) |
- |
kubectl apply --dry-run=server(触发所有校验及准入检查)。OpenAPIV3 特性门控启用,为首选方式)/openapi/v3,仅返回 JSON 格式的组版本列表(含各版本对应的 serverRelativeURL)。/openapi/v3/apis/<group>/<version>?hash=<hash>,URL 不可变且支持缓存(Expires 设为未来 1 年,Cache-Control 为 immutable),过时 URL 会重定向到最新地址。Accept 支持 protobuf 格式(集群内部)、JSON(默认)等。k8s.io/client-go/openapi3 包获取规范,当前无支持 OpenAPI v3.1 的计划。Kubernetes 将 API 对象的序列化状态存储在 etcd(集群的键值存储系统)中,实现数据持久化。
v1beta1 创建的对象,可通过 v1 版本读写,直到 v1beta1 被废弃)。| API 版本级别 | 兼容性承诺 | 变更注意事项 |
|---|---|---|
GA(稳定版,如 v1) |
强兼容性承诺,无意外 breaking change | 新增资源/字段频繁,删除需严格遵循 API 废弃策略 |
| Beta(测试版) | 持久化数据兼容性承诺,功能进入稳定期后可通过 GA 版本访问 | 需在 Beta 弃用期内迁移到后续 Beta/GA 版本,弃用后仅支持替换版本 |
| Alpha(阿尔法版) | 不保证兼容性,升级前需查看发布说明,可能需删除现有 Alpha 对象 | - |