概述
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的流程:
- 用户使用kubectl或通过Kubernetes API发送创建Pod的请求。
- Kubectl或API Server接收到创建Pod的请求,并验证请求的合法性。
- 如果请求合法,API Server将请求转发给调度器(Scheduler)。
- 调度器根据预定义的调度策略和资源约束,选择一个合适的节点来运行Pod。
- 调度器将Pod的调度决策发送给API Server。
- API Server将调度决策保存在etcd中,作为集群状态的一部分。
- 调度器将Pod的绑定信息发送给Kubelet节点。
- Kubelet收到调度器发送的绑定信息后,在相应节点上创建Pod的容器。
- Kubelet通过容器运行时(如Docker、containerd)创建和管理Pod的容器。
- 容器创建完成后,Kubelet会向API Server报告Pod的状态和健康状况。
- API Server更新Pod的状态,并将更新写入etcd中。
- 如果Pod定义中定义了服务(Service),API Server将创建相应的服务对象,并将其与Pod关联起来。
- 负载均衡器(如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的内部网络和协议进行,以确保集群中各个组件之间的协作和信息共享。