资源元信息

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。过程如下

  1. reflector 会 watch 到 replicaset 和 pod(后面讲为什么) 都变化了

  2. 发现RS变化了,就向delta queue塞入了对象是rsA,事件是Updated

  3. informer把资源存入缓存中,以nsA为缩影

  4. informer同时还调用onUpdate的回调函数

  5. RS controller发现变化了,就会将nsA/rsA字符串写入工作队列中

  6.  一个worker取到了这个字符串,

  7. worker从缓存中取到了最新的资源数据。对比后发现要扩容

  8. 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来实现运维自动化
  •  
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