以前在找工作的时候面试了一些大厂,其中在面试字节跳动和阿里巴巴的时候,对于K8S这块,他们问了一个雷同的问题:请具体说说,用户执行了一个deployment.yaml文件时,新创建了一个Pod,这个Pod的创立流程是怎么的, Pod的更新流程又是怎么的。简短的一个问题,要是想答的具体,其实还是波及了K8S中的很多货色,我觉的这是一道比拟有品质的题,我在现场答出来了,在这里,我想再总结一下,查漏补缺,算是对面试的总结,更是对K8S本身的学习和积淀。
我在答复这个问题的时候,其实头脑里大略是有一个流程图的,而后再按着从头到尾,逐渐开展的的准则来具体阐明,上面就参照这幅图,再来还原一个Pod被创立时的流程。
第一步:如果咱们的deployment.yaml中应用了Nginx镜像,且replicas的值设置为1,而后用户执行了kubectl create -f deployment.yaml命令。
第二步:kubectl执行yaml文件后,对api-server发动了申请,这时api-server会对此次操作进行身份认证,在客户端的~/.kube文
件夹下,曾经设置好了相干的用户认证信息,这样api-server会晓得我是哪个用户,并对此用户进行鉴权,当api-server确定咱们的申请非法后,就会承受本次操作,并把相干的信息保留到etcd中。
第三步:上面controller-manager组件就会染指,controller-manager是有多个类型的,比方Deployment Controller, 它的作用就是负责监听Deployment,此时Deployment Controller发现咱们的deployment.yaml文件诉求是须要一个复本集且数量为1,那么它就会去创立一个ReplicaSet,一个ReplicaSet的产生,又被另一个叫做ReplicaSet的Controller监听到了,紧接着它就会去剖析ReplicaSet的语义,它理解到是要按照ReplicaSet的template去创立Pod, 它一看这个Pod并不存在,那么就新建此Pod,当Pod刚被创立时,它的nodeName属性值为空,代表着此Pod未被调度。
第四步:调度工作天然是由Scheduler组件来实现的,Scheduler始终关注Pod及Node的信息,所以它就要把未被调度的Pod,调度到适合的Node下来。然而它所做的也只是把它的调度计划,返回给api-server。
第五步:kubelet组件布署于Node之上,它从api-server处晓得有一个Pod应该要被调度到本身所在Node上来,它会先判断本地是否在此Pod,如果不存在,则会进入创立Pod流程,创立Pod有分为几种状况,第一种是容器不须要挂载内部存储,则相当于间接docker run把容器启动,但不会间接挂载docker网络,而是通过CNI调用网络插件配置容器网络,如果须要挂载内部存储,则还要调用CSI来挂载存储。
第六步:Pod建设胜利后,ReplicaSet Controller会对其继续进行关注,如果Nginx Pod因意外或被咱们手动退出,ReplicaSet Controller会晓得,并创立新的Pod,以放弃replicas数量期望值。
第七步:更新Pod,什么时候会更新Pod? 当deployment.yaml文件中template的局部被更新,就会触发Pod更新,因为Deployment Controller 会把template局部文本计算一个hash值,依据这个hash值判断文本变动。
第八步:既然触发了更新,那么ReplicaSet Controller就会新建一个ReplicaSet并在其中启动新的Pod,在老的ReplicaSet里敞开Pod,直到新的ReplicaSet接替老的ReplicaSet。
总结:
能够看到,对于一个简略的问题,能够答复的内容还是很多,我置信上述内容,如果面试官不是要求你对源码上相熟与开发,曾经答复的比拟详尽了。我倡议在面试的时候,如果面试官问了一个你比拟熟或精通的问题,那么你应该抓住机会尽可能的把这个问题讲深,讲广,如果面试官不叫停,甚至能够把与此相关的货色说进去。你晓得这样做的目标吗?能够在评论处与一探讨 : )
本文参加了 SegmentFault 思否征文「如何“反杀”面试官?」,欢送正在浏览的你也退出。