原文链接:
https://blog.csdn.net/qq_41385137/article/details/12749270
前言:今天是变成小阳人后的第一篇录音,请大家务必照顾好自己,寒冬与阴霾总会过去,《Go必知必会》将与你一路为伴,砥砺前行。
1.如何创建pod或者创建deployment流程?(必问)
(Tips:这个问题几乎是每一家公司必须要问的问题,作为k8s的一个基础,从这个问题可以考察出基础能力如何。)
一、如何创建pod流程:
1、客户端提交创建请求,可以通过API Server的Restful API,也可以使用如何命令行工具。支持的数据类型包括JSON和YAML。
2、API Server处理用户请求,存储Pod数据到etcd。
3、调度器通过API Server查看未绑定的Pod。尝试为Pod分配主机。
4、过滤主机 (调度预选):调度器用一组规则过滤掉不符合要求的主机。比如Pod指定了所需要的资源量,那么可用资源比Pod需要的资源量少的主机会被过滤掉。
5、主机打分(调度优选):对第一步筛选出的符合要求的主机进行打分,在主机打分阶段,调度器会考虑一些整体优化策略,比如把容一个Replication Controller的副本分布到不同的主机上,使用最低负载的主机等。
6、选择主机:选择打分最高的主机,进行binding操作,结果存储到etcd中。
7、kubelet根据调度结果执行Pod创建操作:绑定成功后,scheduler会调用APIServer的API在etcd中创建一个boundpod对象,描述在一个工作节点上绑定运行的所有pod信息。运行在每个工作节点上的kubelet也会定期与etcd同步boundpod信息,一旦发现应该在该工作节点上运行的boundpod对象没有更新,则调用Docker API创建并启动pod内的容器。
二、如何创建deployment流程?(tips:这个要回答出创建rs的过程)
1、准备好一个包含应用程序的Deployment的yml文件,然后通过kubectl客户端工具发送给ApiServer。
2、ApiServer接收到客户端的请求并将资源内容存储到数据库(etcd)中。
3、Controller组件(包括scheduler、replication、endpoint)监控资源变化并作出反应。
4、ReplicaSet检查数据库变化,创建期望数量的pod实例。
5、Scheduler再次检查数据库变化,发现尚未被分配到具体执行节点(node)的Pod,然后根据一组相关规则将pod分配到可以运行它们的节点上,并更新数据库,记录pod分配情况。
gcgcgc
6、Kubelete监控数据库变化,管理后续pod的生命周期,发现被分配到它所在的节点上运行的那些pod。如果找到新pod,则会在该节点上运行这个新pod。
7、kuberproxy运行在集群各个主机上,管理网络通信,如服务发现、负载均衡。例如当有数据发送到主机时,将其路由到正确的pod或容器。对于从主机上发出的数据,它可以基于请求地址发现远程服务器,并将数据正确路由,在某些情况下会使用轮训调度算法(Round-robin)将请求发送到集群中的多个实例。
8、kubectl提交一个请求,来创建RC,此时Controller Manager通过API server里的接口监听到这个RC事件,分析之后,发现当前集群中还没有它对应的Pod实例,于是根据RC里的Pod模板定义Pod对象;接下来,此事件被Scheduler发现,它立即执行一个复杂的调度流程,为这个新Pod选定一个落户的Node,这个过程可称为绑定;随后模板Node上运行的Kubelet进程通过API Server监测到这个“新生的”Pod并按照它的定义,启动Pod并负责后期的管理;随后我们通过Kubectl提交一个映射到该Pod的Server的创建请求,Controller Manager会通过Label标签查询到相关联的Pod实例,然后生成Service的Endpoints信息;接下来,所有Node上运行的Proxy进程通过API Server查询并监听Service对象及其对应的Endpoints信息,建立一个负载均衡器来实现Service访问到后端Pod的流量转发功能;
2.k8s中pod之间是怎么通信的?
tips: 金山云问了这个问题,主要考察一些基础的网络模式。1.同一个Pod内的多个容器之间:lo(通过localhost回环地址通信)。
2.各Pod之间的通讯:overlay Network (覆盖网络)。
3.Pod与 Service之间的通讯:(使用各节点的 Iptables规则)。