Kubernetes中pod的创建流程

一般我们在创建pod的过程中都是,执行kubectl命令去apply对应的yaml文件,但是在执行这个操作的过程到pod被完成创建,k8s的组件都做了哪些操作呢?下面我们简要说说pod被创建的过程。
Kubernetes中pod的创建流程_第1张图片
1.用户通过kubectl命名发起请求。

2.apiserver通过对应的kubeconfig进行认证,认证通过后将yaml中的po信息存到etcd。

  1. Controller-Manager通过apiserver的watch接口发现了pod信息的更新,执行该资源所依赖的拓扑结构整合,整合后将对应的信息写到etcd,此时pod已经可以被调度了。

4.Scheduler同样通过apiserver的watch接口更新到pod可以被调度,通过算法给pod分配节点,并将pod和对应节点绑定的信息写到etcd,然后将pod交给kubelet。

5.kubelet收到pod后,调用CNI接口给pod创建pod网络,调用CRI接口去启动容器,调用CSI进行存储卷的挂载。

6.网络,容器,存储创建完成后pod创建完成,等业务进程启动后,pod运行成功。

第二篇
pod创建过程
kubectl与API Server交互
kubectl 向 k8s api server 发起一个create pod 请求(即我们使用Kubectl敲一个create pod命令) 。

k8s api server接收到pod创建请求后,不会去直接创建pod;而是生成一个包含创建信息的yaml。
Kubernetes中pod的创建流程_第2张图片

将yaml信息写入etcd数据库
apiserver 将刚才的yaml信息写入etcd数据库。到此为止仅仅是在etcd中添加了一条记录, 还没有任何的实质性进展。

Kubernetes中pod的创建流程_第3张图片

scheduler 查看 k8s api 并写入etcd
scheduler 查看 k8s api
首先判断:pod.spec.Node == null?
若为null,表示这个Pod请求是新来的,需要创建;因此先进行调度计算,找到最“闲”的node。
然后将信息在etcd数据库中更新分配结果:pod.spec.Node = nodeA (设置一个具体的节点)
同样上述操作的各种信息也要写到etcd数据库中。
Kubernetes中pod的创建流程_第4张图片

创建container
kubelet 通过监测etcd数据库(即不停地看etcd中的记录),发现 k8s api server 中有了个新的Node;
如果这条记录中的Node与自己的编号相同(即这个Pod由scheduler分配给自己了);
则调用node中的docker api,创建container。
Kubernetes中pod的创建流程_第5张图片
调度计算
过滤主机 (调度预选):调度器用一组规则过滤掉不符合要求的主机。比如Pod指定了所需要的资源量,那么可用资源比Pod需要的资源量少的主机会被过滤掉。

主机打分(调度优选):对第一步筛选出的符合要求的主机进行打分,在主机打分阶段,调度器会考虑一些整体优化策略,比如把容一个Replication Controller的副本分布到不同的主机上,使用最低负载的主机等。

合适的节点选择
总结来说就是:
1.满足Pod资源要求
2.满足Pod的特殊关系要求
3.满足Node限制要求
4.做到集群资源合理利用

你可能感兴趣的:(企业集群架构学习)