Kubernetes -- pod启动的流程
整体流程
client向APIServer发送创建pod的请求:
- APIServer将pod信息存入etcd,通知Scheduler;
- Scheduler根据调度算法,为pod选择一个节点,然后向APIServer发送更新spec.nodeName;
- APIServer更新完毕,通知对应节点的kubelet;
- kubelet发现pod调度到本节点,创建并运行pod的容器;
文章图片
APIServer处理pod启动 APIServer收到创建pod的请求后:
- 首先,对client来源进行认证,实现方式是证书(cert)或token(sa);
- 然后,对client进行鉴权,确认其是否有创建pod的权限,实现方法是rbac;
- 然后,通过准入控制插件验证或修改资源请求,常用的准入控制插件有:LimitRanger/ResourceQuota/NamespaceLifecycle;
- 最后,将pod资源存储到etcd;
文章图片
Scheduler处理pod启动 【Kubernetes -- pod启动的流程】Scheduler监听到APIServer创建pod的事件后:
- 按照默认的调度算法(预选算法+优选算法),为pod选择一个可运行的节点nodeName;
- 向APIServer发送更新pod的消息:pod.spec.nodeName;
- APIServer更新pod,通知nodeName上的kubelet,pod被调度到了nodeName;
文章图片
pod中容器的启动过程:
- InitC容器:
- 多个initC顺序启动,前一个启动成功后才启动下一个;
- 仅当最后一个initC执行完毕后,才会启动主容器;
- 常用于进行初始化操作或等待依赖的服务已ok;
- postStart钩子:
- postStart与container的主进程并行执行;
- 在postStart执行完毕前,容器一直是waiting状态,pod一直是pending状态;
- 若postStart运行失败,容器会被杀死;
- startupProbe钩子:
- v1.16版本后新增的探测方式;
- 若配置了startupProbe,就会先禁止其他探测,直到成功为止;
- readinessProbe探针:
- 探测容器状态是否ready,准备好接收用户流量;
- 探测成功后,将pod的endpoint添加到service;
- livenessProbe探针:
- 探测容器的健康状态,若探测失败,则按照重启策略进行重启;
- containers:
- 多个container之间是顺序启动的,参考源码;
- kubernetes in action
- container启动源码:https://github.com/kubernetes...
推荐阅读
- Hive常见问题汇总
- 注册分销商的骄傲
- federation--kubernetes集群联邦的实现
- 如何启动改变
- spring|spring boot项目启动websocket
- Android系统启动之init.rc文件解析过程
- mysql提示无法找到句饼_找不到数据库启动句柄
- gem|gem & pod 记录
- 工程中屏蔽CocoaPods里的警告
- 如何在Kubernetes|如何在Kubernetes 里添加自定义的 API 对象(一)