首先在k8s中,k8s会根据每个work节点的配置,负载差异,自动生成优选函数,根据优选函数,当master节点分配下来任务时,将pod分配带最适合运行的node节点上。

之外我们技术人员还有以下三种方式去影响我们的pod调度,

  1. node节点调度器
  2. 亲和性调度
  3. 污点容忍度

区别和实例操作

一 .node节点调度

是最直接的调度方式,简单粗暴,所以常用在简单的集群架构中,负载的资源分类和编制不适合这种方式,
解释:大概意思就是给我们的work节点绑定唯一便签,然后在pod的yml文件中去设置node便签匹配器绑定节点,这样就能实现影响k8s优选参数的选择,让当前的pod启动在设置的node节点上。

1、首先通过 kubectl 给 node 打上标签

格式:
kubectl label nodes <node-name> <label-key>=<label-value>
[root@k8s-master ~]# kubectl label nodes k8s-node01 zone=sh
[root@k8s-master ~]# kubectl get nodes --show-labels

2、通过 nodeSelector 调度 pod 到 node

  • Pod的定义中通过nodeSelector指定label标签,pod将会只调度到具有该标签的node之上
[root@k8s-master ~]# vim pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:name: nginxlabels:env: test
spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentnodeSelector:disktype: ssd
  • 这个例子中pod只会调度到具有 disktype=ssd 的 node 上面.
  • 验证 节点调度
[root@k8s-master ~]# kubectl apply -f pod-demo.yaml
[root@k8s-master ~]# kubectl get pods -o wide
[root@k8s-master ~]# kubectl describe pod  pod-demo   ##查看事件

二 .亲和性调度

较复杂,应用在复杂的多节点归类,资源分类管理的中大型集群中,有硬亲和,软亲和,亲和性和反亲和,两两为一组,反义词


硬亲和:匹配节点上的其中一个或多个标签(必须存在一个)
软亲和:匹配节点上的其中一个或多个标签(有则选择这个node,没有就参考优选函数)

1.硬亲和

[root@k8s-master ~]# vim pod-nodeaffinity-demo.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-node-affinity-demolabels:app: myapptier: frontend
spec:containers:- name: myappimage: ikubernetes/myapp:v1affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: zoneoperator: Invalues:- foo- bar[root@k8s-master ~]# kubectl apply -f pod-nodeaffinity-demo.yaml[root@k8s-master ~]# kubectl describe pod pod-node-affinity-demo
# 运行结果:
Warning  FailedScheduling  2s (x8 over 20s)  default-scheduler  0/3 nodes are available: 3 node(s) didn't match node selector.# 给其中一个node打上foo的标签
[root@k8s-master ~]# kubectl label node k8s-node01 zone=foo# 正常启动
[root@k8s-master ~]# kubectl get pods

2.软亲和

[root@k8s-master ~]# vim pod-nodeaffinity-demo-2.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-node-affinity-demo-2labels:app: myapptier: frontend
spec:containers:- name: myappimage: ikubernetes/myapp:v1affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- preference:matchExpressions:- key: zoneoperator: Invalues:- foo- barweight: 60- preference:matchExpressions:- key: zone1operator: Invalues:- foo1- bar1weight: 10 [root@k8s-master ~]# kubectl apply -f pod-nodeaffinity-demo-2.yaml

3.同时存在时(硬,软亲和)

apiVersion: v1
kind: Pod
metadata:name: with-node-affinity
spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: zoneoperator: Invalues:- devpreferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: disktypeoperator: Invalues:- ssdcontainers:- name: with-node-affinityimage: nginx

结果:同时存在的话先判断上下顺序,从上到下选择范围,列如硬亲和在上,软亲和在下,就会先选必须匹配到一个标签的多个node上,然后软亲和继续从这些节点去选择,反之亦然。


亲和性:首先是先有一个pod,然后根据上一个pod(辨识标签)在哪里节点启动,就会跟随到这个节点上去启动。
反亲和:查看前面的那个pod的启动节点,必须和它启动到不是一个节点上

