kubernetes-Pod基于污点、容忍度、亲和性的多种调度策略(一)

Pod调度策略

  • 一.标签
    • 1.什么是标签
    • 2.给Pod资源打标签
    • 3.给Node节点打标签
    • 4.查看标签资源
  • 二.Node选择器
    • 1.nodeName(指定Pod调度到指定Node节点)
    • 2.nodeSelector(指定Pod调度到具有指定标签的Node节点)
  • 三.亲和性
    • 1.Node亲和性-nodeAffinity
    • 2.Pod亲和性-pod-Affinity
    • 3.Pod反亲和性-podAntiAffinity

一.标签

1.什么是标签

标签其实就一对 key/value ,被关联到对象上,比如Pod,标签的使用我们倾向于能够表示对象的特殊特点,就是一眼就看出了这个Pod是干什么的,标签可以用来划分特定的对象(比如版本,服务类型等),标签可以在创建一个对象的时候直接定义,也可以在后期随时修改,每一个对象可以拥有多个标签,但是,key值必须是唯一的。创建标签之后也可以方便我们对资源进行分组管理。如果对pod打标签,之后就可以使用标签来查看、删除指定的pod。
在k8s中,大部分资源都可以打标签。

2.给Pod资源打标签

创建一个Pod资源,定义标签 app:nginxenv:dev

vim test.podapiversion: v1
kind: Pod
metadata:name: testlabels:app: nginxenv: dev
spec: containers:- name: nginximage: nginxports:- containerPort: 80

执行YAML文件创建Pod

kubectl apply -f test.pod

给Pod打标签

kubectl label pod test release=v1

查看Pod标签内容

kubectl  get pod test --show-labels

3.给Node节点打标签

1.添加env标签针对node1节点

kubectl label nodes node1 env=dev

2.查看标签

kubectl get nodes node1 --show-labels

3.删除env节点标签针对node1节点

kubectl label nodes node1 env-

4.查看标签资源

1.查看默认空间下所有Pod资源标签内容

kubectl get pods --show-labels

2.查看kube-system命名空间下所有Pod资源标签内容:

kubectl get pods -n kube-system --show-labels

3.查看默认默认命名空间下,标签Key=app的Pod资源,不显示标签内容:

kubectl get pods -l app

4.查看默认默认命名空间下,标签Key=app的Pod资源,并显示标签内容:

kubectl get pods -L app

5.查看所有命名空间下,所有Pod资源的标签内容

kubectl get pods --all-namespaces --show-labels

6.查看所有Node节点标签

kubectl get nodes --show-labels

二.Node选择器

Node选择器是指,我们在创建Pod资源时指定该Pod资源运行在哪台Node节点上,默认schedule会根据资源随机调度到一个工作节点,但是我们可以通过nodeName、nodeSelector在指定运行到那台Node节点。

1.nodeName(指定Pod调度到指定Node节点)

指定Pod资源调度到指定的Node节点

vim nn-pod.yaml apiVersion: v1
kind: Pod
metadata:name: mypodlabels:app: nginxenv: dev
spec:nodeName: node1  # 运行在node1节点containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80

执行资源文件

kubectl apply -f nn-pod.yaml

可以看到Pod调度到了node1节点上

kubectl get pod -owide

2.nodeSelector(指定Pod调度到具有指定标签的Node节点)

指定Pod资源调度到具有哪些标签的节点上,需要注意 当使用nodeSelector 选择了多个标签,会调度到都满足此标签的节点上,并非满足其中一个标签!
如下配置,该Pod资源调度到具有 test=test节点上

vim ns-pod.yaml
apiVersion: v1
kind: Pod
metadata:name: mypodlabels:app: nginxenv: dev
spec:nodeSelector:test: testcontainers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80

执行资源文件,我们查看Pod信息时会发现 当前Pod状态处于Pending 状态,就是带决策调度到那台节点上,因为我们并没有具有 test=test 的节点,下面我们给节点打标签

