7.1. Deployment创建过程
以 kubectl apply -f deployment.yaml 为例,了解 Deployment 创建的过程。
- Kubectl 生成 API 请求
- Kubectl 校验 deployment.yaml 中的字段,确保资源清单的合法性
- Kubectl 检查 deployment.yaml 中的API字段,填充kubeconfig的认证信息,填充 deployment 请求体信息。
- 将封装好的请求发送到 ApiServer
- ApiServer 身份认证
- apiServer 通过认证信息确认用户合法身份
- 通过RBAC鉴权,确认用户具备资源操作权限
- 通过准入控制,确保满足Kubernetes部分高级功能,参考文档
- 将HTTP请求反序列化,存入ECTD中
- 执行资源初始化逻辑,如边车容器注入、证书注入等操作
- ControllerManager创建资源对象
- Deployment Controller 通过ApiServer发现有Deployment需要创建
- Deployment Controller 通过ApiServer查询对应ReplicaSet是否满足,不满则则创建新的ReplicaSet,并设置版本号
- ReplicaSet Controller 通过ApiServer发现有新的 ReplicaSet资源,通过查询是否有满足条件的Pod,如果Pod不满足条件,则创建Pod对象
- Scheduler 调度资源
- Scheduler 通过ApiServer监听创建新Pod的请求,一旦需要创建新Pod,则通过调度算法选择Node
- 先通过一组预算策略进行评估,筛选可以调度的Node
- 再通过优选策略,在符合条件的Node中选择得分最高的Node作为运行该Pod的节点,最高分有多个节点时,随机选择一个
- Scheduler 创建一个Binding对象并且请求ApiServer,该对象包含了Pod的唯一信息和选择的Nodename
- Kubelet 初始化Pod
之前所有的操作,都是在操作 etcd 数据库,只有 Kubelet 这一步才开始正式创建Pod
- Kubelet 通过ApiServer查询到当前自身节点上Pod清单,与自己缓存中记录进行比对,如果是新的Pod则进入创建流程
- Kubelet 生成Podstatus对象,填充Pod状态(Pending,Running,Succeeded,Failed,Unkown)
- Kubelet 检查Pod是否具备对应的准入权限,如果不具备则处于Pending状态
- 如果Pod存在资源限制,则通过Cgroups 对Pod进行资源限制
- 创建容器目录,并挂载存储卷的目录
- 检索ImagePullSecret,用于拉取镜像
- 通过CRI 接接口调用容器runtime创建容器
- CRI 创建容器
- 创建Pause容器,用于为其他容器提供共享的网络名称空间和启动pid名称空间,从而实现网络共享和僵尸进程回收
- docker runtime 调用CNI插件,从IP资源池中分配一个IP地址给当前Pause容器
- 拉取业务镜像,如果填充了 imagepullsecret 会通过指定的密钥去拉取镜像
- 挂载configmap到容器
- 填充Pod元数据信息
- 启动容器,监听容器的event,执行对应钩子