k8s集群创建pod的详细流程

695人浏览 / 0人评论

。在架构中,Nginx可能会处理入口流量并将其路由到API Server,但创建Pod的核心步骤不会改变。以下是一个详细的步骤,包含了你的架构环境:

  1. 发送Pod创建请求: 通过kubectl命令或者API请求发送Pod的创建请求。如果你使用kubectl命令行工具,那么这个命令应该是kubectl apply -f pod.yaml。如果你使用API请求,那么你应该向https://ched1.qa.tongdao.cn/api/v1/namespaces/{namespace}/pods发送POST请求。

  2. Nginx处理请求: Nginx接收到来自客户端的请求,然后按照预定义的规则将请求路由到Kubernetes的API Server。

  3. API Server验证并接受请求: API Server接收到请求后,会对请求进行认证和授权,确认请求来源的合法性和权限。然后,它会对请求的内容进行一系列验证,包括Schema验证和Admission Controller的验证等。如果所有验证都通过,API Server就会把这个Pod对象存储在etcd中。

  4. Scheduler寻找合适的节点: Pod对象创建并存储在etcd中后,Pod的状态会被设置为Pending,表示Pod还没有被调度到任何节点上。此时,Kubernetes的Scheduler组件会监控到新的未调度的Pod,然后根据预设的策略,选择一个合适的节点来运行这个Pod。

  5. API Server更新Pod信息: Scheduler选择好节点后,会把节点信息更新到Pod的.spec.nodeName字段,然后发送给API Server。API Server再把这个信息存储到etcd中。

  6. kubelet启动Pod: 在每个节点上都运行着kubelet进程,它会定期从API Server获取节点上应该运行哪些Pod。当kubelet发现有新的Pod需要运行时,就会开始启动Pod的过程。启动Pod包括下载镜像、启动容器、设置网络等一系列操作。

  7. CNI插件设置网络: kubelet在启动Pod的过程中,会调用CNI插件来为Pod设置网络。CNI插件会创建网络接口、分配IP地址,配置路由规则等,确保Pod的网络通信可以正常进行。

  8. Container Runtime启动容器: kubelet会调用Container Runtime(例如Docker或containerd)来启动Pod中的容器。Container Runtime会负责从镜像仓库拉取镜像,创建容器并启动。

  9. kubelet更新Pod状态: 容器启动后,kubelet会周期性地检查容器的运行状态,然后更新到Pod的.status字段,发送给API Server。API Server

全部评论