1. kubectl 提交 yaml 后,首先客户端验证,验证 yaml 的定义是否正确;如果正确的话,生成发给 kube-apiserver 的 request
2. kube-apiserver 收到 client 发来的 request 之后,进行一些列的 client 认证和鉴权,确保 client 有权限创建资源。
3. request 被一些列 adminssion controller 拦截,进行一些额外计算和默认值计算,例如设定初始资源需求(如果 client 没有指明的话)。
4. 创建资源对象,存盘到 etcd
5. 资源对象存盘后,deployment controller 开始控制 loop,创建 replicaset
6. relicaset controller 开始创建 pod 资源; pod 对象存入 etcd,进入 pending 状态
7. scheduler 开始介入,开始检查各种 scheduling 限制(例如 taint,affinity )和资源需求,然后找到可以满足这些条件的 node 。找到 node 后,创建一个 binding 对象,发还给 kube-apiserver,pod 进入 scheduled 状态。
8. node 上的 kubelet 会定时查询 apiserver,收到 pod 创建事件后,开始在 node 上启动 pod 的准备工作。这里过程包括,准备存储,拉去 image pull secret 等。
9. kubelet 通过 CRI 通知容器运行时(例如 docker )启动一个父容器。这里的容器会处于暂停的阶段(直到所有设置完成)
10. kubelet 通过 CNI 设置容器的网络
11. 所有设置完成后,开始创建真正的应用容器,包括 init container 和用户指明的其他容器
12. 完成工作。
我的理解是,这个整个过程有点像是个状态机。
参考文献:
https://github.com/jamiehannaford/what-happens-when-k8s