一、调度说明

1、简介

     Scheduler是ku bernet es的调度器, 主要的任务是把定义的pod分配到集群的节点上。听起来非常简单,但有很多要考虑的问题:公平:如何保证每个节点都能被分配资源资源高效利用:集群所有资源最大化被使用效率:调度的性能要好,能够尽快地对大批量的pod完成调度工作灵活:允许用户根据自己的需求控制调度的逻辑Sheduler是作为单独的程序运行的,启动之后会一直连接APIServer,获取PodSpec.NodeName为空的pod,对每个pod都会创建一个binding,表明该pod应该放到哪个节点上

2、调度过程

     调度分为几个部分:首先是过滤掉不满足条件的节点, 这个过程称为predicate; 然后对通过的节点按照优先级排序, 这个是priority; 最后从中选择优先级最高的节点。如果中间任何一步骤有错误, 就直接返回错误Predicate有一系列的算法可以使用:PodFitsResources:节点上剩余的资源是否大于pod请求的资源PodFitsHost:如果pod指定了NodeName,检查节点名称是否和NodeName匹配PodFitsHostPorts:节点上已经使用的port是否和pod申请的port冲爽PodSelectorNatches:过滤掉和pod指定的label不匹配的节点NoDiskConfliet:已经mount的volume和pod指定的volume不冲突,除非它们都是只读如果在predicate过程中没有合适的节点, pod会一直在pending状态, 不断重试调度, 直到有节点满足条件,经过这个步骤, 如果有多个节点满足条件,就继续priorities过程:按照优先级大小对节点排序优先级由一系列键值对组成、键是该优先级项的名称,值是它的权重(该项的重要性)、这些优先级选项包括:LeastReqvestedPriority:通过计算CPU和Memory的使用率来决定权重, 使用率越低权重越高,换句话说,这个优先级指标向于资源使用比例更低的节点BalancedResourceAllocation:节点上CPU和Memory使用率越按近, 权重越高、这个应该和上面的一起使用,不应该单使用ImageLocaltyfriority:候肉于已有要使用镇像的节点, 镜像总大小值越大, 权重越高通过算漆对所有的优先织项目和权重进行计算,得出最的结果

3、自定义调度器

     除了kubernetes自带的调度器,你也可以编写自己的调度器, 通过spec:schedulernane参数指定调度器的名字,可以为pod选择某个调度器进行调度, 比如下面的pod选择myschedvle r进行调度,而不是默认的default-scheduler:

二、节点亲和性

