Mr. Cappuccino的第41杯咖啡——Kubernetes之Pod调度策略

news2024/11/17 11:55:47

Kubernetes之Pod调度策略

      • Pod的4种调度策略
      • 定向调度
        • nodeName
        • nodeSelector
      • 亲和性调度
        • node亲和性
          • 硬限制
          • 软限制
          • 关系运算符
        • pod亲和性
        • pod反亲和性
        • 污点和容忍
          • 污点(taints)
          • 容忍(tolerations)

默认情况下,Scheduler计算出一个Pod运行在哪个Node节点上,我们也可以直接指定该Pod运行在哪个Node节点上。

Pod的4种调度策略

  1. 自动调度:Pod运行在哪个节点完全由Scheduler经过一系列算法计算得出;
  2. 定向调度:采用nodeName、nodeSelector来实现Pod定向调度
  3. 亲和性调度:NodeAffinityinity、PodAffinity、PodAntiAffinity
  4. 污点、容忍调度:Taints、Toleration

定向调度

通过在定义Pod时,设置nodeName、nodeSelector等字段来实现Pod定向调度到指定的节点上。

nodeName

nodeName用于将Pod调度到指定(强制约束)的Node节点上,跳过Scheduler的调度逻辑,直接将Pod调度到指定的Node节点上,如果指定的Node不存在,也会继续往上调度,只不过Pod将会运行失败。

cat /etc/hosts

在这里插入图片描述

apiVersion: v1
kind: Pod
metadata:
  name: pod-scheduler
  namespace: bubble-dev
spec:
  containers:
  - name: nginx-container
    image: nginx:1.17.9
  nodeName: node2 # 指定该pod运行在node2节点
kubectl create ns bubble-dev
vi pod-scheduler.yaml
cat pod-scheduler.yaml
kubectl create -f pod-scheduler.yaml
kubectl describe pods -n bubble-dev

在这里插入图片描述
在这里插入图片描述

nodeSelector

nodeSelector用于将Pod调度到指定标签上的Node节点,它通过k8s的标签选择器实现,也就是说,Scheduler使用MathNodeSelector调度策略进行Label匹配,找出目标Node,然后将Pod调度到目标节点,该匹配规则也是强制约束,即如果没有匹配到满足条件的Node节点,也会继续往上调度,只不过Pod将会运行失败。

kubectl get nodes --show-labels

在这里插入图片描述
给Node节点创建标签

kubectl label nodes node1 nodev=v1
kubectl label nodes node2 nodev=v2

在这里插入图片描述

apiVersion: v1
kind: Pod
metadata:
  name: pod-scheduler
  namespace: bubble-dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.9
  nodeSelector:
    nodev: v2 # 指定该pod运行到标签为nodev=v2的node节点上
kubectl delete ns bubble-dev
kubectl create ns bubble-dev
vi pod-scheduler.yaml
cat pod-scheduler.yaml
kubectl create -f pod-scheduler.yaml
kubectl describe pods -n bubble-dev

在这里插入图片描述
在这里插入图片描述

亲和性调度

nodeName和nodeSelector都属于定向调度,都是强制性的,即如果没有Node匹配上,Pod就会运行失败,这显然太过于死板,不够圆滑,所以Kubernetes还提供了亲和性调度。
亲和性调度是在nodeSelector的基础上进行了扩展,通过配置的形式,实现优先选择满足条件的Node进行调度,如果没有,也可以调度到不满足条件的节点上,实现调度更加灵活。

nodeAffinity(node亲和性):以node为目标,解决pod可以调度到哪些node的问题;
podAffinity(pod亲和性):以某个pod为目标将pod调度到其附近,解决pod可以和哪些已存在的pod部署在同一个拓扑域中的问题;
podAntiAffinity(pod反亲和性):以pod为目标,解决pod不可以和哪些已存在的pod部署在同一个拓扑域中的问题;

node亲和性

硬限制

通过指定的规则,如果没有找到具体运行的Node节点,则会报错。

