应用编排与管理:核心原理

一、资源元信息

1、kubernetes资源对象

Kubernetes 的资源对象组成:
Spec:用来描述期望的状态
Status:用来描述观测到的状态
元数据:

Labels:用来识别资源的标签
Annotations:用来描述资源的注解
OwnerReference:用来描述多个资源之间相互关系

2、Labels

第一个元数据,也是最重要的一个元数据:资源标签。
资源标签是一种具有标识型的 Key:Value 元数据。
举个例子:

environment:production
release:stable
app.kubernetes.io/version:5.6.21
failure-domain.beta.kubernetes.io/region:cn-hangzhou

前三个标签都打在pod对象上,分别标识了对应的应用环境、发布的成熟度和应用的版本;
最后一个标签打在 Node 对象上,还在域名前增加了版本的标识 beta 字符串。

作用:标签主要用来筛选资源组合资源,可以使用类似于 SQL 查询 select,来根据 Label 查询相关的资源。

3、Selector

最常见的 Selector 就是相等型 Selector。
假设系统中有四个 Pod,每个 Pod 都有标识系统层级和环境的标签,我们通过 Tie:front 这个标签,可以匹配左边栏的 Pod,相等型 Selector 还可以包括多个相等条件,多个相等条件之间是逻辑”与“的关系。

在这里插入图片描述
在刚才的例子中,通过 Tie=front,Env=dev 的Selector,我们可以筛选出所有 Tie=front,而且 Env=dev 的 Pod,也就是下图中左上角的 Pod。另外一种 Selector 是集合型 Selector,在例子中,Selector 筛选所有环境是 test 或者 gray 的 Pod。

除了 in 的集合操作外,还有 notin 集合操作,比如 tie notin(front,back),将会筛选所有 tie 不是 front 且不是 back 的 Pod。另外,也可以根据是否存在某 lable 的筛选,如:Selector release,筛选所有带 release 标签的 Pod。集合型和相等型的 Selector,也可以用“,”来连接,同样的标识逻辑”与“的关系。

4、Annotations

另外一种重要的元数据是:annotations。

作用:一般是系统或者工具用来存储资源的非标示性信息,可以用来扩展资源的 spec/status 的描述。

这里给了几个 annotations 的例子:

1. service.beta.kubernetes.io/alicloud-loadbalancer-cert-id:your-cert-id
2. nginx.ingress.kubernetes.io/service-weight:"new-nginx: 20, old-nginx: 60"
3. kubectl.kubernetes.io/last-applied-configuration:|
"apiVersion":"apps/v1",
"kind":"Deployment", 
"metadata":{
	"annotations":{}, 
	"name":"nginx-deployment",
	"namespace":"default"
	},
"spec":{
	selector":{
		"matchLabels":("app":nginx}
		},
	"template":{
		"spec":{"containers":[{"image":"nginx.1.7.9","name":"nginx"}]}
		}
	}

第一个例子,存储了阿里云负载器的证书 ID,我们可以看到 annotations 一样可以拥有域名的前缀,标注中也可以包含版本信息。

第二个 annotation存储了 nginx 接入层的配置信息,我们可以看到 annotations 中包括“,”这样无法出现在 label 中的特殊字符。

第三个 annotations 一般可以在 kubectl apply 命令行操作后的资源中看到, annotation 值是一个结构化的数据,实际上是一个 json 串,标记了上一次 kubectl 操作的资源的 json 的描述。

5、Ownereference

最后一个元数据叫做 Ownereference,也就是所有者,一般就是指集合类的资源,比如说 Pod 集合,就有 replicaset、statefulset。

在这里插入图片描述

集合类资源的控制器会创建对应的归属资源。比如:replicaset 控制器在操作中会创建 Pod,被创建 Pod 的 Ownereference 就指向了创建 Pod 的 replicaset,Ownereference 使得用户可以方便地查找一个创建资源的对象,另外,还可以用来实现级联删除的效果。

二、控制器模式

1、控制循环

控制型模式最核心的就是控制循环的概念。
在控制循环中包括了控制器(controller),被控制的系统(System),以及能够观测系统的传感器(Sensor),三个逻辑组件。

当然这些组件都是逻辑的,外界通过修改资源 spec 来控制资源,控制器比较资源 spec 和 status,从而计算一个 diff,diff 最后会用来决定执行对系统进行什么样的控制操作,控制操作会使得系统产生新的输出,并被传感器以资源 status 形式上报,控制器的各个组件将都会是独立自主地运行,不断使系统向 spec 表示终态趋近。在这里插入图片描述

2、Sensor

