Kubernetes 中创建一个 Pod具体发生了什么

在 Kubernetes 中创建一个 Pod 的过程大致如下:

  • 用户使用 Kubernetes API 对象描述符(YAML 或 JSON)创建 Pod 对象,包括指定 Pod 的容器、卷和其他元数据信息。

  • 用户创建的 Pod 对象被提交给 Kubernetes API server 进行处理。

  • Kubernetes API server 验证请求的身份和权限,然后将该请求转发给 Kubernetes 控制器管理器(Kubernetes Controller Manager)。

  • 控制器管理器中的 ReplicaSet 控制器检查是否有适当数量的 Pod 在集群中运行。如果数量不足,则根据用户定义的规范创建新的 Pod。

  • 控制器管理器向调度器(Scheduler)请求为该 Pod 分配一个节点。调度器会选择一个合适的节点来运行该 Pod。

  • 调度器将调度信息更新到 etcd 中,并将该信息发送给 kubelet,该节点上运行的 Kubernetes 代理。

  • kubelet 根据指令拉取镜像,创建容器并启动 Pod 中的容器。同时 kubelet 也会在启动容器之前检查 Pod 是否满足健康检查和准入控制等策略。

  • kubelet 将容器状态更新到 etcd 中,由此告知 Kubernetes API server 新建的 Pod 的状态。

  • 用户可以使用 kubectl 命令行工具或 Kubernetes Web UI 来查看 Pod 状态和日志。

总之,Kubernetes 通过一系列组件协同工作,确保 Pod 在集群中稳定运行。

其中,Kubectl 是用户使用的命令行工具,Kube-API-Server 是 Kubernetes 集群中的控制平面组件之一,Kubelet 是节点上的代理,Container 是运行在 Pod 中的容器。 在创建 Pod 的过程中,

  • 用户通过 Kubectl 向 Kube-API-Server 发送创建 Pod 的请求,
  • Kube-API-Server 将请求转发给对应的节点上的 Kubelet。
  • Kubelet 通过下载容器镜像并创建容器,
  • 最终将容器的状态报告给 Kube-API-Server,
  • Kube-API-Server 再将创建 Pod 的结果响应给 Kubectl。

  • 用户通过kubectl命名发起请求。
  • apiserver通过对应的kubeconfig进行认证,认证通过后将yaml中的po信息存到etcd。
  • Controller-Manager通过apiserver的watch接口发现了pod信息的更新,执行该资源所依赖的拓扑结构整合,整合后将对应的信息交给apiserver,apiserver写到etcd。
  • Scheduler同样通过apiserver的watch接口更新到pod可以被调度,通过算法给pod分配节点,并将pod和对应节点绑定的信息交给apiserver,apiserver写到etcd。
  • kubelet从apiserver获取需要创建的pod信息,调用CNI接口给pod创建pod网络,调用CRI接口去启动容器,调用CSI进行存储卷的挂载。
  • 网络,容器,存储创建完成后pod创建完成,等业务进程启动后,pod运行成功。

随机文章