kubectl label  nodes node1 test=test

再次查看,Pod处于Running状态,并调度到了指定节点

kubectl get pods -o wide

三.亲和性

1.Node亲和性-nodeAffinity

K8S中的Node亲和性是指将Pod调度到特定的节点上的能力,通过使用Node亲和性,可以将Pod调度到具有特定硬件、软件或其他特定属性的节点上,以满足应用程序的需求。

我们可以使用 explain 帮助命令查看:

kubectl explain pod.spec.affinity.nodeAffinity
  • prefered软亲和性:表示有节点尽量满足这个位置定义的亲和性,并不是一个必须的条件。

  • require硬亲和性:表示必须有节点满足这个配置定义的亲和性,这是个硬性条件。

1.定义Node硬亲和性示例如下:

cat pod-require-affinity.yaml 
---
apiVersion: v1
kind: Pod
metadata:name: pod-nginxnamespace: defaultlabels:app: nginxenv: dev
spec:affinity:nodeAffinity:                                     # 定义Node亲和性requiredDuringSchedulingIgnoredDuringExecution: # 定义硬亲和性nodeSelectorTerms:                           - matchExpressions:                 # 根据标签选择Node- key: env                        # 定义标签key operator: In                    # IN:等于values:                         # 定义标签values(或者关系)- dev                           # 调度到具有env=dev 或者 env=test 的标签Node节点- testcontainers:- name: nginximage: nginximagePullPolicy: IfNotPresentports: - containerPort: 80 

执行后并不会创建Pod,因为没有满足标签的Node节点;给节点打标签 env=test后则会调度到此Node节点上

kubectl label node master1  env=test
kubectl get pods

2.定义Node软亲和性

cat pod-prefered-affinity.yaml 
---
apiVersion: v1
kind: Pod
metadata:name: pod-nginx-preferednamespace: defaultlabels:env: uatapp: nginx
spec:affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:   # 软亲和性- preference:matchExpressions:                           # 根据标签选择Node- key: zone                  operator: Invalues:- foo- barweight: 10                                    # 权重值containers:- name: pod-nginx-preferedimage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80

执行后 会看到创建的Pod资源,即使没有满足标签的Node节点,也会找一台Node创建Pod资源

kubectl apply -f pod-prefered-affinity.yaml
kubectl get pods

权重值表示:weight 是相对权重,权重值越高,pod被调度到指定的node节点几率就越大

2.Pod亲和性-pod-Affinity

Pod亲和性是指将一组Pod调度到同一台物理主机或逻辑分区中的能力。这种亲和性可以用于确保相关的Pod在同一台主机上运行,以便它们可以更快地进行通信,或者为了提高可靠性,以便它们可以共享相同的存储或网络资源。
我们可以使用 explain 帮助命令查看:

kubectl explain pod.spec.affinity.podAffinity
  • prefered软亲和性:表示有节点尽量满足这个位置定义的亲和性,并不是一个必须的条件。

  • require硬亲和性:表示必须有节点满足这个配置定义的亲和性,这是个硬性条件。

1、定义两个Pod,第二个Pod调度到第一个Pod所在节点上。
第一个Pod资源清单如下:

cat pod-podaffinity-1.yaml 
---
apiVersion: v1
kind: Pod
metadata:name: pod-affinity-1namespace: defaultlabels:app: nginxenv: devspec:containers:- name: nginximage: nginx

第二个Pod资源清单如下

cat pod-podaffinity-2.yaml 
---
apiVersion: v1
kind: Pod
metadata:name: pod-affinity-2namespace: defaultlabels:app: nginxenv: dev
spec:affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:  # 硬亲和性- labelSelector: matchExpressions:- key: app             # 定义 Pod的keyoperator: In         # In = =values: - nginx              # 定义Pod的value,意思指调度到具有app=nginx标签的Pod所在节点topologyKey: kubernetes.io/hostname # 定义Node节点key,用于匹配节点判断是否在同一台服务器containers:- name: busyboximage: busybox:latestimagePullPolicy: IfNotPresentcommand: ["sh","-c","sleep 3600"]

