K8S - API 对象

在 Kubernetes 集群中,用户和 Kubernetes 组件都通过 Kubernetes API 操作对象与集群进行交互。

这些对象代表了整个集群的配置。它们包括:

  1. 在集群中运行的应用程序
  2. 配置
  3. 在集群内部或外部暴露它们的负载均衡器
  4. 底层服务器和这些应用程序使用的存储
  5. 用户和应用程序的安全权限
  6. 许多其他细节基础设施。

image-20221030105203659

API 概述

Kubernetes API 是与集群交互的中心。

Kubernetes API 是 HTTP RESTful API。Kubernetes API 的 state 作为一种资源,供你进行 CURD 操作。

正是这些资源(Object)代表了整个集群的配置。因此,将应用程序部署到集群中的 集群管理员 和 工程师,通过操作这些对象来影响配置。

对象(Object) 和 资源(Resource) 的区别

RESTful API 中的基本概念是资源,每个资源都分配有唯一标识它的 URI 或统一资源标识符。

例如,在 Kubernetes API 中,应用程序部署由部署资源表示。

集群中所有部署的集合是在/api/v1/deployments. 当您使用该 GET 方法向此 URI 发送 HTTP 请求时,您会收到一个列出集群中所有部署实例的响应。

每个单独的部署实例也有自己唯一的 URI,通过它可以对其进行操作。因此,单个部署作为另一个 REST 资源公开。您可以通过向资源 URI 发送 GET 请求来检索有关部署的信息,并且可以使用PUT请求对其进行修改。

image-20221030110440073

因此,一个对象可以通过多个资源公开。如图所示:

  • 当您查询 deployments 资源时(/apis/apps/v1/namespces/myns/deployments),命名的 Deployment 对象实例 mydeploy 作为集合元素返回
  • 当您直接查询单个资源 URI 时(/apis/apps/v1/namespces/myns/deployments/mydeploy),则作为单个对象返回。

在某些情况下,资源根本不代表任何对象。

这方面的一个例子是:

Kubernetes API 允许客户端验证主体(人或服务)是否被授权执行 API 操作的方式。这是通过向资源提交POST请求到 /apis/authorization.k8s.io/v1/subjectaccessreviews 来完成的。接口响应表明了主体是否被授权了,执行请求正文中指定的操作。这里的关键是 POST 请求没有创建任何对象。

上述例子表明,资源 和 对象 并不是完全相同的。如果你熟悉关系型数据库,你可以把 资源 和 对象 比作 视图 和 表。资源 就是你与对象进行交互的 “视图”。

API对象的主要组成部分

大多数 Kubernetes API 对象包含以下四个部分:

  1. 类型元数据(Type Metadata)。它指定了对象的类型,类型所属的组,和 API 版本
  2. 对象元数据(Object Metadata)。它持有实例的基本信息。比如:名称,创建时间,对象所有者,以及一些标识信息。对象元数据的信息对于所有的对象类型都是相同的。
  3. 期望(Spec)。Spec 是你期望这个对象到达的状态。不同类型的对象有不同的字段。比如对于 Pod 来说,Spec 指定了 Pod 的 containers、storage volume 和 其他与其操作相关的信息的部分。
  4. 状态(Status)。它包含了当前对象的实际状态。比如对于 Pod 来说,它标记了,每个 container 的状态、Pod 的 IP 地址、运行在哪个节点,以及暴露 Pod 上正在发生的事情。

image-20221030113703763

对象的 Spec 和 Status

正如您在上图中可能已经注意到的那样,对象的两个最重要的部分是 Spec 和 Status 部分。您可以使用 Spec 指定对象的所需状态,并从 Status 部分读取对象的实际状态。所以,您是编写 Spec 并读取 Status 的人。

但是,又是什么东西读取 Spec 并写入 Status 呢?

Kubernetes 控制平面运行多个称为 Controller(控制器) 的组件,Controller(控制器) 用于管理您创建的对象。每个 Controller(控制器) 通常只负责一种对象类型。例如,Deployment controller(部署控制器) 管理部署对象。

如图所示,控制器的任务是从对象的 Spec 部分读取所需的对象状态,执行实现此状态所需的操作,并通过写入 Status 报告对象的实际状态。

image-20221030113846720

本质上,您通过创建和更新 API 对象来告诉 Kubernetes 它必须做什么。Kubernetes 控制器使用相同的 API 对象来告诉你他们做了什么以及他们的工作状态。

并非所有对象都有 Spec 和 Status

所有 Kubernetes API 对象都包含两个元数据(Type Metadata & Object Metadata),但并非所有对象都有 Spec 和 Status。那些没有 Spec 和 Status 的对象,通常只包含静态数据,并且没有相应的控制器,因此没有必要区分对象的 期望状态(Spec) 和 实际状态(Status)。

此类对象的一个示例是 Event Object(Event 对象),它由各种控制器创建。 Event Object 用来提供,控制器正在管理的对象当前正在发生的事件的附加信息。


好好学习,天天向上