1.kubectl将yaml文件转换为json,提交给apiserver,apiserver通过kubeconfig进行认证,将Pod信息存储到etcd

2.scheduler通过list watch机制监听到创建新Pod的事件,根据Pod属性决定调度到哪个Node上,Pod属性包括请求的CPU/内存大小、nodeSelector、亲和性、污点容忍等,同时给Pod打标签指明调度到具体哪个节点,可以通过kubectl get pod -owide查看

3.apiserver拿到调度结果并写入到etcd中

4.kubelet从apiserver获取分配到其所在节点的Pod

5.kubelet调用CNI接口创建Pod网络,调用CSI进行存储卷挂载,调用CRI接口启动容器

6.Docker把容器的状态汇报给kubelet

7.kubelet将Pod状态更新到apiserver,apiserver将状态信息写到etcd中

8.kubectl get pod

  • 1、K8S是如何对容器编排?

在K8S集群中,容器并非最小的单位,K8S集群中最小的调度单位是Pod,容器则被封装在Pod之中。由此可知,一个容器或多个容器可以同属于在一个Pod之中。

  • 2、Pod是怎么创建出来的?

Pod并不是无缘无故跑出来的,它是一个抽象的l逻辑概念,那么Pod是如何创建的呢?Pod是由Pod控制器进行管理控制,其代表性的Pod控制器有Deployment、StatefulSet等。这里我们先有这样的一个概念,后面再详细解刨。

  • 3、Pod资源组成的应用如何提供外部访问的?

Pod组成的应用是通过Service这类抽象资源提供内部和外部访问的,但是service的外部访问需要端口的映射,带来的是端口映射的麻烦和操作的繁琐。为此还有一种提供外部访问的资源叫做Ingress。

  • 4、Service又是怎么关联到Pod呢?

在上面说的Pod是由Pod控制器进行管理控制,对Pod资源对象的期望状态进行自动管理。而在Pod控制器是通过一个YAML的文件进行定义Pod资源对象的。在该文件中,还会对Pod资源对象进行打标签,用于Pod的辨识,而Servcie就是通过标签选择器,关联至同一标签类型的Pod资源对象。这样就实现了从service-->pod-->container的一个过程。

  • 5、Pod的怎么创建逻辑流程是怎样的?
  • (1)客户端提交创建请求,可以通过API Server的Restful API,也可以使用kubectl命令行工具。支持的数据类型包括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内的容器。