1、node节点亲和性

     1)pod.spec.nodeAffinitypreferredDuringSchedulingIgnoredDuringExecution:软策略requiredDuringSchedulingIgnoredDuringExecution:硬策略2)键值运算关系In:label的值在某个列表中Notln:label的值不在列表中Gt:label的值大于某个值Lt:label的值小于某个值Exists:某个label存在DoesNotExist:某个label不存在3)requiredDuringSchedulinglgnoredDuringExecution:硬策略[root@k8s-master1 nodeaffinity]# kubectl get node --show-labelsNAME             STATUS   ROLES    AGE   VERSION   LABELS192.168.100.30   Ready    <none>   20d   v1.15.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=192.168.100.30,kubernetes.io/os=linux192.168.100.40   Ready    <none>   20d   v1.15.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=192.168.100.40,kubernetes.io/os=linux#知在100.50这个没有的节点中创建node(状态为pending)[root@k8s-master1 nodeaffinity]# vim ./required.yaml apiVersion: v1kind: Podmetadata:name: nginx-requiredlabels:app: nginxspec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentaffinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- 192.168.100.50[root@k8s-master1 nodeaffinity]# kubectl create -f required.yaml[root@k8s-master1 nodeaffinity]# kubectl get pod -o wideNAME             READY   STATUS    RESTARTS   AGE     IP       NODE     NOMINATED NODE   READINESS GATESnginx-required   0/1     Pending   0          5m15s   <none>   <none>   <none>           <none>#将pod创建到100.30中[root@k8s-master1 nodeaffinity]# kubectl delete pod --all[root@k8s-master1 nodeaffinity]# vim required.yaml apiVersion: v1apiVersion: v1kind: Podmetadata:name: nginx-requiredlabels:app: nginxspec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentaffinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- 192.168.100.30[root@k8s-master1 nodeaffinity]# kubectl create -f required.yaml [root@k8s-master1 nodeaffinity]# kubectl get pod -o wideNAME             READY   STATUS    RESTARTS   AGE   IP           NODE             NOMINATED NODE   READINESS GATESnginx-required   1/1     Running   0          6s    172.18.0.4   192.168.100.30   <none>           <none>4)preferredDuringSchedulingIgnoredDuringExecution:软策略(weight是权重:数值越大权重越高,可有多个)[root@k8s-master1 nodeaffinity]# vim preferred.yaml apiVersion: v1kind: Podmetadata:name: nginx-requiredlabels:app: nginxspec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentaffinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- 192.168.100.50[root@k8s-master1 nodeaffinity]# kubectl create -f preferred.yaml[root@k8s-master1 nodeaffinity]# kubectl get pod -o wideNAME             READY   STATUS    RESTARTS   AGE   IP           NODE             NOMINATED NODE   READINESS GATESnginx-required   1/1     Running   0          57s   172.18.0.3   192.168.100.40   <none>           <none>5)软策略和硬策略嵌套使用[root@k8s-master1 nodeaffinity]# vim required-perferred.yaml apiVersion: v1kind: Podmetadata:name: nginx-requiredlabels:app: nginxspec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentaffinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- 192.168.100.40preferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- 192.168.100.50[root@k8s-master1 nodeaffinity]# kubectl create -f required-perferred.yaml[root@k8s-master1 nodeaffinity]# kubectl get pod -o wideNAME             READY   STATUS    RESTARTS   AGE   IP           NODE             NOMINATED NODE   READINESS GATESnginx-required   1/1     Running   0          99s   172.18.0.3   192.168.100.40   <none>           <none>

2、pod节点亲和性

     1)pod.spec.affinity.podAffinity/podAntiAffinityrequiredDuringSchedulinglgnoredDuringExecution:硬策略preferredDuringSchedulingIgnoredDuringExecution:软策略2)亲和性和反亲和性调度策略比较如下拓扑域()调度策略       匹配标签        操作符                             拓扑域支持   调度目标nodeAffinity    主机      In,NotIn,Exists,DoesNotExist,Gt,Lt  否           指定主机podAffinity     pod         In,NotIn,Exists,DoesNotExist        是           pod于指定pod同一拓扑域podAnitAffinity pod       In,NotIn,Exists,DoesNotExist        是           pod于指定pod不在同一拓扑域3)pod硬策略(podAffinity)[root@k8s-master1 nodeaffinity]# vim podAffinity.yaml apiVersion: v1kind: Podmetadata:name: nginx-1labels:app: nginxspec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentaffinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- nginxtopologyKey: kubernetes.io/hostname[root@k8s-master1 nodeaffinity]# kubectl create -f podAffinity.yaml[root@k8s-master1 nodeaffinity]# kubectl  get pod -o wideNAME             READY   STATUS    RESTARTS   AGE   IP           NODE             NOMINATED NODE   READINESS GATESnginx-1          1/1     Running   0          7s    172.18.0.4   192.168.100.40   <none>           <none>nginx-required   1/1     Running   0          63m   172.18.0.3   192.168.100.40   <none>           <none>4)硬策略(podAnitAffinity)[root@k8s-master1 nodeaffinity]# vim required-pod.yaml apiVersion: v1kind: Podmetadata:name: nginx-3labels:app: nginxspec:containers:- name: nginximage: hub.benet.com/xitong/nginximagePullPolicy: IfNotPresentaffinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- nginxtopologyKey: kubernetes.io/hostname[root@k8s-master1 nodeaffinity]# kubectl create -f podAnitAffinity.yaml[root@k8s-master1 nodeaffinity]# kubectl  get pod -o wide NAME                               READY   STATUS    RESTARTS   AGE   IP            NODE             NOMINATED NODE   READINESS GATESnginx-3                            0/1     Pending   0          25s   <none>        <none>           <none>           <none>nginx-deployment-58f4f857b-7td5x   1/1     Running   0          17m   172.17.85.2   192.168.100.30   <none>           <none>nginx-deployment-58f4f857b-jcd2p   1/1     Running   0          18m   172.17.17.4   192.168.100.40   <none> [root@k8s-master1 /]# kubectl delete deployment --all[root@k8s-master1 /]# kubectl  get podNAME                               READY   STATUS        RESTARTS   AGEnginx-3                            1/1     Running       0          2m9s

