部署k8s(16):集群调度策略的四种方案
一、调度说明
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):集群调度策略的四种方案相关推荐
- 使用Kubespray部署k8s生产集群
夫君子之行,静以修身,俭以养德,非淡泊无以明志,非宁静无以致远. 夫学须静也,才须学也,非学无以广才,非志无以成学.淫慢则不能励精,险躁则不能冶性. 年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐, ...
- 部署k8s ssl集群实践12:work节点配置docker
部署docker 旧的三节点docker已经安装好 只需要安装新节点的docker 但是所有节点都需要修改docker配置文件 安装参考前面的基础篇里的安装方法 所有work节点都需要修改以下参数 需 ...
- 银河麒麟高级服务器操作系统V10上安装k8s单机集群
前言 本文介绍银河麒麟高级服务器操作系统V10上安装部署k8s单机集群及一些基础的kubectl指令 本文涉及部署脚本主要源自基于https://github.com/easzlab/kubeasz在 ...
- 这一篇 K8S(Kubernetes)集群部署 我觉得还可以
点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 国内安装K8S的四种途径 Kubernetes 的安装其实并不复杂,因为Kubernetes 属 ...
- k8s redis集群_基于K8S部署redis哨兵集群
本 文 主 要 内 容 什么是Kubernetes分布式容器管理平台 PaaS平台redis-sentinel集群架构简介 PaaS平台部署redis哨兵集群 redis-sentinel容器测试及验 ...
- Kubernetes(K8s)集群安装部署
Kubernetes(K8s)集群安装 Kubernetes(K8s)集群安装 1 .基本环境配置 1.1.Kubernetes集群规划 1.2.基础环境配置(所有节点) 1.2.1.Host文件修改 ...
- k8s多集群搭建istio共享控制平面(多网络)及部署grpc服务分流实践
个人博客原文:http://www.lampnick.com/php/913 本文目标 部署一个多集群的共享的istio服务网格 部署一套基于grpc的服务 对grpc服务进行流量管理 架构图如下 前 ...
- centos7 下google Kubernetes(k8s)集群安装部署
centos7 下google Kubernetes(k8s)集群安装部署 简介 安装环境 安装前准备 ECTD集群配置 命令含义: master节点配置 1.安装kubernetes和etcd 2. ...
- k8s(七)—statefullset部署mysql主从集群
1 使用statefullset部署mysql主从集群 mysql-0是master mysql-1和mysql-2是两个备份 当mysql写的时候,找headless service中的mysql- ...
最新文章
- oracle netca 乱码,Oracle 11g 安装及netca,dbca乱码之解决
- Python的基本语法
- 【Android Binder 系统】一、Binder 系统核心 ( IPC 进程间通信 | RPC 远程调用 )
- Hibernate Tools-代码生成
- 【孤儿进程】孤儿进程组、守护进程
- 干货!操作系统基础知识汇总!转给要面试的同学吧
- so库文件控制导出符号
- [opencv] 图像线性混合
- MTK 驱动开发(41)---MTK 调试工具
- openresty入门 方法及指令
- 尝试Adam代替梯度下降
- 本人从事软件技术开发也有多年,打算先尝试往外迈一步试试!
- ArrayList转换类型为DataTable类型
- bcd转ascii码 流程图_十进制ASCII与BCD码转换程序清单
- 如何清除计算机的u盘使用记录,如何消除电脑上U盘使用记录
- 群晖NAS设备MIB手册
- Java项目:ssm学生学籍管理系统
- 湿化学清洗过程中晶片污染控制方法
- python伪装ip_Python爬虫:使用IP代理池伪装你的IP地址继续爬
- 集线器,路由器,交换机的作用和差别是什么?怎样区分交换机,集线器,路由器?...
热门文章
- clearcase命令指南
- font awesome矢量字体使用
- 用手写板向计算机输入汉字是什么技术,手写板是什么
- JAVA毕设项目医院病历管理系统(java+VUE+Mybatis+Maven+Mysql)
- responserequest概述
- 向大佬学习C语言1198: 考试排名(二)(结构体专题)
- 微信小程序云开发:使用cms平台来创建json数组
- java 代码加壳,关于java加壳和代码混淆
- [转] Android开发环境的搭建 Android虚拟机搭建 安卓开发环境搭建
- OpenSSL SSL_read: Connection was aborted, errno 10053的问题