惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
C
Cybersecurity and Infrastructure Security Agency CISA
G
Google Developers Blog
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
The GitHub Blog
The GitHub Blog
TaoSecurity Blog
TaoSecurity Blog
V
Visual Studio Blog
D
DataBreaches.Net
人人都是产品经理
人人都是产品经理
博客园 - Franky
S
Security @ Cisco Blogs
Hacker News - Newest:
Hacker News - Newest: "LLM"
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
C
Cyber Attacks, Cyber Crime and Cyber Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
H
Hackread – Cybersecurity News, Data Breaches, AI and More
腾讯CDC
T
Troy Hunt's Blog
B
Blog RSS Feed
A
About on SuperTechFans
IT之家
IT之家
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
J
Java Code Geeks
S
Securelist
T
Threatpost
SecWiki News
SecWiki News
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Y
Y Combinator Blog
Blog — PlanetScale
Blog — PlanetScale
aimingoo的专栏
aimingoo的专栏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Forbes - Security
Forbes - Security
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
D
Docker
N
News and Events Feed by Topic
Schneier on Security
Schneier on Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
月光博客
月光博客
C
CXSECURITY Database RSS Feed - CXSecurity.com
罗磊的独立博客
H
Hacker News: Front Page
N
News and Events Feed by Topic
N
Netflix TechBlog - Medium
AWS News Blog
AWS News Blog
P
Privacy International News Feed
Scott Helme
Scott Helme
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
V
Vulnerabilities – Threatpost
The Register - Security
The Register - Security

博客园 - 左扬

VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— VictoriaLogs 协同:Metrics 到 Logs 的一体化监控 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 源码阅读路线图:如何高效阅读 VM 源码 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 开源生态:VM 在 CNCF 生态中的位置 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 与其他 TSDB 对比:Prometheus/InfluxDB/Thanos/VM VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 写入吞吐/查询延迟/内存占用的数学模型 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 模块依赖图——从 import 语句看组件关系 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— Goroutine 池/atomic/零拷贝/sync.Pool VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 多租户架构——accountID/projectID 与 tenant 隔离 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 版本演进:1.146.0 LTS 重大更新解析 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 整体数据流:一条监控数据的完整生命周期 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 架构演进:从 TSDB 到 MergeSet 的设计取舍 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— Single-Node vs Cluster 模式本质区别 VictoriaMetrics 1.146.0 源码【左扬精讲】—— 开篇总览 Rust 专题【左扬精讲】—— 从语法到灵魂:Ownership、Borrowing 与多语言对比 kubernetes 源码【左扬精讲】—— kube-scheduler 启动流程源码分析 Rust 专题【左扬精讲】—— 选择控制语句、运算符与格式化输出 Rust 专题【左扬精讲】—— 所有权详解 Rust 专题【左扬精讲】—— 作用域详解 Rust 专题【左扬精讲】—— 变量、常量与标量数据类型 kubernetes 源码 / Operator 专题【左扬精讲】—— Deployment Controller 源码分析:从对象创建到滚动更新 kubernetes 源码 / Operator 专题【左扬精讲】—— Operator 开发中的 Webhook:从准入控制到生产部署 Kubernetes源码 / Operator 专题【左扬精讲】—— 实现 Application Controller:从零构建生产级控制器 Kubernetes 编程 / Operator 专题【左扬精讲】—— 定义 Application 资源 + 添加自定义新 API 完整指南 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 八):内部架构与核心组件 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 八): —— 从入口到调度的全链路源码剖析(k8s v1.36.1) DeepSeek-R1 多模态 R1 / VLM-GRPO【左扬精讲】—— Qwen2-VL 微调与视觉推理强化学习实战 DeepSeek-R1 工业 RAG + 微调混合系统【左扬精讲】—— R1 系列收官之作:从 Prompt → RAG → 微调 选型决策树 DeepSeek-R1 推理时扩展【左扬精讲】—— o1 / R1 慢思考机制:Self-Consistency + ToT + PRM 详解 DeepSeek-R1 端侧 LLM 工程【左扬精讲】—— llama.cpp 调参与 Apple Silicon / 国产 NPU / Android 端侧落地全攻略 DeepSeek-R1 vLLM + k8s 生产部署【左扬精讲】—— 从单卡 7B 到 100 卡 671B MoE 集群的工业化部署实战 DeepSeek-R1 评估与系统(Evaluation & Systems)【左扬精讲】—— 从 GSM8K/MMLU 到 LLM-as-Judge 的工业级评估方法论 DeepSeek-R1 模型训练与算法【左扬精讲】—— GRPO 进阶算法:DAPO / PRIME / RLVR / PRM 四大 2025 前沿改进 DeepSeek-R1 模型训练与算法【左扬精讲】—— 数据蒸馏:用 DeepSeek-R1-671B 生成 800K 高质量 CoT 样本的完整流水线 DeepSeek-R1 优化与微调实战【左扬精讲】—— 从 R1 强化学习新范式到 GRPO 微调一站式入门 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 七):自定义插件开发实战 —— 手写一个 Score 插件并注册到集群 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 六):Scheduler Profile 与多调度器 —— 如何配置多个 profile 实现多租户、Coordinated LeaderElection Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 五):SchedulingQueue 与 QueueingHint —— 三段队列的细节、v1.36 新引入的 QueueingHint 工作机制 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 四):抢占(Preemption)算法剖析 —— DefaultPreemption 如何选 victim、PodDisruptionBudget 如何约束 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 二):内置插件逐个精读 — NodeResourcesFit / NodeAffinity / TaintToleration / PodTopologySpread / VolumeBinding / InterPodAffinity Kubernetes 源码 / Operator 专题【左扬精讲】——kube-scheduler(调度专题):调度器内置插件 逐个精读 k8s 源码级精讲(二十六):调度器内置插件逐个精读 Kubernetes 源码 / Operator 专题【左扬精讲】——kube-scheduler(调度专题):调度器内置插件精读 — NodeResourcesFit / NodeAffinity / TaintToleration / PodTopologySpread / VolumeBinding / InterPodAffinity Kubernetes 源码 / Operator 专题【左扬精讲】——kube-scheduler(调度专题):Scheduling Framework 扩展点逐个源码拆解 Kubernetes 源码 / Operator 专题【左扬精讲】——kube-scheduler(调度专题):初识调度模型、内部架构与事件驱动机制 Kubernetes 编程 / client-go 专题【左扬精讲】—— 四种客户端:为什么、怎么选、怎么用 Kubernetes 编程 / Operator 专题【左扬精讲】—— controller-runtime、kubebuilder、operator-sdk 三大框架深度对比 Kubernetes 编程 / Operator 专题【左扬精讲】—— 深入理解 ManagedFields 字段冲突协调机制 Kubernetes 编程 / Operator 专题【左扬精讲】—— k8s Finalizers 深度解析:对象的生命周期与删除控制 Kubernetes 编程 / Operator 专题【左扬精讲】—— OwnerReference 字段与级联删除机制 Kubernetes 编程 / Operator 专题【左扬精讲】—— 深入学习 Server-Side Apply:managedFields 替代 last-applied-configuration 的演进方向 Kubernetes 编程 / Operator 专题【左扬精讲】—— k8s Annotations 与元数据体系(Operator 专题) Kubernetes 编程 / Operator 专题【左扬精讲】—— RESTMapper:把 Group / Version / Kind / Resource 四元组翻译成 REST 路径的"查字典"大师 Kubernetes 编程 / Operator 专题【左扬精讲】—— Converter 资源版本转换器 Kubernetes 编程 / Operator 专题【左扬精讲】—— Application 业务扩展:从单 Deployment 到多 Workload 的复合 Operator 演进 Kubernetes 编程 / Operator 专题【左扬精讲】—— OwnerReference / Finalizer / 准入控制:k8s 资源生命周期的三大支柱 Kubernetes 编程 / Operator 专题【左扬精讲】—— controller-runtime 框架内幕:从 Manager 到 Reconcile 的全栈拆解 Kubernetes 编程 / Operator 专题【左扬精讲】—— 生产级 Operator 最佳实践:并发安全、资源清理与高可用设计 Kubernetes 编程 / Operator 专题【左扬精讲】—— application-operator Reconcile 循环源码精讲:从 client-go Informer 到 workqueue 的全链路解剖 Kubernetes 编程 / Operator 专题【左扬精讲】—— 从零搭建一个 application-operator 新项目:脚手架、API 设计与基于原生 DeploymentStatus/ServiceStatus 的状态建模 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:生产级 Controller 实践:并发安全、资源清理与高可用设计 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析: Controller 调试与诊断工具:从日志分析到问题定位 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:DynamicClient 操作 CRD:无需代码生成的动态操作 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:控制器与 APIServer 完整交互流程:从 Watch 到缓存同步 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:错误处理与重试机制:WorkQueue 限速器详解 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Leader 选举机制:高可用控制器的必备技能 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Controller 开发模式完整实战 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:SharedInformerFactory 与等待缓存同步 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:从认证配置到 Deployment 操作 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:版本对应、架构组件与组件关系 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Informer 源码深度解析:从底层原理到实战应用 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Reflector 源码深度解析 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:ListWatcher 源码深度解析 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Indexer 与 ThreadSafeStore 核心原理与源码深度剖析 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:DeltaFIFO 核心原理与源码深度剖析 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:workqueue 核心原理与实战 Kubernetes 编程 / Operator 专题【左扬精讲】—— runtime.Codec 资源编解码:serializer 与 codec 差异、编解码数据结构、codec 核心调用链路 Kubernetes 编程 / Operator 专题【左扬精讲】—— Scheme 资源注册机制全解 Kubernetes 编程 / Operator 专题【左扬精讲】—— Kubernetes 自定义资源的内部版本与外部版本:从源码看版本定义机制 Kubernetes 编程 / Operator 专题【左扬精讲】—— Kubernetes 构建过程 【AIOPS】一文读懂LLM【左扬精讲】:从诞生到普及,解锁大语言模型的核心密码 【AIOPS】AI Agent 专题【左扬精讲】核心功能篇:MCP-VictoriaMetrics Hooks 源码精讲:Hooks 可观测性的无侵入式实现 【AIOPS】AI Agent 专题【左扬精讲】核心功能篇:MCP-VictoriaMetrics Golang 配置解析源码精讲 ——SRE 自定义 Agent 核心技巧 【AIOPS】AI Agent 专题【左扬精讲】核心功能篇:MCP-VictoriaMetrics Golang 并发模型解析 ——SRE 应对高并发采集的调优思路 【AIOPS】AI Agent 专题【左扬精讲】基础架构篇:MCP-VictoriaMetrics Golang 源码整体架构拆解 ——SRE 必懂的核心模块与数据流 OpenTelemetry 开发实战【左扬精讲】—— 云原生可观测体系构建与分布式追踪二次开发 Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 7 —— 基于流量预测模型的智能弹性扩缩容 Operator 实战(AIOps 模型训练与智能扩容(下篇)—— 预测式弹性扩缩容 Operator 落地实现) Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 7 —— 基于流量预测模型的智能弹性扩缩容 Operator 实战(AIOps 模型训练与智能扩容(上篇)—— 时序预测模型构建与离线训练) Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 6 —— 基于运维专家知识库的智能故障诊断与排查 Operator 实战 Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 5 —— 基于大语言模型(LLM)的实时日志流智能监测 Operator 实现 Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 4 —— 基于 Operator 实现大模型私有化部署与管理 Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 3(上篇)—— 面向 AI / 算力调度场景:GPU 竞价实例资源池统一调度管理 Operator 开发 Kubernetes编程 / Operator专题【左扬精讲】—— Operator 开发实战项目 2 —— 面向零售 / 电商潮汐流量难题:多云多集群数据中心级全链路弹性伸缩 DataCenter Scaler Operator 从 0 到 1 全链路开发 Kubernetes编程 / Operator专题【左扬精讲】—— 深入理解Kubebuilder注解:为什么Operator开发离不开这些特殊注释 Kubernetes编程 / Operator专题【左扬精讲】—— Operator 开发实战项目1 —— Applicaion Operator(通用应用生命周期管理 Operator 实战) Pod 镜像拉取失败?kubectl edit pods修改镜像地址的底层原理与实操 (该方法仅为临时应急方案,并非长期解决方案) Kubernetes编程/Operator专题精讲—— 理解控制器模式 —— 控制器模式的核心原理与实现逻辑(从原理到实践) 【AIOPS】AI Agent 专题【左扬精讲】模型微调实战:一站式平台 LLaMA-Factory 【AIOPS】AI Agent 专题【左扬精讲】基于 k8s+vLLM+Ray 分布式部署全指南:架构设计、资源调度与性能优化 【AIOPS】AI Agent专题【左扬精讲】非量化版DeepSeek分布式部署全指南:精度保障、显存规划与Ollama/vLLM选型 【AIOPS】AI Agent 专题【左扬精讲】零开发框架实现 ReAct Agent(Go SRE友好)
Kubernetes 编程 / Operator 专题【左扬精讲】—— Kubernetes 1.36.1 核心 API 数据结构全解
左扬 · 2026-06-11 · via 博客园 - 左扬