1.亲和性

[root@k8s-master ~]# vim pod-required-affinity-demo.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-firstlabels:app: myapptier: frontend
spec:containers:- name: myappimage: ikubernetes/myapp:v1
---
apiVersion: v1
kind: Pod
metadata:name: pod-secondlabels:app: dbtier: db
spec:containers:- name: busyboximage: busyboximagePullPolicy: IfNotPresentcommand: ["sh","-c","sleep 3600"]affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- {key: app, operator: In, values: ["myapp"]}topologyKey: kubernetes.io/hostname[root@k8s-master ~]# kubectl apply -f pod-required-affinity-demo.yaml [root@k8s-master ~]# kubectl get pods -o wide
# 运行结果,两个 pod 在同一 node 节点上
NAME         READY   STATUS    RESTARTS   AGE   IP           NODE
pod-first    1/1     Running   0          11s   10.244.1.6   k8s-node01
pod-second   1/1     Running   0          11s   10.244.1.5   k8s-node01[root@k8s-master ~]# kubectl delete -f pod-required-affinity-demo.yaml

2.反亲和性

[root@k8s-master ~]# vim pod-required-anti-affinity-demo.yaml
# 内容为
apiVersion: v1
kind: Pod
metadata:name: pod-firstlabels:app: myapptier: frontend
spec:containers:- name: myappimage: ikubernetes/myapp:v1
---
apiVersion: v1
kind: Pod
metadata:name: pod-secondlabels:app: backendtier: db
spec:containers:- name: busyboximage: busybox:latestimagePullPolicy: IfNotPresentcommand: ["sh","-c","sleep 3600"]affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- {key: app, operator: In, values: ["myapp"]}topologyKey: kubernetes.io/hostname[root@k8s-master ~]# kubectl apply -f pod-required-anti-affinity-demo.yaml [root@k8s-master ~]# kubectl get pods -o wide
# 运行结果,两个 pod 不在同一个 node
NAME         READY   STATUS    RESTARTS   AGE   IP           NODE
pod-first    1/1     Running   0          5s    10.244.2.4   k8s-node02
pod-second   1/1     Running   0          5s    10.244.1.7   k8s-node01[root@k8s-master ~]# kubectl delete -f pod-required-anti-affinity-demo.yaml

3.同时存在时(亲和性,反亲和性)

这里就不举例的,直接说一下结果
首先肯定是两个条件的匹配条件不能一样
这时候就会满足两个条件去选择条件,比如,当亲和性在上,反亲和在下,pod会先选择匹配到条件的一些节点上去选择,然后在从中匹配到反亲和的条件,如果有那就必须踢出它,选择其他符合条件的节点。

三.污点和容忍度

与之前两个调度方式不同,污点是首先给节点绑定污点,作用是保护节点,不再让这个节点会scheduler(资源调度)选为pod启动环境。
我们集群中master就是设置污点,所以你启动任何pod都不会在master上工作,保证master的工作效率。

相关参数

介绍几个用到的参数

  • operator 可以定义为

    • Equal:表示key是否等于value,默认
    • Exists:表示key是否存在,此时无需定义value
  • tain 的 effect 定义对 Pod 排斥效果
    • NoSchedule:仅影响调度过程,对现存的Pod对象不产生影响;
    • NoExecute:既影响调度过程,也影响现有的Pod对象;不容忍的Pod对象将被驱逐
    • PreferNoSchedule: 表示尽量不调度

查看节点的污点

kubectl describe node k8s-node01 | grep Taints

设置污点

kubectl taint node k8s-node01 node-type=production:NoSchedule

创建容器测试

[root@k8s-master ~]# vim deploy-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: myapp-deploynamespace: default
spec:replicas: 2selector:matchLabels:app: myapprelease: canarytemplate:metadata:labels:app: myapprelease: canaryspec:containers:- name: myappimage: ikubernetes/myapp:v1ports:- name: httpcontainerPort: 80[root@k8s-master ~]# kubectl apply -f deploy-demo.yaml [root@k8s-master ~]# kubectl get pods -o wide
# 运行结果:
NAME                            READY   STATUS    RESTARTS   AGE   IP           NODE
myapp-deploy-69b47bc96d-cwt79   1/1     Running   0          5s    10.244.2.6   k8s-node02
myapp-deploy-69b47bc96d-qqrwq   1/1     Running   0          5s    10.244.2.5   k8s-node02

