Kubernetes API
Getting familiar with the Kubernetes API
-
Kubernetes API是一种基于HTTP的RESTful API,其通过资源来表征系统状态,用户可以使用POST、GET、PUT/PATCH或DELETE等标准HTTP方法对这些资源执行CRUD操作(创建、读取、更新、删除)。
-
RESTful API 的核心概念是资源,每个资源都被分配一个统一资源标识符(URI)用于唯一标识。
-
资源和对象类型分别类比为视图和表。资源是您与对象进行交互的视图窗口。
-
在向Kubernetes API服务器发起资源GET请求时,服务器会以结构化文本形式返回对象。默认数据模型采用JSON格式,但也可指定服务器返回YAML格式。
-
大多数API对象清单都包含四个核心部分:
- 类型元数据(Type Metadata)
- 记录关于对象类型的基本信息,包括对象种类、所属资源组以及使用的API版本。
- 对象元数据(Object Metadata)
- 存储对象实例的基础信息,涵盖名称、创建时间、所属者等标识字段。该部分字段在所有对象类型中保持统一。
- 规格定义(Spec)
- 用于声明对象的期望状态。该部分内容因对象类型而异:对于Pod而言,这里定义了容器配置、存储卷及其他运行相关参数。
- 状态信息(Status)
- 记录对象的实际运行状态。以Pod为例,该部分呈现Pod运行状况、容器状态、IP地址、所在节点等实时运行信息。
- 类型元数据(Type Metadata)
-
通过Spec来定义对象的期望状态,并通过Status来读取对象的实际状态。
-
Kubernetes控制平面运行的一系列控制器读取Spec并写入Status。这些控制器负责管理您创建的对象,每个控制器通常只管理一种对象类型。
-
控制器的工作机制是:从对象的Spec章节读取期望状态,执行实现该状态所需的操作,最后通过写入Status章节来反馈对象的实际状态。
-
通过创建和更新API对象来向Kubernetes下达指令,而Kubernetes控制器则通过相同的API对象向您反馈执行状态和工作结果。
-
大多数对象类型都关联着对应的控制器,正是这些控制器负责读取对象的Spec规格并更新Status状态。
-
虽然所有Kubernetes API对象都包含两类元数据,但那些仅存储静态数据且没有对应控制器的对象,就无需区分期望状态与实际状态。
Examining an object’s individual properties
| 命令 | 作用 |
|---|---|
kubectl get node |
查询所有Node对象 |
kubectl get node <node-name> -o yaml |
显示对象清单 |
kubectl proxy |
为Kubernetes API服务器创建一个本地代理,允许通过localhost访问API |
kubectl explain <object-field> |
显示指定对象字段的详细信息 |
kubectl explain <object-field> --recursive |
显示对象的完整结构(即包含所有字段的完整层级列表但不含描述) |
kubectl describe node <node-name> |
显示节点的详细信息,包括状态、事件和资源使用情况等 |
- 节点对象与其他对象略有不同,它们通常由运行在集群节点上的节点代理程序Kubelet创建,而非由用户直接创建。
- 当向集群添加新机器时,Kubelet会通过创建代表该主机的节点对象完成节点注册。此后,用户可对节点规约(Spec)部分的(部分)字段进行编辑。
kubctl proxy开启代理后。- http://127.0.0.1:8001/api/<版本号>/nodes -> kubectl get node
- http://127.0.0.1:8001/api/<版本号>/nodes/ -> kubectl get node
- 若只需查看对象的部分结构,使用 jq/ yq 工具会非常便捷
- kubectl get node <节点名称> -o json | jq .status.conditions
- kubectl get node <节点名称> -o yaml | yq .status.conditions
Observing cluster events via Event objects
- 当控制器执行协调任务时——即根据对象规约字段中定义的期望状态来调整实际状态——会生成相应事件以记录执行操作。
- 事件存在两种类型:常规事件与警告事件。
- 与其他API对象不同,每个Event对象在创建一小时后会自动删除,以此减轻Kubernetes底层数据存储etcd的负载压力。
kubectl get event查询event。kubectl get event -o wide查看完整信息。kubectl get event --field-selector type=<事件类型>查询特定类型事。
| 字段名称 | 说明 |
|---|---|
| Name | 事件对象实例名称(仅需通过API检索特定对象时使用) |
| Type | 事件类型(Normal 常规 / Warning 警告) |
| Reason | 事件触发原因的机器可读描述 |
| Source | 事件上报组件(通常为控制器) |
| Object | 事件关联对象(例如 node/xyz) |
| Sub-object | 事件关联子对象(例如 Pod 中的特定容器) |
| Message | 面向用户的事件描述 |
| First seen | 事件首次发生时间(注意事件对象会定期清理,该时间可能非实际首次发生时间) |
| Last seen | 事件最近发生时间(重复事件的时间标记) |
| Count | 事件重复次数(事件计数) |
