调度过程
以下提供的创建pod时序图
-
kubectl 向 k8s api server 发起一个create pod 请求(即我们使用Kubectl敲一个create
pod命令) 。 k8s api server接收到pod创建请求后,不会去直接创建pod;而是生成一个包含创建信息的yaml。sc -
apiserver 将刚才的yaml信息写入etcd数据库。到此为止仅仅是在etcd中添加了一条记录, 还没有任何的实质性进展。
-
cheduler 查看 k8s api 首先判断:pod.spec.Node == null?
若为null,表示这个Pod请求是新来的,需要创建;因此先进行调度计算,找到最合适的node。
然后将信息在etcd数据库中更新分配结果:pod.spec.Node = nodeA (设置一个具体的节点)同样上述操作的各种信息也要写到etcd数据库中。
apiserver还会通知s’cheduler更新信息
kubelet 通过监测etcd数据库(即不停地看etcd中的记录),发现 k8s api server 中有了个新的Node;
如果这条记录中的Node与自己的编号相同(即这个Pod由scheduler分配给自己了);
则调用node中的docker api,创建container。
Pod是Kubernetes的基础单元,了解其创建的过程,更有助于理解系统的运作。
①用户通过kubectl或其他API客户端提交Pod Spec给API Server。
②API Server尝试将Pod对象的相关信息存储到etcd中,等待写入操作完成,API Server返回确认信息到客户端。
③API Server开始反映etcd中的状态变化。
④所有的Kubernetes组件通过"watch"机制跟踪检查API Server上的相关信息变动。
⑤kube-scheduler(调度器)通过其"watcher"检测到API Server创建了新的Pod对象但是没有绑定到任何工作节点。
⑥kube-scheduler为Pod对象挑选一个工作节点并将结果信息更新到API Server。
⑦调度结果新消息由API Server更新到etcd,并且API Server也开始反馈该Pod对象的调度结果。
⑧Pod被调度到目标工作节点上的kubelet尝试在当前节点上调用docker engine进行启动容器,并将容器的状态结果返回到API Server。
⑨API Server将Pod信息存储到etcd系统中。
⑩在etcd确认写入操作完成,API Server将确认信息发送到相关的kubelet。
1.1:调度方式
1、nodeName:
用于将Pod调度到指定的node名称上(跳过调度器直接分配)
2、nodeSelector:
用于将pod调度到匹配label【标签】的node上
两种方式都是通过yaml文件来实现
1.2:nodeName方式
创建pod资源,编写yaml文件
[root@master01 demo]# vim nodename.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
labels:
app: nginx
spec:
nodeName: 192.168.158.30
containers:
- name: nginx
image: nginx:1.15
[<