Kubernetes 编程 / Operator 专题【左扬精讲】—— Kubernetes 1.36.1 核心 API 数据结构全解

Kubernetes 是一个"一切皆资源"的系统。从 Pod、Service 到 Deployment,从 ConfigMap 到 RBAC 权限策略,Kubernetes 将所有抽象都建模为 API 资源。而理解这些资源的底层数据结构,是深入掌握 Kubernetes 的必经之路。

初学者往往被海量概念淹没——Group、Version、Kind、Resource 傻傻分不清;客户端库(client-go)里的 Informer、Workqueue 不知道干什么用。本文从 Kubernetes 源码出发,带你彻底搞懂 1.36.1 版本的核心 API 数据结构。

Kubernetes 1.36.1 Go API client-go

🔓 学习重点提示  — 建议先通读全文,再重点回顾标注内容

★ 重点掌握(必须)
   • TypeMeta + ObjectMeta:所有 k8s 资源的"基因",理解这两个就理解了一半
   • Spec/Status 分离模式:声明式 API 的核心设计哲学
   • GVK / GVR:Group-Version-Kind 三元组是 k8s API 的身份标识
   • Informer 机制:理解它才能写出正确的控制器代码

☆ 次重点(了解即可)
   • Scheme 内部实现:生产环境一般不会直接操作,但能加深理解
   • Workqueue 的泛型接口:偏底层实现细节


目录

  1. Kubernetes API 的设计哲学
  2. API 元数据类型:TypeMeta 与 ObjectMeta
  3. 核心 API 资源类型
  4. API 机制核心类型:GVK/GVR 与 Scheme
  5. kubectl api-resources 与 API 全景图
  6. 客户端编程:Informer 与 Workqueue
  7. 常见问题
  8. 总结

一、Kubernetes API 的设计哲学

1.1 一切皆资源

Kubernetes 的核心哲学是"一切皆资源"。无论是运行中的容器(Pod)、负载均衡规则(Service)、还是访问权限(RBAC),在 k8s 里都是 RESTful API 资源。这意味着你可以用 POST 创建资源、用 GET 查看资源、用 PATCH 更新资源、用 DELETE 删除资源——和操作数据库记录完全一样。

这种设计的最大好处是:所有操作都可以用统一的 YAML 描述,提交到 Git 做版本管理,配合 kubectl apply 实现"声明式基础设施"。

1.2 API 的组织结构

Kubernetes API 按 Group(组)、Version(版本)、Kind(种类)三层结构组织:

  • Group(API 组):相关功能的资源归为一组,如 apps(应用)、networking.k8s.io(网络)
  • Version(版本):每个组可有多个版本(v1、v1beta1),通过版本字段标记 API 的演进阶段
  • Kind(资源种类):具体的资源类型,如 Pod、Deployment、Service

以 Deployment 为例,它的 API 路径是 `/apis/apps/v1/namespaces/{namespace}/deployments`,对应的 GVK 是 `apps/v1 + Deployment`。这四个信息组合起来,唯一确定了 API 服务器上的一个端点。

核心 API 组(如 Pod、Service)没有组名,路径直接是 /api/v1/;其他组则通过 /apis/{group}/{version}/ 的路径暴露。这就是为什么 Pod 的路径是 /api/v1,而 Deployment 的路径是 /apis/apps/v1。

1.3 Spec/Status 分离模式

几乎所有 Kubernetes 资源都遵循一个统一的结构模式:

TypeMeta  +  ObjectMeta  +  Spec  +  Status

  • Spec(规格):用户声明的"期望状态"——你想让集群变成什么样。这是用户唯一需要填写的部分。
  • Status(状态):集群观测到的"实际状态"——当前集群真实的样子。由 k8s 控制器自动更新,用户不填写。

这个模式是声明式 API 的核心:你只描述目标状态,k8s 的控制器会持续 reconcile(调谐),不断对比 Spec 和 Status 的差异,自动采取行动让实际状态逼近期望状态。

