在云原生架构体系中,我们需要通过一个大的仓库来管理很多个容器,而需要一个集群管理工具来充当仓库管理员的角色。
目前使用范围较广的仓库管理员就是kubernetes。
但是会有如下一些问题:
1、 k8s如何感知pod内的进程正确的结束?pod不一定是容器pid=1的进程本身,这个进程可能会fork一些子进程来协助系统的正常工作。
2、 进程如果运行失败了,我们如何进行重试?还是说直接重启仓库。
3、 多个任务之间的依赖关系如何处理,如何管理多个任务?
4、 如果我们在多个pod之间并行的运行任务,那么管理任务的队列大小我们应当如何确定。
因为存在上述问题,k8s引入了job的机制。
Job就是专门用来管理人物的,相当于直接隶属于仓库管理员,但是帮助仓库管理员来管理厂子里的容器的运行状态。
他可以创建一个或者多个pod的容器,也可以指定pod的数量,并监控pod是否正常运行。
由于它可以直观的了解到pod的状态,那么我们可以根据pod的状态来帮助job决策重试方案和次数,以及失败的应对方案,k8s使用声明式api而不是使用命令式api是异曲同工之妙。通过管理进程之间的依赖关系,可以决定任务执行的先后顺序,并控制任务执行的并行度,确保任务总体的完成度。
而Daemonset也是一种控制器,但是Daemonset是一种由状态的,他需要去观测节点的状态来通过API Server向ETCD传递pod的状态信息。
当节点的状态信息变化时,会通过内存消息队列进行消息传递和通信,。如果节点中没有对应的pod,daemonset会自动创建一个pod,并进行对比,当pod信息全部更新完毕之后,他会更新整个Daemonset的并通过API Server来传递到ETCD。
DaemonSet能够帮助系统管理和运行一组相同的pod,并且能够根据节点的状态保证新加入节点并自动创建对应pod,当节点移除时,相应的pod也能够移除,同时能够跟踪节点的状态。