控制循环中逻辑的传感器主要由 ReflectorInformerIndexer 三个组件构成。

1、Reflector 通过 List 和 Watch K8s server 来获取资源的数据。

List 用来在 Controller 重启以及 Watch 中断的情况下,进行系统资源的全量更新;
Watch 则在多次 List 之间进行增量的资源更新;

2、Reflector 在获取新的资源数据后,会在 Delta 队列中塞入一个包括资源对象信息本身以及资源对象事件类型的 Delta 记录。Delta 队列中可以保证同一个对象在队列中仅有一条记录,从而避免 Reflector 重新 List 和 Watch 的时候产生重复的记录。
在这里插入图片描述
3、Informer 组件不断地从 Delta 队列中弹出 delta 记录,之后,再把这个事件交给事件的回调函数

4、然后把资源对象交给 indexer,让 indexer 把资源记录在一个缓存中,缓存在默认设置下是用资源的命名空间来做索引的,并且可以被 Controller Manager 或多个 Controller 所共享。

控制循环中的控制器组件主要由事件处理函数以及 worker 组成,事件处理函数之间会相互关注资源的新增、更新、删除的事件,并根据控制器的逻辑去决定是否需要处理。对需要处理的事件,会把事件关联资源的命名空间以及名字塞入一个工作队列中,并且由后续的 worker 池中的一个 Worker 来处理,工作队列会对存储的对象进行去重,从而避免多个 Woker 处理同一个资源的情况。
在这里插入图片描述

Worker 在处理资源对象时,一般需要用资源的名字来重新获得最新的资源数据,用来创建或者更新资源对象,或者调用其他的外部服务,Worker 如果处理失败的时候,一般情况下会把资源的名字重新加入到工作队列中,从而方便之后进行重试。

3、控制循环例子-扩容

这里举一个简单的例子来说明一下控制循环的工作原理。

ReplicaSet 是一个用来描述无状态应用的扩缩容行为的资源, ReplicaSet controler 通过监听 ReplicaSet 资源来维持应用希望的状态数量,ReplicaSet 中通过 selector 来匹配所关联的 Pod,在这里考虑 ReplicaSet rsA 的,replicas 从 2 被改到 3 的场景。
在这里插入图片描述
首先,Reflector 会 watch 到 ReplicaSet 和 Pod 两种资源的变化,发现 ReplicaSet 发生变化后,在 delta 队列中塞入了对象是 rsA,而且类型是更新的记录。

Informer 一方面把新的 ReplicaSet 更新到缓存中,并与 Namespace nsA 作为索引。另外一方面,调用 Update 的回调函数,ReplicaSet 控制器发现 ReplicaSet 发生变化后会把字符串的 nsA/rsA 字符串塞入到工作队列中,工作队列后的一个 Worker 从工作队列中取到了 nsA/rsA 这个字符串的 key,并且从缓存中取到了最新的 ReplicaSet 数据。

Worker 通过比较 ReplicaSet 中 spec 和 status 里的数值,发现需要对这个 ReplicaSet 进行扩容,因此 ReplicaSet 的 Worker 创建了一个 Pod,这个 pod 中的 Ownereference 取向了 ReplicaSet rsA。
在这里插入图片描述
然后 Reflector Watch 到的 Pod 新增事件,在 delta 队列中额外加入了 Add 类型的 deta 记录,一方面把新的 Pod 记录通过 Indexer 存储到了缓存中,另一方面调用了 ReplicaSet 控制器的 Add 回调函数,Add 回调函数通过检查 pod ownerReferences 找到了对应的 ReplicaSet,并把包括 ReplicaSet 命名空间和字符串塞入到了工作队列中。

ReplicaSet 的 Woker 在得到新的工作项之后,从缓存中取到了新的 ReplicaSet 记录,并得到了其所有创建的 Pod,因为 ReplicaSet 的状态不是最新的,也就是所有创建 Pod 的数量不是最新的。因此在此时 ReplicaSet 更新 status 使得 spec 和 status 达成一致。
在这里插入图片描述

三、控制器模式总结

1、Kubernetes 所采用的控制器模式,是由声明式 API 驱动的。确切来说,是基于对 Kubernetes 资源对象的修改来驱动的
2、Kubernetes 资源之后,是关注该资源的控制器。这些控制器将异步的控制系统向设置的终态驱近;
3、这些控制器是自主运行的,使得系统的自动化和无人值守成为可能;
4、因为 Kubernetes 的控制器和资源都是可以自定义的,因此可以方便的扩展控制器模式。特别是对于有状态应用,我们往往通过自定义资源和控制器的方式,来自动化运维操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值