1.4 API 全景图 — kubectl api-resources -v 10

光看源码定义还不够直观,Kubernetes 提供了一个命令可以一次性看清集群中所有已注册的 API 资源。`-v 10` 会输出详细的对接信息,包括每个资源的 Group、Version、Kind、Shortnames、Namespaced(是否命名空间级别)等关键元数据。

$ kubectl api-resources -v 10

NAME                              SHORTNAMES   APIVERSION                    NAMESPACED   KIND
bindings                                      v1                              true         Binding
componentstatuses                 cs           v1                              false        ComponentStatus
configmaps                       cm           v1                              true         ConfigMap
endpoints                        ep           v1                              true         Endpoints
events                           ev           v1                              true         Event
limitranges                      limits       v1                              true         LimitRange
namespaces                       ns           v1                              false        Namespace
nodes                            no           v1                              false        Node
persistentvolumeclaims           pvc          v1                              true         PersistentVolumeClaim
persistentvolumes                pv           v1                              false        PersistentVolume
pods                             po           v1                              true         Pod
podtemplates                                  v1                              true         PodTemplate
replicationcontrollers           rc           v1                              true         ReplicationController
resourcequotas                    quota       v1                              true         ResourceQuota
secrets                                      v1                              true         Secret
services                         svc          v1                              true         Service
... (省略部分 core/v1 资源)

daemonsets                       ds           apps/v1                         true         DaemonSet
deployments                      deploy       apps/v1                         true         Deployment
replicasets                      rs           apps/v1                         true         ReplicaSet
statefulsets                     sts          apps/v1                         true         StatefulSet

ingresses                        ing          networking.k8s.io/v1            true         Ingress
networkpolicys                   netpol       networking.k8s.io/v1            true         NetworkPolicy

roles                                        rbac.authorization.k8s.io/v1   true         Role
clusterroles                                  rbac.authorization.k8s.io/v1   false        ClusterRole
rolebindings                                  rbac.authorization.k8s.io/v1   true         RoleBinding
clusterrolebindings                           rbac.authorization.k8s.io/v1   false        ClusterRoleBinding

horizontalpodautoscalers          hpa          autoscaling/v1                 true         HorizontalPodAutoscaler

jobs                                           batch/v1                       true         Job
cronjobs                           cj           batch/v1                       true         CronJob

poddisruptionbudgets              pdb          policy/v1                      true         PodDisruptionBudget

csidrivers                                    storage.k8s.io/v1              false        CSIDriver
csinodes                                      storage.k8s.io/v1              false        CSINode
storageclasses                   sc           storage.k8s.io/v1              false        StorageClass

leases                                        coordination.k8s.io/v1         true         Lease
events                            ev           events.k8s.io/v1               true         Event

// staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types.go

// APIResource 结构体源码(定义 kubectl api-resources 的输出字段)
type APIResource struct {
    Name                string               // REST 路径名,如 "pods"(小写复数)
    Namespaced          bool                  // true=命名空间级别,false=集群级别
    Group               string                // API 组,如 "apps"、"networking.k8s.io"
    Version             string                // API 版本,如 "v1"、"v1beta1"
    Kind                string               // Kind 名,如 "Pod"、"Deployment"
    ShortNames          []string             // 短名称,如 ["po"] 表示 Pod
    Categories          []string             // 分组别名,如 ["all"] 表示 kubectl get all
    Verbs               []string             // 支持的动词:get、list、create、update、patch、delete、deletecollection
    StorageVersionMask  string
    Subresources        []string             // 子资源,如 ["status"、"scale"]
}

这个输出里每一列都是有含义的:

  • NAME:资源的 REST 名称(Resource),小写复数,如 pods、deployments
  • SHORTNAMES:kubectl 的简写,kubectl get po 等价于 kubectl get pods
  • APIVERSION:完整写法是 Group/Version(core 组省略 Group),这就是 APIVersion 字段的值
  • NAMESPACED:true 表示该资源属于某个命名空间(受命名空间隔离),false 表示集群级别资源(Node、Namespace 等)
  • KIND:对象的类型名,即 YAML 里 kind: 字段的值

从输出中可以看到,Kubernetes 1.36.1 的 API 资源大致分为以下几个层级:

/api/v1  (core 组,核心资源,Pod/Service/ConfigMap...)  →  /apis/apps/v1  (应用管理,Deployment/StatefulSet...)  →  /apis/networking.k8s.io/v1  (网络策略)

core 组(没有组名)是最底层的核心资源,任何 k8s 集群都有;Named Groups(有组名的如 apps、networking.k8s.io)是功能模块化扩展,按需启用。

💡 注意
同一个 Kind(如 HorizontalPodAutoscaler)可能有多个版本并存(hpa/v1、hpa/v2),但 kubectl api-resources 只显示当前 preferred(首选)版本。在 kubectl get hpa -o yaml 里看到的 apiVersion: autoscaling/v2 就是该资源当前的推荐版本。


二、API 元数据类型:TypeMeta 与 ObjectMeta

2.1 TypeMeta — 资源的身份标签

TypeMeta 是最简单的元数据类型,它只有两个字段,被**内嵌**到所有 k8s 资源结构体中。

// staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types.go

type TypeMeta struct {
    // Kind 是该对象所代表的 REST 资源的名称
    Kind string `json:"kind,omitempty" protobuf:"bytes,1,opt,name=kind"`
    // APIVersion 是该对象所表示的版本化模式
    APIVersion string `json:"apiVersion,omitempty" protobuf:"bytes,2,opt,name=apiVersion"`
}

当我们写一个 Deployment YAML 时,开头往往是这样的:

$ kubectl api-resources -v 10

apiVersion: apps/v1       # APIVersion = apps/v1
kind: Deployment          # Kind = Deployment

