关于 K8S 的 API 对象,你了解多少?
🎃

关于 K8S 的 API 对象,你了解多少?

常规操作

有问题先问AI(人工智能)

关于 K8S 的 API 对象,我了解到以下内容:
Kubernetes(简称K8S)是一个开源的容器编排和管理平台,它提供了丰富的API对象来管理和操作容器化应用程序。API 对象是 Kubernetes 中的核心概念之一,用于描述和定义 Kubernetes 中的各种资源和组件。
Kubernetes的API对象包括但不限于以下几种:
  1. Pod(容器组):是Kubernetes中最小的可调度和管理的单元,它可以包含一个或多个容器,并共享相同的网络和存储资源。
  1. Service(服务):用于将一组Pod公开为一个网络服务,通过Service可以实现负载均衡、服务发现等功能。
  1. Deployment(部署):用于声明式地定义Pod的创建和管理规范,可以实现应用程序的水平扩展和滚动升级等功能。
  1. ConfigMap(配置映射):用于存储应用程序的配置信息,可以作为环境变量、命令行参数等方式注入到容器中。
  1. Secret(密钥):用于存储敏感数据,如密码、证书等,可以安全地注入到容器中。
  1. Namespace(命名空间):用于在Kubernetes集群中创建逻辑隔离的虚拟集群,不同命名空间中的资源相互独立。
  1. PersistentVolume(持久化存储):用于将持久化存储资源(如磁盘、网络存储等)抽象为独立的对象,并对应用程序提供持久化数据存储的能力。
以上只是 Kubernetes API 对象的一部分,它们共同构成了 Kubernetes 的基础架构和功能组件。通过使用这些 API对象,我们可以灵活地定义和管理我们的容器化应用程序,并实现高可用、弹性伸缩和故障恢复等特性。

很常见的答案

大部分人对上面的信息都有了解。(不知道的话,建议自己再多浏览浏览 K8S 官网)

不知道你们注意到上面答案中写了“包括但不限于”?

第二问:为什么是包括但不限于?

这次就不问 ChanGPT,再问就没我啥事了,开始我的个人理解。
包括但不限于:k8s 对象有很多,多到数不过来。那问题来了。

第三问:为什么会有这么多的对象呢?

主要原因还是 k8s 集群中可以自定义 operator。
operator 这个词就不翻译了,之前有个群友在技术群里提问题,问题的描述基本全是汉语,只有 operator 是英文的。下面另一个群友就问了:“Operator是啥?为啥非得切换输入法用英语?”。从事 k8s 相关,如果不知道 operator 确实有点不太合适。至于为什么这里要用英文,主要原因是没有合适的翻译。

第四问:什么是 operator ?

在 Kubernetes(通常简称为K8s)中,Operator 是一种自定义控制器,用于扩展 Kubernetes 的功能并管理自定义资源。
自定义资源就是 API 对象, API 对象就是 k8s 中的资源

开始正文

没错,现在才是正文,前面只是引一下。

定义

API 对象是 Kubernetes 集群中的管理操作单元。
Kubernetes 集群系统每支持一项新功能,引入一项新技术,一定会新引入对应的 API 对象,支持对该功能的管理操作。每个 API 对象都有四大类属性: • TypeMeta • MetaData • Spec • Status

TypeMeta

Kubernetes对象的最基本定义,它通过引入GKV(Group,Kind,Version)模型定义了一个对象的类型。

Group

Kubernetes 定义了非常多的对象,如何将这些对象进行归类是一门学问,将对象依据其功能范围归入不同的分组,比如把支撑最基本功能的对象归入 core 组,把与应用部署有关的对象归入 apps 组,会使这些对象的可维护性和可理解性更高。

Kind

定义一个对象的基本类型,比如 Node、Pod、Deployment 等。

Version

社区每个季度会推出一个 Kubernetes 版本,随着 Kubernetes 版本的演进,对象从创建之初到能够完全生产化就绪的版本是不断变化的。与软件版本类似,通常社区提出一个模型定义以后,随着该对象不断成熟,其版本可能会从 v1alpha1 到 v1alpha2,或者到 v1beta1,最终变成生产就绪版本 v1。

Metadata

Metadata 中有两个最重要的属性:NamespaceName,分别定义了对象的 Namespace 归属及名字,这两个属性唯一定义了某个对象实例。

Label

顾名思义就是给对象打标签,一个对象可以有任意对标签,其存在形式是键值对(Key/Value)。Label 定义了对象的可识别属性,Kubernetes API 支持以 Label 作为过滤条件查询对象。其他对象可以使用 Label Selector 来选择一组相同 label 的对象。

Annotaition

Annotation 与 Label 一样用键值对来定义,但 Annotation 是作为属性扩展,更多面向于系统管理员和开发人员,因此需要像其他属性一样做合理归类。

Finalizer

Finalizer 本质上是一个资源锁,Kubernetes 在接收某对象的删除请求时,会检查 Finalizer 是否为空,如果不为空则只对其做逻辑删除,即只会更新对象中的metadata.deletionTimestamp 字段。

ResourceVersion

ResourceVersion 可以被看作一种乐观锁,每个对象在任意时刻都有其ResourceVersion,当 Kubernetes 对象被客户端读取以后,ResourceVersion信息也被一并读取。此机制确保了分布式系统中任意多线程能够无锁并发访问对象,极大提升了系统的整体效率。

Spec 和 Status

Spec 和 Status 才是对象的核心 ,主要通过这两个字段体现 k8s 的声明式。
Spec 是用户的期望状态,由创建对象的用户端来定义。
Status 是对象的实际状态,由对应的控制器收集实际状态并更新。

注意

TypeMeta 和 Metadata 是通用属性,Spec 和 Status 是每个对象独有的。

常见对象及其分组

notion image
我刚接触 k8s 时,看这个图的时候直接就发懵了。这里面的对象怎么这么多,它们都是做什么的?都需要背住吗?
我个人觉得没必要背住,这些 API 对象都是遵循 k8s 对象的设计方式,只需要在使用时查看对应的 spec 和 status 即可。在有互联网的情况下可以通过官方文档查询每个对象的字段含义。在没有互联网的情况下,可以通过代码查询对应字段的含义,而且在一些 k8s 发行版中都会有字段的信息的描述。

正文结束了

我再描述一下发行版 web 控制台代码中怎么查看 API 对象的字段含义。查看 pod 这个对象。

发行版 web 控制台查看

演示环境为基于OKD开源项目发行的企业版(统信有雀)
notion image
notion image
下面的查看详情可以进一步的展示每个字段的含义,大部分的 k8s 发行版都有类似功能,如果没有的话,它肯定不是一个好的发行版。

k8s 代码中查看

IDE: Goland (个人正版)
notion image
notion image
PodSpec 结构体内的字段太多了,我就不截取了。我们可以通过每个字段上的描述进行使用。

资源来源

  • 孟凡杰老师的PPT: 来源极客时间