原文链接https://mp.weixin.qq.com/s?__biz=MzI0NjI4MDg5MQ==&mid=2715291842&idx=1&sn=e605f9b4099d946f94ca6783a8e4a6f6

背景:

CronJob是Kubernetes提供的定时任务功能,CronJob可以根据你指定的cron策略来完成任务。我们在使用CronJob的时候,我们发现,当创建一个CronJob的时候,只会创建一个CronJob,当到指定时间时,会创建一个job和一个pod,随着时间的推移,我们会发现,越来越多的job和pod,甚至是满屏的job和pod,我们在调用API删除这个cronjob的时候,发现只会删除cronjob这个资源,而不会删除对应的已有的job和pod,然后,我们尝试删除job,发现删除job,会把对应的pod删除掉,为什么好多的操作不符合心理预期呢?心里冒着十万个为什么?

原作者疑问

1. cronjob是怎么定时创建job的呢?

2. 为什么删除的时候,只是删除了cronjob,而没有删除对应的job和pod呢?

3. cronjob、job和pod之间的关系是怎么样的呢?

4. job和pod的关系是怎么对应上的呢?

原作者答案

Q:cronjob和job是如何维护关系的呢?

A: cronjob和job关系,使用了types.UID,来判断的,每个cronjob拥有唯一的UID,然后列出所有的jobs,使用遍历job的策略来判断job应该属于哪个cronjob。

Q:job和pod的关系是怎么样维护的呢?

A: 先拿到了job中的Selector,然后,根据选择器来获取对应标签的pods

Q:cronjob是怎么定时创建job的呢?

A: 通过代码发现,cronjob会在后台启动一个go程,后台一直在处理cronjob,job和pod,同时也在维护cornjob的Active列表数据的正确性,同时,我们也在syncOne()函数中找到了他后台周期期创建job的操作。job是cronjob-controller创建的,逻辑是,当创建一个cronjob后,会把这个cronjob交接到cronjob-controller下的goroutine,然后就返回了,正在创建任务的是controller下的goroutine。

Q:删除是cronjob,为何没有删除对应的job和pod?

A: 删除的时候,会首先检查并发job的并发策略,如果不为0,会设置为0,并更新这个job的状态,然后找到对应的pod,删除完pod后再删除job本身,如果有一个pod删除失败,会直接退出而不会删除job。删除完job后,再从cronjob的Active列表中移除job。

对于删除cronjob,可能没有立即删除job和pod,是因为删除的时候会有三种策略,即:

DeletionPropagation string="Orphan","Foreground"(默认),"Background"

Orphan:垃圾回收GC自动触发;

Background:垃圾回收器会在后台执行删除(手动触发,立即后台处理)。

Foreground:API调用后会设置删除的过期时间,并把他放入到要删除的队列,在没删除之前,前台一直可见(手动触发,可能不立即处理)。

当真正执行Delete(或者其他操作)的时候,根据资源获取resource,然后重新组装deleteOptions策略,然后删除。

# 注意,删除cronjob的时候不会自动删除job,这些job可以用kubectl delete job来删除

参考链接:

Cronjob源码地址http://github.com/kubernetes/kubernetes/pkg/controller/cronjob/cronjob_controller.go

Cronjob中文文档:https://www.kubernetes.org.cn/cronjob

【读书笔记】Cronjob原理及源码分析的更多相关文章

  1. OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

  2. ConcurrentHashMap实现原理及源码分析

    ConcurrentHashMap实现原理 ConcurrentHashMap源码分析 总结 ConcurrentHashMap是Java并发包中提供的一个线程安全且高效的HashMap实现(若对Ha ...

  3. HashMap和ConcurrentHashMap实现原理及源码分析

    HashMap实现原理及源码分析 哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表, ...

  4. (转)ReentrantLock实现原理及源码分析

    背景:ReetrantLock底层是基于AQS实现的(CAS+CHL),有公平和非公平两种区别. 这种底层机制,很有必要通过跟踪源码来进行分析. 参考 ReentrantLock实现原理及源码分析 源 ...

  5. 【转】HashMap实现原理及源码分析

    哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景极其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出 ...

  6. 【OpenCV】SIFT原理与源码分析:DoG尺度空间构造

    原文地址:http://blog.csdn.net/xiaowei_cqu/article/details/8067881 尺度空间理论   自然界中的物体随着观测尺度不同有不同的表现形态.例如我们形 ...

  7. 《深入探索Netty原理及源码分析》文集小结

    <深入探索Netty原理及源码分析>文集小结 https://www.jianshu.com/p/239a196152de

  8. HashMap实现原理及源码分析之JDK8

    继续上回HashMap的学习 HashMap实现原理及源码分析之JDK7 转载 Java8源码-HashMap  基于JDK8的HashMap源码解析  [jdk1.8]HashMap源码分析 一.H ...

  9. 【OpenCV】SIFT原理与源码分析:关键点描述

    <SIFT原理与源码分析>系列文章索引:http://www.cnblogs.com/tianyalu/p/5467813.html 由前一篇<方向赋值>,为找到的关键点即SI ...

随机推荐

  1. Linux命令 umask

    umask: 文件预设权限 指定当前用户在创建文件或目录时的权限默认值. $ umask0002$ umask -Su=rwx,g=rwx,o=rx 创建文件时,预设没有x 权限,即只有rw 权限,最 ...

  2. PAT甲级1141 Ranking of Institutions

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805344222429184 题意: 给定几个学生的PAT分数和学校 ...

  3. listview添加数据

    1. 添加数据: ListView1.ViewStyle:=vsReport; ListView1.Columns.Add; ListView1.Columns[0].Caption:='aaaa'; ...

  4. qemu对虚拟机的内存管理(二)

    上篇文章主要分析了qemu中对虚拟机内存管理的关键数据结构及他们之间的联系,这篇文章则主要分析在地址空间发生变化时,如何将其更新至KVM中,保持用户空间与内核空间的同步. 这一系列操作与之前说的Add ...

  5. REST风格的5条关键原则

    REST风格的5条关键原则包括: (1)网络上的所有事物都被抽象为资源. (2)每个资源对应一个唯一的资源标识. (3)通过通用的连接件接口对资源进行操作. (4)对资源的各种操作不会改变资源标识. ...

  6. asp.net机制理解(Javaweb同理)

    1.页面运行先后顺序 先执行aspx中的代码,然后再合并到HTML中,最后一起送到浏览器执行,HTML是从上到下执行的,而HTML中的Windows.onload()最后执行.而由于aspx中的代码是 ...

  7. javascript callback

    https://javascriptissexy.com/understand-javascript-callback-functions-and-use-them/ MDN web docs htt ...

  8. Vue疑难杂症

    安装Vue脚手架的时候 指令:npm install vue-cli -g Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corpor ...

  9. UI框架搭建DAY2

    今天的主要任务是完善NormalPanel, 搭建PopupPanel. 在编写PanelManager的过程中,发现了一个bug.昨天把panelPath直接传给了ResourceManager.G ...

  10. shell printf命令:怎样格式化输出语句

    printf 命令用于格式化输出, 是echo命令的增强版.它是C语言printf()库函数的一个有限的变形,并且在语法上有些不同. 注意:printf 由 POSIX 标准所定义,移植性要比 ech ...