apiVersion: v1
kind: Pod
metadata:
  name: pod-required
  namespace: bubble-dev
spec:
  containers: 
  - name: nginx
    image: nginx:1.17.9
  affinity: # 设置亲和性
    nodeAffinity: # node亲和性
      requiredDuringSchedulingIgnoredDuringExecution: # 硬限制
        nodeSelectorTerms:
        - matchExpressions: # 匹配标签中含有nodev=v3或nodev=v4的node节点
          - key: nodev
            operator: In
            values: ["v3" , "v4"]
kubectl delete ns bubble-dev
kubectl create ns bubble-dev
vi pod-required.yaml
cat pod-required.yaml
kubectl create -f pod-required.yaml
kubectl describe pods -n bubble-dev

在这里插入图片描述

软限制

优先走指定的规则,如果没有找到具体运行的Node节点,则会采用随机分配的方式将Pod运行在Node节点上。

apiVersion: v1
kind: Pod
metadata:
  name: pod-preferred
  namespace: bubble-dev
spec:
  containers: 
  - name: nginx
    image: nginx:1.17.9
  affinity: # 设置亲和性
    nodeAffinity: # node亲和性
      preferredDuringSchedulingIgnoredDuringExecution: # 软限制
      - weight: 1
        preference:
          matchExpressions: # 匹配标签中含有nodev=v3或nodev=v4的node节点
          - key: nodev
            operator: In
            values: ["v3" , "v4"]
kubectl delete ns bubble-dev
kubectl create ns bubble-dev
vi pod-preferred.yaml
cat pod-preferred.yaml
kubectl create -f pod-preferred.yaml
kubectl describe pods -n bubble-dev

在这里插入图片描述

关系运算符
1. In        # 在,表示key的值在指定的列表其中一项即可匹配成功;
2. NotIn     # 与In相反,表示key的值不在指定的列表,满足的话即表示匹配成功;
3. Exists    # 存在,存在是对标签的key而言,表示存在指定的key则表示匹配成功,使用Exists的话不用写value,因为Exists是针对key而言;
4. Gt        # greater than的简写,大于的意思,表示大于指定的值则匹配成功;
5. Lt        # less than的简写,小于的意思,表示小于指定的值则匹配成功;
6. DoesNotExists  # 不存在该标签的节点

pod亲和性

pod亲和性调度也可以分为硬亲和性调度和软亲和性调度,以下案例为硬亲和性调度

apiVersion: v1 
kind: Pod
metadata:
  name: pod-v1
  namespace: bubble-dev
  labels:
    podv: v1 # 设置标签
spec:
  containers:
  - name: nginx
    image: nginx:1.17.9
  nodeName: node1

---
apiVersion: v1 
kind: Pod
metadata:
  name: pod-v2
  namespace: bubble-dev
  labels:
    podv: v2 # 设置标签
spec:
  containers:
  - name: nginx
    image: nginx:1.17.9
  nodeName: node2

---

apiVersion: v1
kind: Pod
metadata:
  name: pod-affinity
  namespace: bubble-dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.9
  affinity: # 设置亲和性
    podAffinity: # pod亲和性
      requiredDuringSchedulingIgnoredDuringExecution: # 硬限制
      - labelSelector:
          matchExpressions: # 匹配标签中含有podv=v1的pod
          - key: podv
            operator: In
            values: ["v1"] 
        topologyKey: kubernetes.io/hostname
kubectl delete ns bubble-dev
kubectl create ns bubble-dev
vi pod-affinity.yaml
cat pod-affinity.yaml
kubectl create -f pod-affinity.yaml
kubectl describe pods -n bubble-dev

在这里插入图片描述
pod-v1运行在node1节点上,pod-v2运行在node2节点上,而pod-affinity会以标签中包含podv=v1的pod为目标调度到其附近,最终pod-affinity也会运行在node1节点上。
在这里插入图片描述

pod反亲和性