按照顺序执行,第二个Pod会调度到第一个Pod所在Node节点上。

kubectl apply -f pod-podaffinity-1.yaml
kubectl apply -f pod-podaffinity-2.yaml

3.Pod反亲和性-podAntiAffinity

和上面Pod亲和性相反,两组Pod不会调度到同一台物理服务器上。

1、定义两个Pod,第二个Pod,禁止调度到第一个Pod所在节点。

第一个Pod资源清单:

cat pod-1.yaml 
---
apiVersion: v1
kind: Pod
metadata:name: pod-1namespace: defaultlabels:app: nginxenv: devspec:containers:- name: nginximage: nginx

第二个Pod资源清单:

cat pod-2.yaml 
---
apiVersion: v1
kind: Pod
metadata:name: pod-2namespace: defaultspec:affinity:podAntiAffinity:   # Pod反亲和性requiredDuringSchedulingIgnoredDuringExecution:- topologyKey: kubernetes.io/hostnamelabelSelector: # 标签匹配 app=nginxmatchExpressions:- key: appoperator: Invalues: - nginxcontainers:- name: nginximage: nginx

执行文件,两个Pod不会调度到同一个节点

kubectl apply -f pod-1.yaml
kubectl apply -f pod-2.yaml

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

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

相关文章

FFmpeg拉取RTSP流并定时生成10秒短视频

生成效果: 视频时长为10秒 生成格式为FLV 输出日志: 完整实现代码如下: 需要在Mac和终端先安装FFmpeg brew install ffmpeg CMake文件配置: cmake_minimum_required(VERSION 3.27) project(ffmpeg_open_stream) set(CMAKE_CXX_STANDARD 17)#头文件包目录 include_director…

ETL工具-nifi干货系列 第五讲 处理器GenerateFlowFile

1、今天我们一起来学习处理器GenerateFlowFile。这个处理器创建带有随机数据或自定义内容的 FlowFiles。GenerateFlowFile 对于负载测试、配置和模拟非常有用。从工具栏拖动处理器到画布,然后选择GenerateFlowFile即可。 2、点击add按钮或者双击 GenerateFlowFile可…

C#WPF控件TextBlock、Label以及与TextBox的区别

本文讲解TextBlock、Label以及与TextBox之间的的区别。 目录 TextBlock和Label区别 TextBox和TextBlock控件区别 TextBlock和Label区别 TextBlock和Label都用于显示文本,但它们有一些区别: 继承:Label继承自ContentControl,而TextBlock直接继承自FrameworkElement。 …

【蓝桥杯省赛真题34】python积木搭建 中小学青少年组蓝桥杯比赛 算法思维python编程省赛真题解析

python积木搭建 第十三届蓝桥杯青少年组python比赛省赛真题 一、题目要求 (注:input()输入函数的括号中不允许添加任何信息) 1、编程实现 小蓝和小青在玩积木搭建游戏,具体玩法如下: 小蓝报一个数字N&…

vue多语言包i18n

