文章目录
使用阿里云主机ECS,
四台主机信息如下:
server1 — 私网IP:10.0.0.2 ----公网IP: 47.108.54.185 ---- 搭建docker仓库harbor—nfs服务器
server2 — 私网IP:10.0.0.3 ----公网IP: 47.108.144.231 ---- k8s集群主节点
server3 — 私网IP:10.0.0.4 ----公网IP: 47.108.115.206 ---- k8s集群节点
server4 — 私网IP:10.0.0.5 ----公网IP: 47.108.28.42 ---- k8s集群节点
k8s调度方式
- 调度器通过Kubernetes的watch机制来发现集群中新创建且未被调度到Node上的Pod。调度器会将发现的每一个未调度的Pod调度到一个合适的Node上运行
- Kube-scheduler是kubernetes集群的默认调度器,并且是集群控制面的一部分。如果有调度需求,kube-scheduler在设计上是允许用户自己写一个调度组件并替换原有的kube-schduler
- 在做调度决定时需要考虑的因素包括:单独和整体的资源请求,硬件/软件/策略限制,亲和以及反亲和要求,数据局限性,负载间的干扰等等
NodeName
nodeName时节点选择约束的最简单方法,但一般不推荐。如果nodeName在PodSpec中指定了,则它优先于其他的节点选择方法。
使用nodeName来选择节点的一些限制:
– 如果指定的节点不存在,则调度失败;
– 如果指定的节点没有资源来容纳pod,则pod调度失败
– 云环境中的节点名称并非总是可预测或稳定的
nodeselector
nodeSelector是节点选择约束的最简单推荐形式。
调度器只会调度到满足标签要求的节点上。
调度失败,当前没有节点符合标签disktype=ssd
只要有节点满足要求,pod就会running
亲和性和反亲和性
- nodeSelector提供了一种非常简单的方法来将Pod约束到具有特定标签的节点上。亲和/反亲和功能极大的扩展了可以表达约束的类型
- 可以发现规则是“软”/“偏好”,而不是硬性要求,因此,如果调度器无法满足该要求,仍然调度该Pod
- 可以使用节点上的Pod标签来约束,而不是使用节点本身的标签,来允许哪些Pod可以或者不可以被放置在一起
节点亲和性
- requireDuringSchedulingIgnoredDuringExcution 必须满足
- preferredDuringSchedulingIgnoredDuringExecution 倾向满足
- 其中,IgnoreDuringExcution 表示如果在Pod运行期间Node的标签发生变化,导致亲和性策略不能满足,则继续运行当前Pod
参考:https://kubernetes.io/zh/docs/concepts/configuration/assign-pod-node/
pod亲和性
运行pod:demo
设置亲和性,和pod demo运行在同一个节点上
pod的反亲和性
node的属性污点Taints
- NodeAffinity节点亲和性,是Pod上定义的一种属性,使Pod能够按要求调度的某个Node上,而Taints相反,可以让Node拒绝运行Pod,甚至驱逐Pod
- Taints(污点)是Node的一个属性,设置了Taints后,调度器便不会调度POd到该Node。如果在Pod上设置了Tolerations(容忍),可以容忍Node上的污点,则调度器可以忽略污点,可以(不是必须)把pod调度过去
创建:kubectl taint nodes server3 key=value:NoSchedule
查询:kubectl describe nodes server3 |grep Taints
删除: kubectl taint nodes server3 key:NoSchedule-
设置的污点范围:
Noschedule(Pod不会被调度到被标记为Taints的节点)
PreferNoSchedule(NoSchedule的软策略版本)
NoExecute:该选项意为着一旦Taint生效,如该节点的正在运行的Pod没有相应Tolerate设置,会被直接驱逐
给节点添加污点Taints
给pod设置容忍
Tolerations中定义的key,value,effect要与node上设置的taint保持一致
- 如果operator是Exists,value可以忽略
- 如果operator是Equal,则key与value之间的关系必须相等
- 如果不指定operator属性,则默认值为Equal
两个特殊值: - 当不指定key,再配合Exists就能匹配所有的key和value,可以容忍所有污点
- 当不指定effect,则匹配所有的effect
去除节点上的污点
cordon、drain停止调度
表示后期创建的pod不会调度到该节点上,相同作用的还有指令drain、delete,但是cordon影响最小。
cordon只会将node调为SchedulingDisabled,新创建pod,不会被调度到该节点,节点原有pod不受影响,仍正常对外提供服务。
drain 驱逐节点: 首先驱逐node上的pod,使其在其他节点重新创建。然后将节点调为SchedulingDisabled
delete 删除节点:最暴力的一个,首先驱逐node上的pod,使其在其他节点重新创建,然后,从master节点删除该node,master失去对其控制,如要恢复调度,需进入node节点,重启kubelet