三、污点和容忍(Taint,Toleration)

1、污点(Taint)

     节点亲和性, 是pod的一种属性(偏好或硬性要求),它使pod被吸引到一类特定的节点。Taint则相反,它使节点能够排斥一类特定的podTaint和toleration相互配合,可以用来避免pod被分配到不合适的节点上。每个节点上都可以应用一个或多个taint, 这表示对于那些不能容忍这些taint的pod,是不会被该节点接受的。如果将toleration应用于pod上,则表示这些pod可以(但不要求) 被调度到具有匹配taint的节点上

2、污点(Taint) 的组成

     使用kubectl taint命令可以给某个Node节点设置污点, Node被设置上污点之后就和Pod之间存在了一种相斥的关系, 可以让Node拒绝Pod的调度执行, 甚至将Node已经存在的Pod驱逐出去每个污点的组成如下:key=value:effect每个污点有一个key和value作为污点的标签, 其中value可以为空,effect描述污点的作用, 当前tainteffect支持如下三个选项:NoSchedule:表示k8s不会将Pod调度到具有该污点的Node上PreferNoSchedule:表示k8s尽量避免将Pod调度到具有该污点的Node上NoExecute:表示k8s不会将Pod调度到具有该污点的Node上, 同时会将Node上已经存在的Pod驱逐出去

3、污点的设置、查看和去除

     1)设置污点[root@k8s-master1 ~]# kubectl  get pod -o wideNAME                      READY   STATUS    RESTARTS   AGE   IP            NODE             NOMINATED NODE   READINESS GATEStomcat-6d6768b884-7c2pv   1/1     Running   0          34m   172.17.85.2   192.168.100.30   <none>           <none>[root@k8s-master1 ~]# kubectl taint nodes 192.168.100.30 updata=chaoyue:NoExecute[root@k8s-master1 ~]# kubectl  get pod -o wide NAME                      READY   STATUS    RESTARTS   AGE   IP            NODE             NOMINATED NODE   READINESS GATEStomcat-6d6768b884-klkw8   1/1     Running   0          8s    172.17.17.4   192.168.100.40   <none>           <none>2)节点说明中, 查找Taints字段[root@k8s-master1 ~]# kubectl  get node NAME             STATUS   ROLES    AGE   VERSION192.168.100.30   Ready    <none>   21d   v1.15.3192.168.100.40   Ready    <none>   21d   v1.15.3[root@k8s-master1 ~]# kubectl describe node 192.168.100.30Taints:             updata=chaoyue:NoExecute 3)去除污点[root@k8s-master1 ~]# kubectl taint node 192.168.100.30 updata=chaoyue:NoExecute-[root@k8s-master1 ~]# kubectl  describe node 192.168.100.30Taints:             <none>

4、容忍(Toleration)

     设置了污点的Node将根据taint的effect:NoSchedule、PreferNoSchedule、NoExecute和Pod之间产生互斥的关系,Pod将在一定程度上不会被调度到Node上。但我们可以在Pod上设置客忍(Toleration) ,意思是设置了容忍的Pod将可以容忍污点的存在,可以被调度到存在污点的Node上1)测试key,vaule,effect: 要与Node上设置的taint保持一致operatorL:            的值为Exists将会忽略value值tolerationSeconds:    用于描述当Pod需要被驱逐时可以在Pod上继续保留运行的时间[root@k8s-master1 ~]# kubectl taint node 192.168.100.30 updata=chaoyue:NoExecute[root@k8s-master1 ~]# kubectl taint node 192.168.100.40 updata=chaoyue:NoExecute[root@k8s-master1 ~]# kubectl  get podNAME                      READY   STATUS    RESTARTS   AGEtomcat-6d6768b884-vh782   0/1     Pending   0          2m7s[root@k8s-master1 ~]# vim tomcat.yaml apiVersion: extensions/v1beta1kind: Deploymentmetadata:name: tomcat1spec:replicas: 1selector:matchLabels:run: tomcat1template:metadata:labels:run: tomcat1spec:containers:- image: hub.benet.com/xitong/tomcat:7.1imagePullPolicy: IfNotPresentname: tomcat1tolerations:- key: "updata"operator: "Equal"value: "chaoyue"effect: "NoExecute"tolerationSeconds: 3600[root@k8s-master1 ~]# kubectl apply -f tomcat.yaml [root@k8s-master1 ~]# kubectl  get podNAME                      READY   STATUS    RESTARTS   AGEtomcat-6d6768b884-vh782   0/1     Pending   0          3m13stomcat1-97cc4945b-hlk67   1/1     Running   0          5s

