资源元信息
K8s资源对象
- spec:期望的状态
- status:观察到的状态
- Metadata
- labels:用来识别资源的标签
- Annotations:用来描述资源的注解
- ownerReference:用来描述多个资源之间相互关系
labels
- 标识型的key:Value元数据
- 作用
- 用于筛选资源
- 唯一的组合资源的方法
selector
- 可以使用selector来查询
- 类似于SQL:select * where...
- 相等型selector
- tie=front,env=dev
- 集合型selector:
- env in (test, gray)
- tie not in (front, back)
- release, !release
- 逗号相当于逻辑与
annotation
- key:Value
- 作用
- 存储资源的非标识性信息
- 扩展资源的spec/status
- 特点:
- 一般比label更大
- 可以包含特殊字符
- 可以结构化也可以非结构化
ownereference
- owner,所有者即资源类资源
- pod的集合:replicaset, statefulset
- 集合类资源的控制器创建了资源
- replicaset控制器创建的pod的ownereference指向自己
- 作用
- 方便反向查找创建资源的对象
- 方便进行级联删除
控制器模式
控制循环
- 各组件独立运行
- 根据反馈不断控制器调整是的系统终态趋近status->spec
sensor
- reflector : 通过list & watch k8s 的 api server来获取资源的数据
- list在controller重启和中断的时候对系统资源数据进行全量更新
- watch :在list之间进行增量更新
- 获取数据后会将信息本身和时间类型塞进delta queue
- delta queue可以保证同一个对象仅有一条记录
- informer从delta queue中去delta数据
- 把事件交给事件回调函数处理
- 把对象交给indexer
- indexer把资源记录在缓存中
- 缓存默认使用明明空间做索引
- 默认可以被多个controller使用
controller
- 事件处理函数
- 监听informer中资源的新增,更新,删除事件。并根据控制器的逻辑决定是否需要处理
- 对于需要处理的事件,会将事件关联资源的命名空间以及名字塞入工作队列中
- 工作队列会对处理的事件去重
- worker池
- 从工作队列取一条消息处理
- 通过资源的名字来重新获得资源最新的数据,用来创建或者更新资源对象。
- 处理失败会重新加入工作队列中
控制循环例子-扩容
-
replicaset是用来描述无状态应用扩所容状态的资源
-
replicaset controller通过监听replicaset来维持应用期望的数量
-
replicaset 通过 selector 获取所有关联的pod
-
这里replicaset 从2改为3。过程如下
-
reflector 会 watch 到 replicaset 和 pod(后面讲为什么) 都变化了
-
发现RS变化了,就向delta queue塞入了对象是rsA,事件是Updated
-
informer把资源存入缓存中,以nsA为缩影
-
informer同时还调用onUpdate的回调函数
-
RS controller发现变化了,就会将nsA/rsA字符串写入工作队列中
-
一个worker取到了这个字符串,
-
worker从缓存中取到了最新的资源数据。对比后发现要扩容
-
worker新建了一个pod3,其ownerefence指向rsA
9. reflector watch到了pod的新增事件。在delta queue中添加了 Added 的记录
10. informer一方面通过indexer将新的记录存入缓存, 另一方面调用onAdd回调
11. onAdd回调通过检查ownererence找到了对应的replicaset,然后将消息写入工作队列中
12. worker从工作队列中取到消息
13. worker从缓存中取到了RS所有的pod
14. worker更新rsA的RS为3
两种API设计方式
命令式API(和孩子交流):
- 吃饭
- 刷牙
- 睡觉
- 新扩充一个pod
- 删除一个pod
问题:
- 错误处理 !
- 命令没有响应
- 反复尝试
- 需要记录当前的操作-复杂
- 多重试了怎么办?
- 巡检做修正 - 额外工作、危险
- 多方并发怎么办?
- 需要加锁-复杂、低效
声明式API(和员工交流)
- 稳定性达到99.99%
- DAU达到200W
- 副本数量保持在3个
优点:
- 天然地记录了状态
- 幂等操作,可在任意时刻反复操作
- 正常操作即巡检
- 可合并多个变更
控制器模式总结
- 由声明式的API驱动-k8s资源控制器监控资源,控制器
- 异步的逐渐将系统向期望状态转化
- 使得系统取向自动化和无人值守化
- 资源和控制器都是可以自定义的。对于由状态资源,可以使用自定义operator来实现运维自动化