概述

1)客户端提交创建请求,可以通过 api-server 提供的 restful 接口,或者是通过 kubectl 命令行工具,支持的数据类型包括 JSON 和 YAML;

2)api-server 处理用户请求,将 pod 信息存储至 etcd 中;

3)kube-scheduler 通过 api-server 提供的接口监控到未绑定的 pod,尝试为 pod 分配 node 节点,主要分为两个阶段,预选阶段和优选阶段,其中预选阶段是遍历所有的 node 节点,根据策略筛选出候选节点,而优选阶段是在第一步的基础上,为每一个候选节点进行打分,分数最高者胜出;

4)选择分数最高的节点,进行 pod binding 操作,并将结果存储至 etcd 中;

5)随后目标节点的 kubelet 进程通过 api-server 提供的接口监测到 kube-scheduler 产生的 pod 绑定事件,然后从 etcd 获取 pod 清单,下载镜像并启动容器。

详细过程及组件交互

Kubernetes创建一个Pod的详细流程涉及多个组件之间的通信和协作。下面是一个简化的创建Pod的流程:

  1. 用户使用kubectl或通过Kubernetes API发送创建Pod的请求。
  2. Kubectl或API Server接收到创建Pod的请求,并验证请求的合法性。
  3. 如果请求合法,API Server将请求转发给调度器(Scheduler)。
  4. 调度器根据预定义的调度策略和资源约束,选择一个合适的节点来运行Pod。
  5. 调度器将Pod的调度决策发送给API Server。
  6. API Server将调度决策保存在etcd中,作为集群状态的一部分。
  7. 调度器将Pod的绑定信息发送给Kubelet节点。
  8. Kubelet收到调度器发送的绑定信息后,在相应节点上创建Pod的容器。
  9. Kubelet通过容器运行时(如Docker、containerd)创建和管理Pod的容器。
  10. 容器创建完成后,Kubelet会向API Server报告Pod的状态和健康状况。
  11. API Server更新Pod的状态,并将更新写入etcd中。
  12. 如果Pod定义中定义了服务(Service),API Server将创建相应的服务对象,并将其与Pod关联起来。
  13. 负载均衡器(如kube-proxy)根据服务的定义,将流量转发到Pod所在的节点上的容器。

在这个流程中,涉及到以下几个关键组件的通信:

  • 用户与kubectl或API Server之间的通信:用户通过命令行工具kubectl或使用Kubernetes API与API Server进行通信,发送创建Pod的请求。
  • API Server与调度器之间的通信:API Server将创建Pod的请求转发给调度器,并接收调度器返回的调度决策。
  • API Server与etcd之间的通信:API Server将集群状态信息(如调度决策、Pod状态更新)写入etcd中,并从etcd中读取集群状态信息。
  • 调度器与API Server、etcd之间的通信:调度器接收API Server发送的创建Pod请求,并向API Server报告调度决策,这些信息通过API Server与etcd进行通信。
  • 调度器与Kubelet之间的通信:调度器将Pod的绑定信息发送给相应的Kubelet节点,以指示在哪个节点上创建Pod。
  • Kubelet与容器运行时之间的通信:Kubelet通过容器运行时(如Docker、containerd)创建和管理Pod的容器。
  • Kubelet与API Server之间的通信:Kubelet向API Server报告Pod的状态和健康状况,以及接收API Server发送的更新信息。
  • API Server与负载均衡器之间的通信:如果Pod定义中定义了服务,API Server将创建相应的服务对象,并与负载均衡器(如kube-proxy)进行通信,以将流量正确转发到Pod所在的节点。

这些组件之间的通信通过Kubernetes的内部网络和协议进行,以确保集群中各个组件之间的协作和信息共享。