Kubernetes的pod调度

108 阅读2分钟

2022 年什么会火?什么该学?本文正在参与“聊聊 2022 技术趋势”征文活动 」

创建pod流程

用户通过kubectl进入apiserver中,把相关信息存储到etcd中,scheduler进入apiserver中看有没有pod的创建,如果有,通过etcd读取到对应的pod,然后通过调度算法,把pod调度到某个node节点中,结果信息更新到API Server中,API Server更新到etcd存储系统。pod被调度到的node节点通过kubelet访问apiserver,从而在etcd中读取到pod信息,然后通过docker创建容器

创建pod命令:

kubectl create deployment web --image=nginx

然后复制三次

kubectl scale deployment web --replicas=3

查看pod在节点上的分配情况

kubectl get pods -o wide

影响pod调度的属性

pod的yaml文件中对资源的限制影响pod的调度,节点选择器nodeSelector标签也会影响pod的调度

对于附带标签的资源对象,使用标签选择器挑选出符合条件的资源完成所需操作。创建资源的时候,可以直接在其metadata中的labels属性设置标签,标签以key-value形式设置,也可以使用下面的命令

对节点创建标签的命令:

kubectl label node node1 env_role=dev

scheduler守护进程负责在各工作节点中基于系统资源的可用性挑选一个来运行待创建的pod对象,Kubernetes将所有工作节点抽象成资源池的资源统一分配使用。

用户先为node资源对象设定标签,然后配置pod对象通过节点标签选择器进行匹配检测,完成节点的调度

节点亲和性nodeAffinity也是和调度有关,节点亲和性分为硬亲和性和软亲和性,硬亲和性表示条件必须满足,软亲和性条件尽量满足。

污点

污点Taint是节点的属性

查看污点信息:

kubectl describe node node1 | grep Taint

值为NoSchedule表示不会被调用,PreferNoSchedule表示尽量不调度,NoExecute表示不会被调度的同时会把当前节点的pod删掉

添加污点信息:

kubectl taint node node1 env_role=yes:NoSchedule

删除污点信息:

kubectl taint node node1 env_role:NoSchedule-

有污点容忍属性,表示某个节点即使设置了污点也有可能被调度到