所以只能启动到没有污点的node2节点上

设置一个能容忍node1污点的pod测试

[root@k8s-master ~]# vim deploy-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: myapp-deploynamespace: defaultm
spec:replicas: 2selector:matchLabels:app: myapprelease: canarytemplate:metadata:labels:app: myapprelease: canaryspec:containers:- name: myappimage: ikubernetes/myapp:v2ports:- name: httpcontainerPort: 80tolerations:- key: "node-type"operator: "Equal"value: "production"effect: "NoSchedule"[root@k8s-master ~]# kubectl apply -f deploy-demo.yaml

测试

[root@k8s-master ~]# kubectl get pods -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP            NODE
myapp-deploy-65cc47f858-tmpnz   1/1     Running   0          10s   10.244.1.10   k8s-node01
myapp-deploy-65cc47f858-xnklh   1/1     Running   0          13s   10.244.1.9    k8s-node01

其他参数的作用

  • 定义Toleration,是否存在 node-type 这个key 且 effect 值为 NoSchedule
[root@k8s-master ~]# vim deploy-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: myapp-deploynamespace: default
spec:replicas: 2selector:matchLabels:app: myapprelease: canarytemplate:metadata:labels:app: myapprelease: canaryspec:containers:- name: myappimage: ikubernetes/myapp:v2ports:- name: httpcontainerPort: 80tolerations:- key: "node-type"operator: "Exists"value: ""effect: "NoSchedule"[root@k8s-master ~]# kubectl apply -f deploy-demo.yaml[root@k8s-master ~]# kubectl get pods -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP            NODE
myapp-deploy-559f559bcc-6jfqq   1/1     Running   0          10s   10.244.1.11   k8s-node01
myapp-deploy-559f559bcc-rlwp2   1/1     Running   0          9s    10.244.1.12   k8s-node01
  • 定义Toleration,是否存在 node-type 这个key 且 effect 值为空,则包含所有的值
[root@k8s-master ~]# vim deploy-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: myapp-deploynamespace: default
spec:replicas: 2selector:matchLabels:app: myapprelease: canarytemplate:metadata:labels:app: myapprelease: canaryspec:containers:- name: myappimage: ikubernetes/myapp:v2ports:- name: httpcontainerPort: 80tolerations:- key: "node-type"operator: "Exists"value: ""effect: ""[root@k8s-master ~]# kubectl apply -f deploy-demo.yaml# 两个 pod 均衡调度到两个节点
kubectl get pods -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP            NODE
myapp-deploy-5d9c6985f5-hn4k2   1/1     Running   0          2m    10.244.1.13   k8s-node01
myapp-deploy-5d9c6985f5-lkf9q   1/1     Running   0          2m    10.244.2.7    k8s-node02

------没有足够的努力,就不要去谈未来和远方,因为谁不会吹呢------

转载至https://blog.csdn.net/ht9999i/article/details/108037568

