Kubernetes 中创建一个 Pod具体发生了什么
1 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。
2 更细节
- 用户通过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运行成功。