乐趣区

关于2022招聘季:面试了字节跳动和阿里他们都问了这个K8S问题

以前在找工作的时候面试了一些大厂,其中在面试字节跳动和阿里巴巴的时候,对于 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 思否征文「如何“反杀”面试官?」,欢送正在浏览的你也退出。

退出移动版