5、容忍的使用情况

     1)当不指定key值时, 表示容忍所有的污点key:tolerations:- operator:"Exists"2)当不指定effect值时, 表示容忍所有的污点作用tolerations:- key:"key"operator:"Exists"I3)有多个Master存在时,防止资源浪费,可以如下设置kubectl taint nodes 192.168.100.30 kubernetes.io/master=:PreferNoSchedule

四、固定节点调度

1、pod.spec.nodeName将pod直接调度到指定的Node节点上,会跳过Scheduler的调度策略,该规则时强制匹配

     [root@k8s-master1 ~]# vim tomcat.yaml apiVersion: extensions/v1beta1kind: Deploymentmetadata:name: tomcatspec:replicas: 2template:metadata:labels:run: tomcatspec:nodeName: 192.168.100.30containers:- image: hub.benet.com/xitong/tomcat:7.1imagePullPolicy: IfNotPresentname: tomcat[root@k8s-master1 ~]# kubectl apply -f tomcat.yaml [root@k8s-master1 ~]# kubectl  get pod -o wideNAME                      READY   STATUS    RESTARTS   AGE   IP            NODE             NOMINATED NODE   READINESS GATEStomcat-7bcfd659b7-22htc   1/1     Running   0          21s   172.17.85.6   192.168.100.30   <none>           <none>tomcat-7bcfd659b7-6hp9z   1/1     Running   0          21s   172.17.85.4   192.168.100.30   <none>           <none>tomcat-7bcfd659b7-mprcc   1/1     Running   0          21s   172.17.85.2   192.168.100.30   <none>           <none>tomcat-7bcfd659b7-vx269   1/1     Running   0          21s   172.17.85.3   192.168.100.30   <none>           <none>tomcat-7bcfd659b7-zpcgq   1/1     Running   0          21s   172.17.85.5   192.168.100.30   <none>           <none>

2、pod.spec.nodeSelector:通过kubenetes的label-slelctor机制选择节点,有调度器调度策略匹配label,而后调度pod到目标节点,还匹配属于强制约束

     [root@k8s-master1 ~]# vim tomcat.yaml apiVersion: extensions/v1beta1kind: Deploymentmetadata:name: tomcatspec:replicas: 2template:metadata:labels:run: tomcatspec:nodeSelector:disk: ssdcontainers:- image: hub.benet.com/xitong/tomcat:7.1imagePullPolicy: IfNotPresentname: tomcat[root@k8s-master1 ~]# kubectl apply -f tomcat.yaml [root@k8s-master1 ~]# kubectl  get podNAME                      READY   STATUS    RESTARTS   AGEtomcat-79b7ddf6f4-8jj4t   0/1     Pending   0          6stomcat-79b7ddf6f4-hc2jv   0/1     Pending   0          6s[root@k8s-master1 ~]# kubectl  label node 192.168.100.40 disk=ssd[root@k8s-master1 ~]# kubectl  get pod -o wide NAME                      READY   STATUS    RESTARTS   AGE     IP            NODE             NOMINATED NODE   READINESS GATEStomcat-79b7ddf6f4-8jj4t   1/1     Running   0          5m18s   172.17.17.6   192.168.100.40   <none>           <none>tomcat-79b7ddf6f4-hc2jv   1/1     Running   0          5m18s   172.17.17.4   192.168.100.40   <none>           <none>