1.安装 如果是vue2直接安装8.2.1版本,否则会出现版本不匹配的错误 npm install vue-i18n8.2.1 --save2.文件编辑 在src目录下创建文件 en.js export const h {system: "Background management system",loginOut:"LoginOut",LayoutSet:Layout …

用搜索引擎收集信息-常用方式

1,site csdn.net (下图表示只在csdn网站里搜索java) 2,filetype:pdf (表示只检索某pdf文件类型) 表示在浏览器里面查找有关java的pdf文件 3,intitle:花花 (表示搜索网页标题里面有花…

Java IO面试题(一)

1. 什么是同步IO和异步IO?请简述它们的区别。 同步IO和异步IO是关于数据读写方式的两种不同模式,它们之间的主要区别在于对IO操作的处理方式。 同步IO是指程序在读写数据时,需要等待操作完成后才能继续执行后面的程序。换句话说&#xff0c…

2024年150道高频Java面试题(四)

7. String 类的常用方法都有哪些? Java中的String类提供了丰富的方法用于字符串操作。以下是一些常用的方法: 长度和判空 int length(): 返回字符串的长度。boolean isEmpty(): 判断字符串是否为空。 获取字符 char charAt(int index): 获取指定索引处…

qtxlsx 学习

简介: QXlsx是一个可以读写Excel文件的库。不依赖office以及wps组件,可以在Qt5支持的任何平台上使用。 QXlsx和QAxObject 比较 QAxObject使用需要系统中安装了offie或wps,这种方法不推荐使用; 因为如果安装了wps,可…

Java基础知识总结(23)

String常量池 String类的对象什么情况会写进常量池? 在JDK当中用双括号括起来的字符串,例如:"abc","def"都是直接存储在“方法区”的“字符串常量池”当中的。 因为字符串在实际开发过程中使用太频繁。为了执行效率&am…

4.Python数据分析—数据分析入门知识图谱索引(知识体系下篇)

4.Python数据分析—数据分析入门知识图谱&索引-知识体系下篇 一个人简介二机器学习基础2.1 监督学习与无监督学习2.1.1 监督学习:2.1.2 无监督学习: 2.2 特征工程2.3 常用机器学习算法概述2.3.1 监督学习算法:2.3.2 无监督学习算法&#…

Phoenix伪分布安装

引言 Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC APIs而不是HBase客户端APIs来创建表,插入数据和对HBase数据进行查询。Phoenix完全使用Java编写,作为HBase内嵌的JDBC驱动。Phoenix查询引擎会将SQL查询转换为一个或多个HBase扫…

python 条件循环语句

python 条件循环语句 一、条件控制语句1. Python3 条件控制2. if 语句3. if 嵌套4. match...case5. 注意: 二、循环控制语句1. Python3 循环语句2. while 循环3. 无限循环4. while 循环使用 else 语句5. 简单语句组6. for 语句7. for...else8. break 和 continue 语…

【保姆级讲解如何构建Python虚拟环境】

🔥博主:程序员不想YY啊🔥 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家💫 🤗点赞🎈收藏⭐再看💫养成习惯 🌈希望本文对您有所裨益,如有…

FolkMQ v1.3.2 发布(消息中间件、事件总线)

功能简表 角色功能生产者(客户端)发布消息、定时消息(或叫延时)、顺序消息、可过期消息、事务消息。支持 Qos0、Qos1消费者(客户端)订阅、取消订阅。消费-ACK(自动、手动)服务端发布…

SAP 前台处理:CO主数据之成本要素组创建-<KAH1>

一、背景 本章是成本要素主数据创建的续章,后续会用到成本费用的分摊分配,费用的统计中。 也是成本控制篇的内容之一 成本控制分主数据篇和业务篇: 主数据篇主要内容: 成本要素、成本中心、订单、作业类型、统计指标、工作中…

微服务(基础篇-006-Docker)

Docker是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间没有任何接口(类似 iPhone 的 app&…

【一】TensorFlow神经网络模型构建之神经元函数及优化方法

TensorFlow神经网络模型构建主要涉及如下几块:神经元函数、卷积函数、池化函数、分类函数、优化方法。下面分别对这几块进行展开说明: 神经元函数及优化方法 神经网络之所以能解决非线性问题(如语音、图像识别等),本…

google第三方登录接入

资料 ​​​​​​​How to do Google sign-in with Go | Ramblings of a cloud engineer

CentOS常用功能命令集合

1、删除指定目录下所有的空目录 find /xxx -type d -empty -exec rmdir {} 2、删除指定目录下近7天之前的日志文件 find /xxx -name "*.log" -type f -mtime 7 -exec rm -f {} \; 3、查询指定目录下所有的指定格式文件(比如PDF文件) find…