K8S - API 对象

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

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

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

image-20221030105203659

API 概述

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

Kubernetes API 是 HTTP RESTful API。Kubernetes APIstate 作为一种资源,供你进行 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 的 containersstorage volume 和 其他与其操作相关的信息的部分。
  4. 状态(Status)。它包含了当前对象的实际状态。比如对于 Pod 来说,它标记了,每个 container 的状态、Pod 的 IP 地址、运行在哪个节点,以及暴露 Pod 上正在发生的事情。

image-20221030113703763

对象的 Spec 和 Status

正如您在上图中可能已经注意到的那样,对象的两个最重要的部分是 SpecStatus 部分。您可以使用 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),但并非所有对象都有 SpecStatus。那些没有 SpecStatus 的对象,通常只包含静态数据,并且没有相应的控制器,因此没有必要区分对象的 期望状态(Spec) 和 实际状态(Status)。

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


好好学习,天天向上