1. K8s API 基础:API Server 架构、RESTful 设计原则、资源对象模型概述

Kubernetes API 是整个集群的“控制面中枢”。所有对集群状态的查询、变更、编排指令,最终都通过 API Server 暴露的 RESTful 接口完成。理解 API Server 的内部架构、RESTful 设计原则以及资源对象模型,是掌握 K8s API 事务边界与一致性设计的前提。

1.1 API Server 架构

API Server(kube-apiserver)是 Kubernetes 控制面的核心组件,采用无状态水平扩展架构。其内部按请求处理链路划分为多个层级,每个层级负责特定的安全、校验、存储与准入逻辑。

核心架构分层(从上到下):
  • 认证层(Authentication): 验证请求者身份,支持 TLS 客户端证书、Bearer Token、HTTP Basic Auth、OpenID Connect 等。
  • 授权层(Authorization): 基于 RBAC、ABAC、Webhook 等策略判断请求者是否有权执行操作。
  • 准入控制层(Admission Controllers): 一组可插拔的插件,在对象持久化前进行变更(Mutating)或校验(Validating)。
  • API 路由与版本转换(Routing & Versioning): 根据请求路径匹配对应的 API 版本(如 v1、apps/v1),并完成内部版本与外部版本之间的转换。
  • 存储层(Storage - etcd): 最终将对象序列化为 JSON 或 Protobuf 格式,写入分布式键值存储 etcd。
API Server 请求处理架构 客户端 (kubectl / SDK) 认证层 (Authentication) 授权层 (Authorization) 准入控制层 (Admission Controllers) Mutating → Validating → 对象默认值/校验 API 路由 & 版本转换 存储层 (etcd) 说明:请求依次经过认证、授权、准入控制、版本转换后,最终持久化到 etcd

1.2 RESTful 设计原则

Kubernetes API 严格遵循 RESTful 架构风格,以资源为中心,通过标准的 HTTP 动词对资源进行增删改查。这种设计使得 API 具有高度的一致性、可缓存性和可发现性。

HTTP 动词 K8s 操作 幂等性 典型路径示例
GET 读取单个资源或集合 是 /api/v1/namespaces/{ns}/pods
POST 创建新资源 否(每次创建新 UID) /api/v1/namespaces/{ns}/pods
PUT 全量替换资源 是 /api/v1/namespaces/{ns}/pods/{name}
PATCH 部分更新资源 取决于策略 /api/v1/namespaces/{ns}/pods/{name}
DELETE 删除资源 是 /api/v1/namespaces/{ns}/pods/{name}
设计要点:
  • 资源路径层级: /apis/{group}/{version}/namespaces/{namespace}/{resource} 或 /api/{version}/namespaces/{namespace}/{resource}(核心组)。
  • 集合与个体: 集合路径(如 /pods)支持 GET(列表)和 POST(创建);个体路径(如 /pods/{name})支持 GET、PUT、PATCH、DELETE。
  • 子资源: 如 /pods/{name}/status、/pods/{name}/log,用于访问资源特定方面的状态或操作。

1.3 资源对象模型概述

Kubernetes 中的所有实体(Pod、Service、Deployment、ConfigMap 等)都被抽象为“资源对象”。每个资源对象遵循统一的元数据结构,并通过 API 版本机制实现演进。

1.3.1 资源对象的通用结构

每个 K8s 资源对象在 API 中表示为 JSON 或 Protobuf 结构,包含以下三个核心部分:

  • apiVersion: 标识资源所属的 API 组和版本,如 v1、apps/v1、batch/v1。
  • kind: 资源类型名称,如 Pod、Deployment、Service。
  • metadata: 包含名称(name)、命名空间(namespace)、UID、资源版本(resourceVersion)、标签(labels)、注解(annotations)等。
  • spec: 用户期望的期望状态(desired state),由用户定义。
  • status: 集群控制器报告的实际状态(actual state),由系统填充,用户只读。
# 一个典型的 Pod 资源对象 YAML 表示
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: default
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.25
    ports:
    - containerPort: 80
status:
  phase: Running
  podIP: 10.1.0.5
  conditions:
  - type: Ready
    status: "True"

1.3.2 API 组与版本演进

Kubernetes 通过 API 组(API Group)和版本(Version)对资源进行分类和演进,支持并行存在多个版本,并通过内部版本实现无损转换。

API 组 典型版本 包含资源示例 说明
核心组(空组) v1 Pod, Service, ConfigMap, Secret, Node, Namespace 最稳定、最基础的资源
apps v1 Deployment, StatefulSet, DaemonSet, ReplicaSet 工作负载管理
batch v1 Job, CronJob 批处理与定时任务
networking.k8s.io v1 Ingress, NetworkPolicy 网络策略与入口
rbac.authorization.k8s.io v1 Role, ClusterRole, RoleBinding, ClusterRoleBinding RBAC 权限控制
K8s 资源对象模型与 API 组关系 核心组 (v1) Pod Service ConfigMap Secret Node / Namespace apps/v1 Deployment StatefulSet DaemonSet ReplicaSet networking.k8s.io/v1 Ingress NetworkPolicy 所有资源对象的通用结构 apiVersion + kind + metadata + spec + status metadata 包含 name, namespace, uid, resourceVersion, labels, annotations spec 为用户期望状态,status 为系统实际状态(只读) 说明:不同 API 组管理不同领域的资源,但所有资源共享相同的元数据与 spec/status 结构

1.4 关键设计理念:声明式与最终一致性

Kubernetes API 的设计核心是“声明式”(Declarative)而非“命令式”(Imperative)。用户通过 API 提交期望状态(spec),集群中的控制器(Controller)持续观察实际状态(status)并驱动其向期望状态收敛。这种模型天然支持最终一致性(Eventual Consistency),也是理解 API 事务边界的基础。

⚠️ 常见误解: 初学者常认为 K8s API 的 POST/PUT 操作是“立即生效”的。实际上,API Server 只负责将 spec 持久化到 etcd 并更新 status 的初始值,真正的状态协调由异步的控制器循环完成。因此,API 操作的事务边界仅限于 API Server 与 etcd 之间的写入一致性,不包含控制器对实际集群状态的调整。