#k8s. 调度器scheduler 亲和性、污点

默认调度过程:预选 Predicates (过滤节点) --> 优选 Priorities(优先级排序) --> 优先级最高节点

实际使用,根据需求控制Pod调度,需要用到如下:

指定节点、nodeAffinity(节点亲和性)、podAffinity(pod 亲和性)、 podAntiAffinity(pod 反亲和性)

#指定调度节点

# Pod.spec.nodeName 强制匹配,直接指定Node 节点,跳过 Scheduler 调度策略
#node-name-demo.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: demo-nodename
spec:
replicas: 3
template:
metadata:
labels:
app: demo1
spec:
nodeName: node03 #指定Node节点
containers:
- name: demo1
image: alivv/nginx:node
ports:
- containerPort: 80
#部署
kubectl apply -f node-name-demo.yaml
#查看pod全部在node03上 (node03节点不存在会一直处于pending)
kubectl get pod -o wide
#删除
kubectl delete -f node-name-demo.yaml
# Pod.spec.nodeSelector 强制约束,调度策略匹配 label,调度 Pod 到目标节点
#node-selector-demo.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: demo-node-selector
spec:
replicas: 3
template:
metadata:
labels:
app: demo1
spec:
nodeSelector:
test1: node #匹配lable test1=node
containers:
- name: demo1
image: alivv/nginx:node
ports:
- containerPort: 80
#部署
kubectl apply -f node-selector-demo.yaml #查看pod处于pending
kubectl get pod -o wide
#给node02节点添加lable
kubectl label nodes node02 test1=node
kubectl get nodes --show-labels
#再次查看pod在node02节点
kubectl get pod -o wide #删除
kubectl delete -f node-selector-demo.yaml
kubectl label nodes node02 test1-

亲和性调度

亲和性调度可以分成软策略和硬策略两种方式

  • preferredDuringSchedulingIgnoredDuringExecution:软策略,没满足条件就忽略,Pod可以启动
  • requiredDuringSchedulingIgnoredDuringExecution:硬策略,没满足条件就等待,Pod处于Pending

操作符

  • In:label 的值在某个列表中
  • NotIn:label 的值不在某个列表中
  • Gt:label 的值大于某个值
  • Lt:label 的值小于某个值
  • Exists:某个 label 存在
  • DoesNotExist:某个 label 不存在

#节点亲和性 pod.spec.nodeAffinity

#node-affinity-demo.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: node-affinity
labels:
app: affinity
spec:
replicas: 3
template:
metadata:
labels:
app: affinity
spec:
containers:
- name: nginx
image: alivv/nginx:node
ports:
- containerPort: 80
name: nginxweb
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution: #硬策略,不在node01节点
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: NotIn
values:
- node01
preferredDuringSchedulingIgnoredDuringExecution: #软策略,优先匹配test2=node
- weight: 1
preference:
matchExpressions:
- key: test2
operator: In
values:
- node
#给node03节点添加lable
kubectl label nodes node03 test2=node
kubectl get nodes --show-labels #部署
kubectl apply -f node-affinity-demo.yaml #查看pod
kubectl get pod -o wide #删除
kubectl delete -f node-affinity-demo.yaml
kubectl label nodes node03 test2-

#Pod亲和性pod.spec.affinity.podAffinity/podAntiAffinity

podAffinity Pod亲和性,解决 pod 部署在同一个拓扑域 、或同一个节点

podAntiAffinity Pod反亲和性,避开Pod部署在一起