k8s-Pod调度策略(入门攻略)相关推荐

  1. 云原生|kubernetes |一文带你搞懂pod调度策略,驱逐策略,污点、容忍调度

    前言: kubernetes集群不是简单的安装部署就完事了,还需要根据业务的性质设定一些策略,比如,某些pod不希望被调度到硬件条件比较差的节点,某些pod又希望调度到含有比如有特定的硬件GPU的节点 ...

  2. k8s pod 详解

    https://www.cnblogs.com/kevingrace/p/11309409.html 一.什么是Pod kubernetes中的一切都可以理解为是一种资源对象,pod,rc,servi ...

  3. K8S - Pod 的概念和简介

    1. POD的基本概念 Pod 是K8s 系统中可以创建(部署)和管理的最小单元. Pod 里面可以包含多个容器(多实例),是一组容器的集合. 也就是讲K8S 不会直接管理容器 1个POD中的容器共享 ...

  4. kubernetes 之 pod 调度策略(一)

    前言: 在 kubernetes 集群当中,我们很少直接创建一个 pod 来启动应用服务,而是通过控制器来创建 pod 从而运行应用实例,比如: Deployment.DaemonSet.Job 等控 ...

  5. K8S Pod该如何监控

    背景 由于业务容器化的推进,对K8S上运行的业务,也必须做到向之前物理机/虚拟机上一样,要有完备的监控保障.但是,毕竟K8S不是物理机/虚拟机,由于技术实现方式不同,监控方面也是有一定差别的. Pod ...

  6. k8s pod基础概念

    k8s pod基础概念 Pod基础概念: Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象.一个Pod代表着集群中运行的一个进程.kubernetes中其他大 ...

  7. k8s每天报告服务器状态信息,[工作随笔] 配置 cron 检查 K8s Pod 存活状态以推送钉钉消息...

    背景 前段时间接手了一份维护老系统的任务.该系统使用了早期的 Spring Cloud 全家桶,其中有一个微服务随着时间运行会出现大量 CLOSE_WAIT 状态的 socket 连接以至于堵塞网关, ...

  8. K8s Pod优雅关闭,没你想象的那么简单!

    更新部署服务时,旧的 Pod 会终止,新 Pod 上位.如果在这个部署过程中老 Pod 有一个很长的操作,我们想在这个操作成功完成后杀死这个 pod(优雅关闭),如果无法做到的话,被杀死的 pod 可 ...

  9. 混沌工程之ChaosToolkit使用之一删除K8s POD

    混沌工程之ChaosToolkit使用之一删除K8s POD 1.概述 今天我们来玩一下混沌工程的开源工具chaostoolkit . 它的目标是提供一个免费,开放,社区驱动的工具集以及api. 2. ...

  10. K8S POD无限重启问题

    记录一次K8S POD无限重启 项目在K8S上无限重启 问题排查 发现问题 解决方案 最终成果 项目在K8S上无限重启 项目无限重启,不可用. 问题排查 首先查看k8s描述. kubectl desc ...

最新文章

  1. Linux系统中创建大文件,并作为文件系统使用
  2. python怎么画函数图_可视化|Python绘制桑基图
  3. Linux桌面资源监视器,rsmo-linux下与桌面相嵌的系统资源监视器(转)
  4. 2021-01-16交叉熵损失函数比均方误差损失函数优点在哪里
  5. mysql 查询调试_使用MySQL慢速查询日志进行调试
  6. 【若依(ruoyi)】树表代码生成
  7. 无法将文件ftp服务器上,ftp服务器上传不了文件
  8. 郁闷的 ConfigurationManager.OpenExeConfiguration
  9. “并行程序VS串行程序”——并行程序优化实录
  10. Linux XZ压缩格式学习
  11. java 利用同步工具类控制线程
  12. nginx 访问频率限制配置
  13. PB高拍仪无纸化软件方案
  14. picgo+onedrive+Typora用onedrive当图床
  15. Illegal mix of collations
  16. 服务器数码管不显示,数码管常见故障及检修方法
  17. 计算机工程师标准着装,工程师穿什么样的衣服才好看
  18. 英文版红帽linux设置屏保,Linux下屏保设置
  19. 这个行业一半人月薪超过8千!
  20. 魔方复原(BFS+剪枝)

热门文章

  1. 华为机试2022.4.13:硬件资源分配
  2. Ubuntu20.04谷歌浏览器安装json格式化工具jsonviewer
  3. 射频同轴连接器市场现状及未来发展趋势
  4. 机械硬盘速度测试软件用哪个,硬盘测评,脱颖而出的果然是它!
  5. 先码后看 severlet开发基础 侵立删
  6. Bluetooth CSR部分笔记
  7. iframe跨域消息传递
  8. Android 图形系统概述
  9. 2021前端react面试题汇总
  10. Windows7操作系统的安装