K8S-07| Kubernetes 基础架构-核心技术概念和 API 对象
文章目录
【注意】最后更新于 December 19, 2021,文中内容可能已过时,请谨慎使用。
极客时间《云原生训练营》学习笔记。
核心技术概念和 API 对象
API 对象是 Kubernetes 集群中的管理操作单元。 Kubernetes 集群系统每支持一项新功能,引入一项新技术,一定会新引入对应的 API 对象,支持对该功能的管理操作。 每个 API 对象都有四大类属性:
- TypeMeta , 对应如下的 metadata以上的部分, kind / apiversion
- MetaData , 对应如下的 metadata
- Spec , 对应如下的 spec
- Status , 这个是由系统控制器自已决定的, 如第二份code
|
|
|
|
TypeMeta
Kubernetes对象的最基本定义,它通过引入GKV(Group,Kind,Version)模型定义了一个对象的类型。
- Group Kubernetes 定义了非常多的对象,如何将这些对象进行归类是一门学问,将对象依据其功能范围归入不同的分组,比如把支撑最基本功能的对象归入 core 组,把与应用部署有关的对象归入 apps 组,会使这些对象的可维护性和可理解性更高。
- Kind 定义一个对象的基本类型,比如 Node、Pod、Deployment 等。
- Version 社区每个季度会推出一个 Kubernetes 版本,随着 Kubernetes 版本的演进,对象从创建之初到能够完全生产化就绪的版本是不断变化的。与软件版本类似,通常社区提出一个模型定义以后,随着该对象不断成熟,其版本可能会从 v1alpha1 到 v1alpha2,或者到 v1beta1,最终变成生产就绪版本 v1。
Metadata
Metadata 中有两个最重要的属性:Namespace和Name,分别定义了对象的 Namespace 归属及名字,这两个属性唯一定义了某个对象实例。
对于 No Namespace 的对象, Name是全局唯一的
有Namespace的对象, Namespace + Name 是唯一的
Label
顾名思义就是给对象打标签,一个对象可以有任意对标签,其存在形式是键值对。 Label 定义了对象的可识别属性,Kubernetes API 支持以 Label 作为过滤条件查询对象。
- Label 是识别 Kubernetes 对象的标签,以 key/value 的方式附加到对象上。
- key 最长不能 超过 63 字节,value 可以为空,也可以是不超过 253 字节的字符串。
- Label 不提供唯一性,并且实际上经常是很多对象(如 Pods)都使用相同的 label 来标志具 体的应用。
- Label 定义好后其他对象可以使用 Label Selector 来选择一组相同 label 的对象
- Label Selector 支持以下几种方式:
- 等式,如 app=nginx 和 env!=production;
- 集合,如 env in (production, qa);
- 多个 label(它们之间是 AND 关系),如 app=nginx,env=test。
Annotations
Annotation 与 Label 一样用键值对来定义,但 Annotation 是作为属性扩展, 更多面向于系统管理员和开发人员,因此需要像其他属性一样做合理归类。
当你觉得的对象里面的属性不太够用的时候,你可以自定义属性的一个地方,你可以把附加的属性放在这里面。
- Annotations 是 key/value 形式附加于对象的注解。
- 不同于 Labels 用于标志和选择对象,Annotations 则是用来记录一些附加信息,用来辅助应用部署、安 全策略以及调度策略等。
- 比如 deployment 使用 annotations 来记录 rolling update 的状态。
Finalizer
Finalizer 本质上是一个资源锁,Kubernetes 在接收某对象的删除请求时,会检查 Finalizer 是否为空,如果不为空则只对其做逻辑删除,即只会更新对象中的metadata.deletionTimestamp 字段。
比如我在配置里面增加一个 finalizer属性, 它删除时就没有真的删除,只是逻辑删除并有一个删除的时间戳
|
|
ResourceVersion
ResourceVersion 可以被看作一种乐观锁,每个对象在任意时刻都有其 ResourceVersion,当 Kubernetes 对象被客户端读取以后,ResourceVersion 信息也被一并读取。此机制确保了分布式系统中任意多线程能够无锁并发访问对象,极大提升了系统的整体效率。
当多个控制器去访问同一个对象时,这个时候就会去判断当前的ResourceVersion与你的版本号是否一致,不一致就说明你这个边你是基于一个比较旧的数据去改的,这个修改会被拒绝掉,知道我冲突了,这时由控制器来负责说我去获取一次最新的这个状态,然后在这个基础上之上再去做修改,再去重试。
Spec 和 Status
Spec 和 Status 才是对象的核心。
Spec 是用户的期望状态,由创建对象的用户端来定义。
Status 是对象的实际状态,由对应的控制器收集实际状态并更新。
与 TypeMeta 和 Metadata 等通用属性不同,Spec 和 Status 是每个对象独有的。