pod反亲和性调度也可以分为硬反亲和性调度和软反亲和性调度,以下案例为硬反亲和性调度

apiVersion: v1
kind: Pod
metadata:
  name: pod-antiaffinity
  namespace: bubble-dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.9
  affinity: # 设置亲和性
    podAntiAffinity: # pod反亲和性
      requiredDuringSchedulingIgnoredDuringExecution: # 硬限制
      - labelSelector:
          matchExpressions: # 匹配标签中含有podv=v1的pod
          - key: podv
            operator: In
            values: ["v1"] 
        topologyKey: kubernetes.io/hostname
vi pod-antiaffinity.yaml
cat pod-antiaffinity.yaml
kubectl create -f pod-antiaffinity.yaml
kubectl describe pods -n bubble-dev

pod-antiaffinity会远离标签中包含podv=v1的pod,最终运行在node2节点上。
在这里插入图片描述

污点和容忍

污点(taints)

污点,taints是定义在Node节点之上的键值型属性数据,用于让Node节点拒绝将Pod调度运行于其上,除非该Pod对象具有接纳节点污点的容忍度。污点也是我们Pod调度中的一种调度策略,污点作用在Node节点上,当为某个Node节点打上污点,则表示该Node是否允许Pod调度过来,而我们的Master节点上就有一个污点,所以你能看到Pod是不允许调度到Master节点上的。

污点的格式:key=value:effect,key和value是污点的标签,可以自行拟定,effect描述污点的作用,effect支持如下三个选项:

PreferNoSchedul: kubernetes将尽量避免把pod调度到具有该污点的node上,除非没有其他节点可调度;
NoSchedule: kubernetes将不会把pod调度到具有该污点的node上,但不会影响当前node已存在的pod;
NoExecute: kubernetes将不会把pod调度到具有该污点的node上,同时还会驱逐node上已存在的pod;

# 设置污点,指定标签为dedicated=special-user,策略为NoSchedule,如果该标签已存在则更新策略
kubectl taint nodes node1 dedicated=special-user:NoSchedule

# 移除key为dedicated的NoSchedule污点
kubectl taint nodes node1 dedicated:NoSchedule-

# 移除key为dedicated的所有污点
kubectl taint nodes node1 dedicated-

# 查看污点
kubectl describe nodes node1 | grep Taints

在这里插入图片描述

容忍(tolerations)

污点的作用是拒绝Pod调度,而容忍定义于Pod上,表示Pod允许Node节点上有污点,并且还会往含有对应污点的节点上调度。

apiVersion: v1
kind: Pod
metadata:
  name: pod-tolerations
  namespace: bubble-dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.9
  tolerations:				# 设置容忍,与containers同级,容忍是针对pod而言的
  - key: "dedicated"		# 对应node上要容忍污点的键,空则表示匹配所有键
    value: "special-user"	# 对应要容忍污点的值
    operator: "Equal"		# 运行符,有两个参数Equal和Exists(默认),如果设置为Exists时,不需要写value
    effect: "NoExecute"  	# 对应污点的effect,空也意味着匹配所有
#   tolerationSeconds: 10	# 容忍时间,当且仅当effect为NoExecute时该参数生效,表示pod在node上的停留时间
kubectl taint nodes node1 dedicated=special-user:NoExecute
kubectl taint nodes node2 dedicated=special-user:NoSchedule
vi pod-tolerations.yaml
cat pod-tolerations.yaml
kubectl create -f pod-tolerations.yaml
kubectl describe pods -n bubble-dev

为了方便测试,我们在node1和node2节点上都加上了污点。由于设置的容忍与node1的污点相匹配,所以该pod最终调度到了node1节点上。
在这里插入图片描述
如果所有的node节点都不匹配的话,则pod会运行失败。

