前言:
参考k8s教程由浅入深
八、pod调度策略-创建pod流程
用户流程:通过apiserver发起创建任务--->写入etcd中
scheduler:使用apiserver,watch etcd,有新数据则使用调度算法,将pod调度到某一个结点上
node结点:使用kubelet访问apiserver,读取etcd,拿到分配给当前结点的pod,再使用docker创建容器,并将结点创建docker的状态返回给apiserver,最终写入etcd
九、影响调度的属性
1.pod的资源限制
调度系统会根据request找到足够pod结点运行的node
2.节点选择器标签影响pod调度
apiVersion: apps/v1
kind: Pod
metadata:
name: pod-test
spec:
# 节点选择标签
nodeSelector:
env_role: dev
containers:
- image: nginx:1.14
name: nginx
imagePullPolicy:Always
restartPolicy:Never
步骤:a.对节点组合进行分类,命令:
kubectl label node node名称 env_role=dev
例如:
b.使用结点选择器 nodeSelector env_role分配类别,选择部署集群
3.结点亲和性
与nodeSelector类似,根据节点上的标签来决定调度到哪些节点
类别:硬亲和性(约束必须满足) 软亲和性(尝试满足,不保证满足) 反亲和性(notIn notExist)
apiVersion: apps/v1
kind: Pod
metadata:
name: pod-test
spec:
affinity:
nodeAffinity:
# 硬亲和性
requireDuringSchedulingIgnoredDuringExecution:
nodeSelectTerms:
- matchExpressions:
- key: env_role
operation: In
values:
- dev
- test
# 软亲和性
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
- matchExpressions:
- key: group
operator: In
values:
- otherprod
containers:
- image: nginx:1.14
name: nginx
imagePullPolicy:Always
restartPolicy:Never
支持常用操作符:In NotIn Exists Gt Lt NotExists
4.污点和污点容忍
a.与nodeSelecoter和nodeAffinity区别
nodeSelecoter和nodeAffinity为pod属性,调度时实现
Taint污点:节点属性,节点不做普通分配调度
b.应用场景
- 专用节点配备
- 配置特定硬件节点配备
- 基于Taint驱逐
c.演示
查看污点指令
kubectl describe node k8smaster | grep Taints
污点值:
NoSchedule:一定不被调度
PreferNoSchdule :尽量被调度
NoExecute: 不会调度,并且会驱逐到Node已有Pod
为节点添加污点
kubectl taint node [node] key=value:污点的三个值
删除污点
kubectl taint node node名称 key:value-
污点容忍
允许容器被调度到含有污点key=value的node节点上
apiVersion: apps/v1
kind: Pod
metadata:
name: pod-test
spec:
# 污点容忍
tolerations:
- key: "key"
oprator: "Equal"
value: "Value"
effect: "NoSchedule"
containers:
- image: nginx:1.14
name: nginx
imagePullPolicy:Always
restartPolicy:Never