当我们在控制台执行命令 "kubectl create -f deploy.ymal" 的时候,k8s是如何将容器拉起来的。这个问题非常考验面试者对k8s的了解程度,如果对k8s组件的功能不太了解的话,很难回答得比较全面。
整个流程的概要图,如下所示:
首先kubectl会解析我们定义的Yaml文件,调用kube-apiserver接口创建Deployment;kube-apiserver接到请求后会先经过认证、授权和准入控制后转化为内部数据结构保存到Etcd中,此时返回客户端Deployment创建成功。
kube-controller-manager中的Deployment Controller会watch到有一个新的Deployment创建,便会调用kube-apiserver接口创建一个Replicaset;Replicaset Controller发现有新的Replicaset创建后,会调用kube-apiserver创建对应副本数的Pod,不仅如此,Replicaset Controller后期还会持续执行reconcile,如果有主机宕机,会重新创建Pod保持副本一致。此时Pod的NodeName字段还是空的。
kube-scheduler开始介入,发现集群中有未调度的Pod,于是会经过过滤筛选和排序后,选择出最合适的主机Node,如果没有合适的节点,还会执行优先级抢占。如果调度成功后,会调用kube-apiserver的bind接口,设置Pod的NodeName字段。
每个kubelet启动的时候都会watch本节点的Pod,如果发现有新的Pod调度到本节点。则会执行Pod的创建,调用CRI接口分别创建容器,调用CNI接口为容器创建网卡。至此Pod创建,然后kubelet会将Pod的状态定期同步到kube-apiserver中。
页面更新:2024-03-10
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号