Kind 告诉 API 服务器这是"什么类型的资源";APIVersion 告诉它用哪个版本的模式来解析这个对象。两者组合就是 GVK(Group-Version-Kind)。

2.2 ObjectMeta — 资源的身份证

ObjectMeta 包含了 Kubernetes 资源的"身份信息"——几乎所有你想在 kubectl get 时看到的元数据都来自这里。

// staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types.go

type ObjectMeta struct {
    Name                       string                 // 资源名称,namespace 内唯一
    GenerateName               string                 // 前缀,系统自动生成唯一名称
    Namespace                  string                 // 所属命名空间(cluster 级资源无此字段)
    UID                        types.UID              // 全局唯一 ID(UUID)
    ResourceVersion            string                 // 乐观锁版本号,用于并发控制
    Generation                 int64                  // 代际号,每次 spec 变更递增
    CreationTimestamp          metav1.Time            // 创建时间
    DeletionTimestamp          *metav1.Time           // 删除时间(优雅删除时填充)
    DeletionGracePeriodSeconds *int64                 // 删除宽限期(秒)
    Labels                     map[string]string      // 标签,键值对,用于筛选
    Annotations                map[string]string      // 注解,非标识性元数据
    OwnerReferences           []OwnerReference       // 所有者引用(级联删除用)
    Finalizers                []string               // 终结器,防止资源被意外删除
}

ObjectMeta 里最核心的字段是 ResourceVersion(乐观锁)和 UID(全局唯一标识)。ResourceVersion 尤其重要——当你用 kubectl apply 更新一个资源时,kubectl 会在请求头里带上当前的 ResourceVersion,如果和服务器端不一致(说明资源在你读取之后被其他人修改过),服务器会返回 409 Conflict,这就是 k8s 的乐观并发控制机制。

💡 注意
Labels 和 Annotations 都是 map[string]string,但用途不同。Labels 是给 k8s 内部筛选用的(如 nodeSelector、Service 的 selector);Annotations 则用于存放第三方工具或人类可读的额外信息(如最后一次修改时间、作者信息)。


三、核心 API 资源类型

3.1 Pod — 原子调度单元

Pod 是 Kubernetes 的原子调度单元。一个 Pod 里可以包含一个或多个共享网络栈和存储卷的容器(容器之间通过 localhost 互访)。

// staging/src/k8s.io/api/core/v1/types.go

type Pod struct {
    metav1.TypeMeta   `json:",inline"`
    metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
    // Spec 定义 Pod 的期望行为
    Spec PodSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`
    // Status 是 Pod 最近一次观测到的状态
    Status PodStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
}

Spec 里包含容器定义(镜像、端口、资源限制、环境变量、健康检查等);Status 里包含当前 Phase(Pending / Running / Succeeded 等)、容器状态、Pod IP 等实时信息。

3.2 Service — 微服务的访问入口

Service 为 Pod 提供稳定的访问入口。即使后端 Pod 被重启、扩缩容,Service 的 ClusterIP 保持不变,通过 label selector 自动追踪后端 Pod 的变化。

// staging/src/k8s.io/api/core/v1/types.go

type Service struct {
    metav1.TypeMeta   `json:",inline"`
    metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
    Spec   ServiceSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`
    Status ServiceStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
}

Service 的 Spec 里最核心的是 Selector(标签选择器)和 Ports(端口映射)。Selector 告诉 Kube-Proxy 要把流量转发给哪些 Pod;Ports 定义监听的端口(ClusterIP + NodePort + LoadBalancer 三种类型)。

3.3 Deployment — 声明式更新

Deployment 是更高层的抽象,它管理 ReplicaSet,而 ReplicaSet 再管理 Pod。这样设计的好处是:Deployment 可以管理多版本的 ReplicaSet,支持滚动更新和回滚。

// staging/src/k8s.io/api/apps/v1/types.go

type Deployment struct {
    metav1.TypeMeta   `json:",inline"`
    metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
    Spec   *DeploymentSpec   `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`
    Status *DeploymentStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
}

type DeploymentSpec struct {
    Replicas                *int32                    // 期望副本数
    Selector                *metav1.LabelSelector     // 管理哪些 Pod(通过标签)
    Template                v1.PodTemplateSpec        // Pod 模板(定义容器规格)
    Strategy                DeploymentStrategy        // 更新策略(RollingUpdate / Recreate)
    MinReadySeconds         int32                     // 多久后视为 Ready
    RevisionHistoryLimit    *int32                    // 保留多少历史版本(用于回滚)
    Paused                  bool                      // 暂停更新
    ProgressDeadlineSeconds *int32                    // 多久没进展视为失败
}

Strategy 字段定义了更新策略:RollingUpdate 会逐步替换旧 Pod(默认策略),Recreate 会先删除所有旧 Pod 再创建新的(会造成短暂不可用)。

3.4 其他常见资源一览

Kubernetes 1.36.1 内置了数十种 API 资源类型,下面按功能分类整理:

API 组资源类型用途
core / v1 Pod、Service、ConfigMap、Secret、
Node、Namespace、PV、PVC
集群基础设施
apps / v1 Deployment、StatefulSet、DaemonSet、ReplicaSet 有状态/无状态应用管理
networking.k8s.io / v1 Ingress、NetworkPolicy 网络入口与隔离策略
rbac.authorization.k8s.io / v1 Role、ClusterRole、RoleBinding、ClusterRoleBinding 权限控制
batch / v1 Job、CronJob 批处理任务调度
autoscaling / v1 HorizontalPodAutoscaler 自动扩缩容
policy / v1 PodDisruptionBudget 自愿中断保护
storage.k8s.io / v1 CSIDriver、CSINode、StorageClass 存储编排

四、API 机制核心类型:Scheme 与 GVK/GVR