#pod-affinity-demo.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: pod-affinity-demo
labels:
app: pod-affinity
spec:
replicas: 3
template:
metadata:
labels:
app: pod-affinity
spec:
containers:
- name: nginx
image: alivv/nginx:node
ports:
- containerPort: 80
name: nginxweb
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution: #硬策略
- labelSelector: #匹配Pod有 app=demo1
matchExpressions:
- key: app
operator: In
values:
- demo1
topologyKey: kubernetes.io/hostname
#部署
kubectl apply -f pod-affinity-demo.yaml #查看pod全部处于Pending 因为没标签app=demo1的Pod
kubectl get pod -o wide #部署上面的node-name-demo.yaml
kubectl apply -f node-name-demo.yaml
#再次查看pod全部在node03节点
kubectl get pod -o wide
#Pod反亲和性测试
#改podAffinity为podAntiAffinity
sed -i 's/podAffinity/podAntiAffinity/' pod-affinity-demo.yaml
kubectl apply -f pod-affinity-demo.yaml #查看node03节点移除pod-affinity-demo
kubectl get pod -o wide
#删除
kubectl delete -f pod-affinity-demo.yaml
kubectl delete -f node-name-demo.yaml

# 污点taints与容忍tolerations

节点标记为 Taints ,除非 pod可以容忍污点节点,否则该 Taints 节点不会被调度pod

kubeadm安装k8s,默认master节点会添加NoSchedule 类型污点

污点设置 kubectl taint nodes node-name key=value:effect

key 和 value 为污点标签, value 可以为空,effect 描述污点的作用,effect 支持如下三个选项:

  • NoSchedule 不会将 Pod 调度到有污点的 Node
  • PreferNoSchedule 避免将 Pod 调度到有污点的 Node
  • NoExecute 不会将 Pod 调度到有污点的 Node ,将已经存在的 Pod 驱逐出去
#给node03添加污点
kubectl taint nodes node03 test-taint=node:NoSchedule
#查看
kubectl describe node node03 |grep Taints

容忍 pod.spec.tolerations

#pod-tolerations-demo.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: pod-tolerations-demo
labels:
app: pod-tolerations
spec:
replicas: 3
template:
metadata:
labels:
app: pod-tolerations
spec:
containers:
- name: nginx
image: alivv/nginx:node
ports:
- containerPort: 80
name: http
#创建Pod
kubectl apply -f pod-tolerations-demo.yaml #查看Pod,node03节点有污点将不会创建Pod
kubectl get pod -o wide #文件pod-tolerations-demo.yaml追加容忍污点配置
echo '#容忍污点
tolerations:
- key: "test-taint"
#value: "node"
operator: "Exists" #忽略value值
effect: "NoSchedule"
'>>pod-tolerations-demo.yaml
cat pod-tolerations-demo.yaml #更新
kubectl apply -f pod-tolerations-demo.yaml
#Pod扩容
kubectl scale deployment pod-tolerations-demo --replicas 5 #再次查看Pod,Node03有Pod
kubectl get pod -o wide
#删除Pod
kubectl delete -f pod-tolerations-demo.yaml
#删除污点
kubectl taint nodes node03 test-taint-

#不指定 key 值时,容忍所有的污点 key

tolerations:
- operator: "Exist

#不指定 effect 值时,表示容忍所有的污点作用

tolerations:
- key: "key"
operator: "Exist"

#避免资源浪费,设置master运行Pod,可以如下配置:

kubectl taint nodes --all  node-role.kubernetes.io/master- #先删除默认污点
kubectl taint nodes Node-Name node-role.kubernetes.io/master=:PreferNoSchedule

Blog地址 https://www.cnblogs.com/elvi/p/11755828.html

本文git地址 https://gitee.com/almi/k8s/tree/master/notes