apiVersion: v1
kind: Pod
metadata:
  name: pod-test
  namespace: bubble-dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.9
  tolerations:				# 设置容忍,与containers同级,容忍是针对pod而言的
  - key: "dedicated"		# 对应node上要容忍污点的键,空则表示匹配所有键
    value: "special-root"	# 对应要容忍污点的值
    operator: "Equal"		# 运行符,有两个参数Equal和Exists(默认),如果设置为Exists时,不需要写value
    effect: "NoExecute"  	# 对应污点的effect,空也意味着匹配所有
#   tolerationSeconds: 10	# 容忍时间,当且仅当effect为NoExecute时该参数生效,表示pod在node上的停留时间
vi pod-test.yaml
cat pod-test.yaml
kubectl create -f pod-test.yaml
kubectl describe pods -n bubble-dev

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/353765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

conda 搭建tensorflow-GPU和pycharm以及VS2022 软件环境配置

conda 搭建tensorflow-GPU和pycharm以及VS2022 软件环境配置一、TensorFlow 环境配置安装1. Anaconda下载安装2.conda创建tensorflow环境二、pycharm以及VS2022 环境配置2.1 pycharm 软件安装以及环境配置2.2.1 pycharm 软件安装2.2.2 pycharm 软件conda环境配置2.2 Visual Stu…

注意!华为折叠屏手机的原厂膜不能自己撕!

对于用惯了直板手机的朋友来说,新机开箱撕膜是一件十分有“仪式感”的事情,但是对于折叠屏手机来说,这样的操作万万不可。华为折叠屏手机在使用的过程中也有着和传统智能手机不一样的注意事项,下面这几点大家在入手折叠屏手机之后…

如何利用Power Virtual Agents机器人进行设备维修登记

今天我们来介绍如何利用PVA聊天机器人进行设备维修登记。设计思路是在PVA聊天机器人的对话框中输入“设备维修”触发短语后进行设备维修登记,然后通过自动化流程将维修信息存入到Lists中并通过邮件的形式发送给负责设备维修的人员。 首先,在PVA聊天机器人…

【yolov5】将标注好的数据集进行划分(附完整可运行python代码)

问题描述 准备使用yolov5训练自己的模型,自己将下载的开源数据集按照自己的要求重新标注了一下,然后现在对其进行划分。 问题分析 划分数据集主要的步骤就是,首先要将数据集打乱顺序,然后按照一定的比例将其分为训练集&#xf…

【Blender】使用Blender渲染一段360度旋转的动画

目录一、前言二、方法描述三、渲染设置四、结果一、前言 本文主要讲述了如何使用Blender渲染一段物体360度旋转的动画。 渲染好的效果如下: 二、方法描述 第一步:shiftA,我们在Blender里新建一个平面 第二步:摁s键(scale)&…

(三十五)Vue之过渡与动画

文章目录概述单元素/组件的过渡CSS动画CSS过渡多元素/组件的过渡集成第三方动画Animate上一篇:(三十四)Vue之新生命周期钩子nextTick 概述 Vue 在插入、更新或者移除 DOM 时,提供多种不同方式的应用过渡效果。包括以下工具&…

PyTorch常用的损失函数(ChatGPT)

L1Loss nn.L1Loss 也称为平均绝对误差(Mean Absolute Error,MAE)。它计算预测值与真实值之间的差异(即误差),然后取绝对值并求和,最后除以样本数量得到平均误差。具体来说,对于一批…

萌新应该如何开始学习走向自动化测试高薪岗位?

对于测试人员来说,不管进行功能测试还是自动化测试,还是性能测试,都是需要编写测试用例,所以我们必须先要了解清楚手工测试用例与自动化测试用例的一些特点,才能更好的开展自动化测试工作。1.1手工测试用例和自动化测试…

最新中文版Studio One6音乐制作DAW工具

你现在用的是什麽 DAW?大家常常在说的 DAW ,就是指数位音乐工作站软件,像是常见的 Ableton、Logic、Protools、Cubase 等等,这些都算是 DAW。以上的例子,他们的完整版几乎都是需要花费购买的,当然也有一些免…

【Go基础】Socket和WebSocket编程

