在 Kubernetes 集群中,用户和 Kubernetes 组件都通过 Kubernetes API 操作对象与集群进行交互。
这些对象代表了整个集群的配置。它们包括:
Kubernetes API
是与集群交互的中心。
Kubernetes API
是 HTTP RESTful API。Kubernetes API
的 state
作为一种资源,供你进行 CURD 操作。
正是这些资源(Object)代表了整个集群的配置。因此,将应用程序部署到集群中的 集群管理员 和 工程师,通过操作这些对象来影响配置。
RESTful API 中的基本概念是资源,每个资源都分配有唯一标识它的 URI 或统一资源标识符。
例如,在 Kubernetes API 中,应用程序部署由部署资源表示。
集群中所有部署的集合是在/api/v1/deployments
. 当您使用该 GET
方法向此 URI 发送 HTTP 请求时,您会收到一个列出集群中所有部署实例的响应。
每个单独的部署实例也有自己唯一的 URI,通过它可以对其进行操作。因此,单个部署作为另一个 REST 资源公开。您可以通过向资源 URI 发送 GET
请求来检索有关部署的信息,并且可以使用PUT
请求对其进行修改。
因此,一个对象可以通过多个资源公开。如图所示:
deployments
资源时(/apis/apps/v1/namespces/myns/deployments),命名的 Deployment 对象实例 mydeploy
作为集合元素返回在某些情况下,资源根本不代表任何对象。
这方面的一个例子是:
Kubernetes API
允许客户端验证主体(人或服务)是否被授权执行 API 操作的方式。这是通过向资源提交POST
请求到 /apis/authorization.k8s.io/v1/subjectaccessreviews
来完成的。接口响应表明了主体是否被授权了,执行请求正文中指定的操作。这里的关键是 POST
请求没有创建任何对象。
上述例子表明,资源
和 对象
并不是完全相同的。如果你熟悉关系型数据库,你可以把 资源
和 对象
比作 视图
和 表
。资源
就是你与对象进行交互的 “视图”。
大多数 Kubernetes API 对象包含以下四个部分:
Spec
是你期望这个对象到达的状态。不同类型的对象有不同的字段。比如对于 Pod
来说,Spec
指定了 Pod 的 containers
、storage volume
和 其他与其操作相关的信息的部分。Pod
来说,它标记了,每个 container
的状态、Pod
的 IP 地址、运行在哪个节点,以及暴露 Pod
上正在发生的事情。正如您在上图中可能已经注意到的那样,对象的两个最重要的部分是 Spec
和 Status
部分。您可以使用 Spec
指定对象的所需状态,并从 Status
部分读取对象的实际状态。所以,您是编写 Spec
并读取 Status
的人。
但是,又是什么东西读取 Spec
并写入 Status
呢?
Kubernetes 控制平面运行多个称为 Controller(控制器)
的组件,Controller(控制器)
用于管理您创建的对象。每个 Controller(控制器)
通常只负责一种对象类型。例如,Deployment controller(部署控制器)
管理部署对象。
如图所示,控制器的任务是从对象的 Spec
部分读取所需的对象状态,执行实现此状态所需的操作,并通过写入 Status
报告对象的实际状态。
本质上,您通过创建和更新 API 对象来告诉 Kubernetes 它必须做什么。Kubernetes 控制器使用相同的 API 对象来告诉你他们做了什么以及他们的工作状态。
所有 Kubernetes API 对象都包含两个元数据(Type Metadata
& Object Metadata
),但并非所有对象都有 Spec
和 Status
。那些没有 Spec
和 Status
的对象,通常只包含静态数据,并且没有相应的控制器,因此没有必要区分对象的 期望状态(Spec) 和 实际状态(Status)。
此类对象的一个示例是 Event Object(Event 对象)
,它由各种控制器创建。 Event Object
用来提供,控制器正在管理的对象当前正在发生的事件的附加信息。
好好学习,天天向上