7.k8s.调度器scheduler 亲和性、污点的更多相关文章

  1. 泡面不好吃,我用了这篇k8s调度器,征服了他

    1.1 调度器简介 来个小刘一起 装逼吧 ,今天我们来学习 K8的调度器 Scheduler是 Kubernetes的调度器,主要的任务是把定义的 pod分配到集群的节点上,需要考虑以下问题: 公平: ...

  2. Cocos2d-X3.0 刨根问底(六)----- 调度器Scheduler类源码分析

    上一章,我们分析Node类的源码,在Node类里面耦合了一个 Scheduler 类的对象,这章我们就来剖析Cocos2d-x的调度器 Scheduler 类的源码,从源码中去了解它的实现与应用方法. ...

  3. scrapy-redis(调度器Scheduler源码分析)

    settings里面的配置:'''当下面配置了这个(scrapy-redis)时候,下面的调度器已经配置在scrapy-redis里面了'''##########连接配置######## REDIS_ ...

  4. pyspider源码解读--调度器scheduler.py

    pyspider源码解读--调度器scheduler.py scheduler.py首先从pyspider的根目录下找到/pyspider/scheduler/scheduler.py其中定义了四个类 ...

  5. K8S调度之pod亲和性

    目录 Pod Affinity Pod亲和性调度 pod互斥性调度 Pod Affinity 通过<K8S调度之节点亲和性>,我们知道怎么在调度的时候让pod灵活的选择node,但有些时候 ...

  6. (5)调度器(scheduler)

    继承关系 原理介绍 Cocos2d-x调度器为游戏提供定时事件和定时调用服务.所有Node对象都知道如何调度和取消调度事件,使用调度器有几个好处: 每当Node不再可见或已从场景中移除时,调度器会停止 ...

  7. cocos2dx调度器(scheduler)

    调度器(scheduler) http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/m ...

  8. k8s调度器、预选策略及调度方式

    一.k8s调度流程 1.(预选)先排除完全不符合pod运行要求的节点2.(优先)根据一系列算法,算出node的得分,最高没有相同的,就直接选择3.上一步有相同的话,就随机选一个 二.调度方式 1.no ...

  9. k8s调度器kube-scheduler

    kube-scheduler简介 调度是容器编排的重要环节,需要经过严格的监控和控制,现实生产通常对调度有各类限制,譬如某些服务必须在业务独享的机器上运行,或者从灾备的角度考虑尽量把服务调度到不同机器 ...

随机推荐

  1. xrdp远程

    安装图形界面 yum groupinstall "GNOME Desktop" 安装epel源 yum install epel* 安装xrdp yum --enablerepo= ...

  2. 【转】Linux添加虚拟网卡

    转自:https://blog.csdn.net/hzhsan/article/details/44677867 有时候,一台服务器需要设置多个ip,但又不想添加多块网卡,那就需要设置虚拟网卡.这里介 ...

  3. Wasserstein Generative Adversarial Nets (WGAN ) and CGAN

    GAN目前是机器学习中非常受欢迎的研究方向.主要包括有两种类型的研究,一种是将GAN用于有趣的问题,另一种是试图增加GAN的模型稳定性. 事实上,稳定性在GAN训练中是非常重要的.起初的GAN模型在训 ...

  4. BFPRT: O(n)最坏时间复杂度找第K大问题

    同时找到最大值与最小值 找到n个元素中的最大/小值,比较次数为n-1, 找到n个元素中的最大值和最小值,可以Two Pass,比较次数为2n-2 也可以One Pass,比较次数至多为\(\left ...

  5. WebApi 接口参数:传参详解

    前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方式方法,算是一个笔记,也希望能帮初学者少走弯路.本 ...

  6. 中文转换为ASCII码的方式

    可以到jdk安装路径: 找到native2ascii.exe文件 双击运行,敲入中文即可获取对应的ASCII编码

  7. git提示Please enter a commit message to explain why this merge is necessary

    Please enter a commit message to explain why this merge is necessary. 请输入提交消息来解释为什么这种合并是必要的(提交信息) gi ...

  8. pyqt5-表格TableWidGet

    from PyQt5.QtWidgets import QApplication,QTableWidget,QWidget,QHeaderView,QPushButton,QTableWidgetIt ...

  9. 【NOIP2016提高A组模拟8.19】(雅礼联考day2)总结

    第一题又有gcd,又有xor,本来想直接弃疗,不过后来想到了个水法: 当两个相邻的数满足条件时,那么他们的倍数也可能满足条件.然后没打,只打了个暴力. 正解就是各种结论,各种定理搞搞. 第二题,想都不 ...

  10. HTTS TTLS 433

    HTTP和HTTPS协议,看一篇就够了 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/x ...