部署k8s(16):集群调度策略的四种方案相关推荐

  1. 使用Kubespray部署k8s生产集群

    夫君子之行,静以修身,俭以养德,非淡泊无以明志,非宁静无以致远. 夫学须静也,才须学也,非学无以广才,非志无以成学.淫慢则不能励精,险躁则不能冶性. 年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐, ...

  2. 部署k8s ssl集群实践12:work节点配置docker

    部署docker 旧的三节点docker已经安装好 只需要安装新节点的docker 但是所有节点都需要修改docker配置文件 安装参考前面的基础篇里的安装方法 所有work节点都需要修改以下参数 需 ...

  3. 银河麒麟高级服务器操作系统V10上安装k8s单机集群

    前言 本文介绍银河麒麟高级服务器操作系统V10上安装部署k8s单机集群及一些基础的kubectl指令 本文涉及部署脚本主要源自基于https://github.com/easzlab/kubeasz在 ...

  4. 这一篇 K8S(Kubernetes)集群部署 我觉得还可以

    点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 国内安装K8S的四种途径 Kubernetes 的安装其实并不复杂,因为Kubernetes 属 ...

  5. k8s redis集群_基于K8S部署redis哨兵集群

    本 文 主 要 内 容 什么是Kubernetes分布式容器管理平台 PaaS平台redis-sentinel集群架构简介 PaaS平台部署redis哨兵集群 redis-sentinel容器测试及验 ...

  6. Kubernetes(K8s)集群安装部署

    Kubernetes(K8s)集群安装 Kubernetes(K8s)集群安装 1 .基本环境配置 1.1.Kubernetes集群规划 1.2.基础环境配置(所有节点) 1.2.1.Host文件修改 ...

  7. k8s多集群搭建istio共享控制平面(多网络)及部署grpc服务分流实践

    个人博客原文:http://www.lampnick.com/php/913 本文目标 部署一个多集群的共享的istio服务网格 部署一套基于grpc的服务 对grpc服务进行流量管理 架构图如下 前 ...

  8. centos7 下google Kubernetes(k8s)集群安装部署

    centos7 下google Kubernetes(k8s)集群安装部署 简介 安装环境 安装前准备 ECTD集群配置 命令含义: master节点配置 1.安装kubernetes和etcd 2. ...

  9. k8s(七)—statefullset部署mysql主从集群

    1 使用statefullset部署mysql主从集群 mysql-0是master mysql-1和mysql-2是两个备份 当mysql写的时候,找headless service中的mysql- ...

最新文章

  1. oracle netca 乱码,Oracle 11g 安装及netca,dbca乱码之解决
  2. Python的基本语法
  3. 【Android Binder 系统】一、Binder 系统核心 ( IPC 进程间通信 | RPC 远程调用 )
  4. Hibernate Tools-代码生成
  5. 【孤儿进程】孤儿进程组、守护进程
  6. 干货!操作系统基础知识汇总!转给要面试的同学吧
  7. so库文件控制导出符号
  8. [opencv] 图像线性混合
  9. MTK 驱动开发(41)---MTK 调试工具
  10. openresty入门 方法及指令
  11. 尝试Adam代替梯度下降
  12. 本人从事软件技术开发也有多年,打算先尝试往外迈一步试试!
  13. ArrayList转换类型为DataTable类型
  14. bcd转ascii码 流程图_十进制ASCII与BCD码转换程序清单
  15. 如何清除计算机的u盘使用记录,如何消除电脑上U盘使用记录
  16. 群晖NAS设备MIB手册
  17. Java项目:ssm学生学籍管理系统
  18. 湿化学清洗过程中晶片污染控制方法
  19. python伪装ip_Python爬虫:使用IP代理池伪装你的IP地址继续爬
  20. 集线器,路由器,交换机的作用和差别是什么?怎样区分交换机,集线器,路由器?...

热门文章

  1. clearcase命令指南
  2. font awesome矢量字体使用
  3. 用手写板向计算机输入汉字是什么技术,手写板是什么
  4. JAVA毕设项目医院病历管理系统(java+VUE+Mybatis+Maven+Mysql)
  5. responserequest概述
  6. 向大佬学习C语言1198: 考试排名(二)(结构体专题)
  7. 微信小程序云开发:使用cms平台来创建json数组
  8. java 代码加壳,关于java加壳和代码混淆
  9. [转] Android开发环境的搭建 Android虚拟机搭建 安卓开发环境搭建
  10. OpenSSL SSL_read: Connection was aborted, errno 10053的问题