4.1 Group-Version-Kind-Resource(GVK/GVR)— 四元组的完整身份体系

在 Kubernetes 中,定位一个 API 资源需要四个信息,这四个信息组合起来叫四元组。我们在 YAML 里写下的每个资源,背后都对应着这四个维度的精确定位。

// staging/src/k8s.io/apimachinery/pkg/runtime/schema/group_version.go

// GroupVersion = "group/version",标识一个 API 版本
type GroupVersion struct {
    Group   string  // 组名,如 "apps"(core 组为空字符串)
    Version string  // 版本,如 "v1"
}

// GVK = Group + Version + Kind,用于在内存/序列化中标识对象类型
type GroupVersionKind struct {
    Group   string
    Version string
    Kind    string  // 单数、首字母大写,如 "Pod"、"Deployment"
}

// GVR = Group + Version + Resource,用于在 HTTP REST API 中定位资源
type GroupVersionResource struct {
    Group    string
    Version  string
    Resource string  // 小写复数,如 "pods"、"deployments"
}

用一个 Deployment 的 YAML 来对照理解:

$ kubectl api-resources -v 10

apiVersion: apps/v1        # → Group="apps", Version="v1"
kind: Deployment            # → Kind="Deployment"
metadata:
  name: my-app              # → Resource="deployments"(Kind 变复数小写)
  namespace: default
spec:
  replicas: 3

GVK vs GVR 的区别在于使用场景:

概念用途Deployment 示例
GVK 序列化/反序列化:告诉程序"这个 YAML 描述的是什么 Go 类型" apps/v1 + Deployment
GVR HTTP 路径:用于实际发送 REST 请求到 API Server apps/v1 + deployments
API 路径 完整 URL:Group + Version + Resource + Namespace /apis/apps/v1/namespaces/default/deployments