文章目录一、Socket编程1. 网络通信过程2. TCP CS架构2.1 网络通信模型2.2 TCP协议解读2.3 Go TCP编程3. UDP CS架构3.1 UDP协议解读3.2 Go UDP编程二、WebSocket编程1. WebSocket协议解读2. WebSocket CS架构实现3. 聊于室实现一、Socket编程 1. 网络通信过程 DMA&#xff1a…

Elasticsearch - Configuring security in Elasticsearch 开启用户名和密码访问

文章目录概述实操Step 1 验证当前版本是否支持安全功能Step 2 打开安全设置Step 3 配置节点间通讯传输的安全性创建证书颁发机构为Elasticsearch集群中的节点生成证书Step 4 修改 elasticsearch.yml配置设置 用户名和密码概述 ES版本: 7.6 官方指导手册&#xff1…

Spring MVC之WebApplicationContext 容器的初始化

简介因为 spring-mvc项目,是 spring-framework的子项目,所以需要拉取 spring-framework整个工程,包含 Spring 所有的子项目前期准备工作源码拉取从 Spring 的 Git 仓库 Fork 项目到自己的 Git 仓库,方便我们在阅读源码的过程中&am…

3年软件测试工作经验裸辞,有点后悔了...

2019年毕业,现在有3年的软件测试工作经验,刚毕业前半年在一家知名上市公司,后面则进入一家传统行业公司待到现在2年半。 由于看不到技术成长以及其他原因,上上周辞职了,目前交接中,下个月中旬就得离开了&a…

基于国产龙芯 CPU 的气井工业网关研究与设计(一)

当前,我国气田的自动化控制程度还未完全普及,并且与世界已普及的气井站的自 动化程度也存在一定的差距。而在天然气资源相对丰富的国家,开采过程中设备研发资 金投入较大,研发周期较长,更新了一代又一代的自动化开采系…

看过来,u盘删除的文件还能找回吗?两种方法,

u盘删除的文件还能找回吗?u盘,全称USB闪存驱动器,它不需物理驱动器,即插即用,且其存储容量远超过软盘,方便携带使用。u盘作为我们常用的存储设备,也是有自己不同功能和划分。以下例举了几种&…

ArcGIS API for JavaScript 4.15系列(8)——Dojo中类的定义

1、前言 JavaScript本质上是基于原型继承的一种编程语言,在ES6标准出现以前,JavaScript定义类的方式往往让人很难理解。而Dojo则很好地解决了这个问题。开发者可以通过dojo/_base/declare模块定义类,也可以通过define引用各个类模块。本文就…

Swift基础语法 - 可选项

可选项(Optional) 可选项,一般也叫可选类型,它允许将值设置为 nil 在类型名称后面加个问号 ? 来定义一个可选项 var name: String? "CSDN" name nilvar age: Int? //默认就是nil age 30 age nilvar array [2,…

提升电脑运行速度,看这里就够了!

电脑是我们经常使用的工具之一,但是它却很容易出现问题,比如运行速度过慢,那么要如何提升电脑运行速度呢?方法1. 通过系统配置设置启动项1. 按下组合键“WinR”打开“运行”,在运行中输入“msconfig”然后按“回车”。…

LVGL-基于Windows系统Visual Studio模拟器搭建

LVGL-基于Windows系统Visual Studio模拟器搭建简述下载安装Visual Studio下载LVGL源码运行效果简述 LVGL是一个轻量级多功能图形库 丰富且强大的模块化图形组件:按钮 (buttons)、图表 (charts)、列表 (lists)、滑动条 (sliders)、图片 (images) 等高级的图形引擎&…

UUID简介以及java代码获取UUID示例

什么是UUIDUUID 是指(UniversallyUnique Identifier)通用唯一识别码,128位。RFC 4122描述了具体的规范实现。现实问题我们开发的时候,数据库表总会有一个主键,以前我们可能会使用自增的数字作为主键。这样做去确实查询…