core 组特殊情况:core 组(Pod、Service、ConfigMap 等)的 Group 为空字符串,因此它们的 apiVersion 直接是 v1(而非 core/v1),REST 路径走 /api/v1/(而非 /apis//v1/)。这就是 core 组也叫"内置 API 组"的原因。

回过头看 kubectl api-resources -v 10 的输出,它实际上就是遍历 API Server 注册的所有 GVR,以表格形式展示。每个资源名的 REST 路径、是否命名空间级别、支持哪些操作(Verbs),都来自 APIResource 结构体。Kind 到 Resource 的映射由 Kubernetes 内部规则自动生成(通常是 Kind 首字母小写再变复数,但 RoleBinding 这类有大小写变化的除外)。

GVK 和 GVR 的映射由 API Server 自动维护:给定 GVK,Scheme 可以推导出对应的 GVR(REST 路径);反过来,给定 GVR,API Server 也能查到对应的 GVK 和 ShortNames。这就是为什么你用 kubectl 操作资源时,只需要知道短名称(如 po、deploy),k8s 就能正确找到对应的资源。

4.2 Scheme — 类型注册表

Scheme 是 Kubernetes 的"类型注册表",负责在 Go 类型和版本化 API 之间建立双向映射:

  • GVK → Go Type:知道"这是 apps/v1 Deployment",就知道该用哪个 Go 结构体来解析 YAML
  • Go Type → GVK:知道"有这个 Go 结构体",就知道它的 APIVersion 和 Kind

// staging/src/k8s.io/apimachinery/pkg/runtime/scheme.go

type Scheme struct {
    // GVK → Type:给定版本和名字,找到对应的 Go 类型
    gvkToType map[schema.GroupVersionKind]reflect.Type
    // Type → GVK:给定 Go 类型,找到所有已注册它的版本
    typeToGVK map[reflect.Type][]schema.GroupVersionKind
    // 未版本化类型:在任何组/版本下转换都不经过转换函数
    unversionedTypes map[reflect.Type]schema.GroupVersionKind
    // 默认值函数:为某类型提供默认值的函数
    defaulterFuncs map[reflect.Type]func(interface{})
    // 验证函数:为某类型提供校验逻辑的函数
    validationFuncs map[reflect.Type]func(...) field.ErrorList
    // 转换器:存储所有已注册的转换函数
    converter *conversion.Converter
    // 版本优先级:记录同一组的各版本注册顺序
    versionPriority map[string][]string
    observedVersions []schema.GroupVersion
}

在 Kubernetes 中,每条注册类型调用形如 `scheme.AddKnownTypesWithValidationGVK(gvk, true, &Pod{})`,将自己声明的类型注册到全局 Scheme 中。API Server 启动时加载所有内置类型,controller-manager 等组件则通过 client-go 中的 Scheme 来完成序列化。

Scheme 还有一个重要作用是"版本转换"。当 API 从 v1beta1 升级到 v1 时,Scheme 知道哪些字段需要怎么转换,确保新旧版本之间的兼容性。这是 Kubernetes API 版本管理的核心机制。


五、kubectl api-resources 与 API 全景图

5.1 kubectl api-resources — 一张图看清全集群 API

光看源码定义还不够直观,Kubernetes 提供了一个命令可以一次性看清集群中所有已注册的 API 资源。`-v 10` 会输出详细的对接信息,包括每个资源的 Group、Version、Kind、Shortnames、Namespaced(是否命名空间级别)等关键元数据。

$ kubectl api-resources -v 10

NAME                              SHORTNAMES   APIVERSION                    NAMESPACED   KIND
bindings                                      v1                              true         Binding
configmaps                       cm           v1                              true         ConfigMap
namespaces                       ns           v1                              false        Namespace
nodes                            no           v1                              false        Node
persistentvolumeclaims           pvc          v1                              true         PersistentVolumeClaim
persistentvolumes                pv           v1                              false        PersistentVolume
pods                             po           v1                              true         Pod
services                         svc          v1                              true         Service
...
daemonsets                       ds           apps/v1                         true         DaemonSet
deployments                      deploy       apps/v1                         true         Deployment
replicasets                      rs           apps/v1                         true         ReplicaSet
statefulsets                     sts          apps/v1                         true         StatefulSet
ingresses                        ing          networking.k8s.io/v1            true         Ingress
networkpolicys                   netpol       networking.k8s.io/v1            true         NetworkPolicy
roles                                        rbac.authorization.k8s.io/v1   true         Role
clusterroles                                  rbac.authorization.k8s.io/v1   false        ClusterRole
horizontalpodautoscalers          hpa          autoscaling/v1                 true         HorizontalPodAutoscaler
jobs                                           batch/v1                       true         Job
cronjobs                           cj           batch/v1                       true         CronJob
poddisruptionbudgets              pdb          policy/v1                      true         PodDisruptionBudget
leases                                        coordination.k8s.io/v1         true         Lease
csidrivers                                    storage.k8s.io/v1              false        CSIDriver
storageclasses                   sc           storage.k8s.io/v1              false        StorageClass
events                           ev           events.k8s.io/v1               true         Event

5.2 APIResource 结构体 — 每一列的含义

kubectl api-resources 的每一列都对应 APIResource 结构体中的一个字段:

// staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types.go

type APIResource struct {
    Name               string               // REST 路径名(小写复数),如 "pods"、"deployments"
    Namespaced         bool                  // true=命名空间级别,false=集群级别
    Group              string                // API 组,如 "apps"、"networking.k8s.io"(core 组为空)
    Version            string                // 首选版本,如 "v1"
    Kind               string               // Kind 名,如 "Pod"、"Deployment"
    ShortNames         []string             // 短名称,如 ["po"] 对应 pods
    Categories         []string             // 分组别名,如 ["all"] 对应 kubectl get all
    Verbs              []string             // 支持的操作集:get、list、create、update、patch、delete、deletecollection
    StorageVersionMask string
    Subresources       []string             // 子资源,如 ["status"、"scale"]
}

结合 kubectl api-resources -v 10 的输出,逐列解读:

列名对应字段Pod 示例值说明
NAME Name pods REST 路径的最后一段,小写复数
SHORTNAMES ShortNames po kubectl get po 等价于 kubectl get pods
APIVERSION Group/Version v1 core 组省略 Group;其他组格式为 group/version
NAMESPACED Namespaced true true=属于某命名空间;false=集群级别(Node、Namespace 等)
KIND Kind Pod YAML 里 kind: 字段的值,单数、首字母大写

5.3 API 全景图 — 三层结构一览

Kubernetes 1.36.1 的 API 资源按三层路径组织:

/api/v1  (core 组,核心资源:Pod / Service / ConfigMap / Secret / Node...)  →  /apis/{group}/{version}  (Named Groups:apps / networking.k8s.io / rbac.authorization.k8s.io / batch / autoscaling / policy / coordination / storage.k8s.io / events...)

core 组(无组名)是最底层的核心资源,任何 k8s 集群都有;Named Groups(有组名)是功能模块化扩展,按需启用。从 kubectl api-resources 输出可以看到,越往下(autoscaling、policy、coordination、events)越是高级/垂直场景。

Verbs 列值得特别关注:并非所有资源都支持完整的 CRUD 操作。例如,bindings 只支持 create(Pod 与 PVC 的绑定是单向写入操作);events 通常只支持 list 和 get(事件是只读的)。这决定了 kubectl 能对这个资源做什么操作。

💡 注意
同一个 Kind(如 HorizontalPodAutoscaler)可能有多个版本并存(hpa/v1、hpa/v2),但 kubectl api-resources 只显示当前 preferred(首选)版本。在 kubectl get hpa -o yaml 里看到的 apiVersion: autoscaling/v2 就是该资源当前的推荐版本。


六、客户端编程:Informer 与 Workqueue

6.1 SharedInformer — 集群状态监听器

在 Kubernetes 中写一个控制器(Controller),最核心的需求就是"监听集群状态变化"。SharedInformer 就是做这件事的——它持续从 API Server 拉取资源变更通知(Add/Update/Delete),并维护一份本地缓存(Store)。

// staging/src/k8s.io/client-go/tools/cache/shared_informer.go

type SharedInformer interface {
    AddEventHandler(handler ResourceEventHandler) (ResourceEventHandlerRegistration, error)
    AddEventHandlerWithResyncPeriod(handler ResourceEventHandler, resyncPeriod time.Duration)
    RemoveEventHandler(handle ResourceEventHandlerRegistration) error
    GetStore() Store                              // 本地缓存(只读)
    GetController() Controller
    Run(stopCh

"Shared" 是这个组件名字里的关键词——多个控制器可以共享同一个 Informer 实例,共用同一份缓存和 Watch 连接,大大减少对 API Server 的压力。

💡 注意
写控制器时,必须在启动时等待 HasSynced() 返回 true 后才能开始处理,否则会读到空的本地缓存,导致控制器认为集群里没有任何资源。

6.2 Workqueue — 事件缓冲与去重

Informer 负责监听,Workqueue 负责缓冲。Informer 的事件处理器(ResourceEventHandler)把变化的 key(如 "default/my-pod")放入 Workqueue,worker 从队列里取出来执行实际的 reconcile 逻辑。

// staging/src/k8s.io/client-go/util/workqueue/queue.go

// 泛型接口,所有 Workqueue 类型都实现这个基础接口
type TypedInterface[T comparable] interface {
    Add(item T)              // 放入队列
    Len() int                // 队列长度
    Get() (item T, ok bool)  // 取出一个 item(使用后必须调用 Done)
    Done(item T)             // 标记 item 处理完成
    ShutDown()               // 关闭队列
    ShuttingDown() bool       // 是否正在关闭
}

// 带延迟功能的队列:可以延迟添加(等一会儿再处理)
type TypedDelayingInterface[T comparable] interface {
    TypedInterface[T]
    AddAfter(item T, duration time.Duration)  // 延迟 duration 后再 Add
}

Kubernetes 的 Workqueue 是"去重队列"——同一个 key 无论 Add 多少次,都只会在队列里出现一次。即使用户快速更新了三次,worker 也只会处理最后一次状态。这种设计既保证了可靠性,又避免了重复处理。

6.3 完整的控制器模式

把 Informer + Workqueue 组合起来,就是 Kubernetes 控制器的标准模式:

API Server  →  SharedInformer  →  Workqueue  →  Worker (Reconcile)  →  API Server 更新

  1. 1Informer 持续 watch API Server,将变化事件写入 Workqueue
  2. 2Worker 从队列取出 key,从 Informer 的本地缓存读取最新状态
  3. 3对比期望 Spec 和观测到的 Status,计算出需要采取的行动
  4. 4调用 client-go 的写接口,更新 API Server 中的资源状态
  5. 5完成后调用 Done() 标记队列 item 处理完毕

七、常见问题

以下是学习 Kubernetes API 数据结构时最常遇到的问题:

▼ Q: Kind 和 Resource 有什么区别?

A: Kind 是 API 层面的对象类型名(单数形式,如 Pod),Resource 是 HTTP REST 路径中的资源名(小写复数形式,如 pods)。两者的映射关系由 API Server 定义,通常 Kind 首字母小写再加 s 就是 Resource,但有例外(如 Deployment → deployments)。


▼ Q: 同一个资源(如 Deployment)有多个 API 版本(v1、v1beta1),客户端应该用哪个?

A: 优先使用 stable(稳定)版本,即不带 beta/alpha 后缀的版本(如 apps/v1)。beta 版本可能在未来被废弃。使用 stable 版本能保证最大程度的兼容性。Kubernetes API 版本的稳定顺序为:Alpha → Beta → GA(稳定)。


▼ Q: ResourceVersion 在并发更新时是怎么起作用的?

A: 这是 Kubernetes 的乐观并发控制机制。kubectl get 资源时会获取当前的 ResourceVersion,在 Update/Patch 请求中带上这个版本号。如果在此期间另一个客户端也更新了同一资源,API Server 的 ResourceVersion 会递增,版本不匹配会返回 HTTP 409 Conflict,客户端需要重新 GET 最新数据后重试。


▼ Q: OwnerReferences 和 Finalizers 分别是什么?

A: OwnerReferences 建立了"父子资源"关系。当删除一个 Deployment 时,k8s 会自动删除它管理的所有 ReplicaSet 和 Pod(级联删除),就是因为 OwnerReferences 的存在。Finalizers 则是在资源上注册"钩子"——即使你发出删除请求,带 Finalizer 的资源会进入"Terminating"状态,直到所有 Finalizer 被手动移除。这常用于确保清理逻辑(如持久化数据)执行完毕后再真正删除资源。


▼ Q: 写控制器时,Informer 的 HasSynced() 到底要等多久?

A: HasSynced() 返回 true 之前,本地缓存是空的,GetStore().Get() 会返回 nil。如果你跳过这个检查直接处理,会导致"控制器认为集群是空的"这种 bug。正确做法是在 main 函数中等待 factory.WaitForCacheSync(stopCh) 返回所有 true 后,再启动 worker goroutine。


八、总结

经过全文学习,我们从源码层面理解了 Kubernetes API 的核心数据结构:

  1. 1TypeMeta + ObjectMeta:所有 k8s 资源的共同基底,前者定义 API 身份(Kind/APIVersion),后者定义资源身份证(Name/UID/ResourceVersion)
  2. 2Spec/Status 分离:声明式 API 的核心,你描述期望状态,控制器负责让实际状态逼近它
  3. 3GVK/GVR + Scheme:四元组(Group/Version/Kind/Resource)是 k8s API 的完整身份体系,GVK 用于内存标识,GVR 用于 HTTP 路径,Scheme 负责双向映射
  4. 4APIResource + kubectl api-resources:这是查看全集群 API 注册信息的入口,每列对应 APIResource 结构体字段,NAMESPACED 区分集群级/命名空间级资源,Verbs 定义支持的 CRUD 操作
  5. 5APIVersion 演进:Kubernetes API 版本分 alpha → beta → GA 三阶段,core 组(/api/v1)最稳定,Named Groups(/apis/{group}/{version})按功能模块化演进,Scheme 的版本转换机制保证跨版本兼容性
  6. 6SharedInformer + Workqueue:客户端控制器的核心模式,Informer 监听变化并维护本地缓存,Workqueue 做事件去重和缓冲,Worker 执行 reconcile 循环

理解这些核心数据结构之后,阅读 Kubernetes 源码中的控制器实现(如 kube-controller-manager)会变得轻松很多。建议结合 Kubernetes 官方文档中的"Concept"部分,对照源码中的实际类型定义,加深理解。

🌟 实用技巧
想快速查看某个 k8s 资源的完整字段定义?直接在代码库里搜索对应类型即可。例如:找 DeploymentSpec 的定义就搜索 "type DeploymentSpec struct",源码注释里往往包含了比官方文档更详细的字段说明。

相关阅读:
   • Kubernetes 官方 GitHub 仓库
   • Kubernetes 核心 API 类型定义(v1/types.go)
   • apimachinery 元数据类型定义
   • Kubernetes 开发指南(官方)


Kubernetes 1.36.1 核心 API 数据结构全解 · 基于 staging/src/k8s.io/api 及 apimachinery 源码解析