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

2024-03-28 11:36

本文主要是介绍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

这篇关于kubernetes-Pod基于污点、容忍度、亲和性的多种调度策略(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/855498

相关文章

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Python函数返回多个值的多种方法小结

《Python函数返回多个值的多种方法小结》在Python中,函数通常用于封装一段代码,使其可以重复调用,有时,我们希望一个函数能够返回多个值,Python提供了几种不同的方法来实现这一点,需要的朋友... 目录一、使用元组(Tuple):二、使用列表(list)三、使用字典(Dictionary)四、 使

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

SpringBoot项目Web拦截器使用的多种方式

《SpringBoot项目Web拦截器使用的多种方式》在SpringBoot应用中,Web拦截器(Interceptor)是一种用于在请求处理的不同阶段执行自定义逻辑的机制,下面给大家介绍Sprin... 目录一、实现 HandlerInterceptor 接口1、创建HandlerInterceptor实

利用Python实现时间序列动量策略

《利用Python实现时间序列动量策略》时间序列动量策略作为量化交易领域中最为持久且被深入研究的策略类型之一,其核心理念相对简明:对于显示上升趋势的资产建立多头头寸,对于呈现下降趋势的资产建立空头头寸... 目录引言传统策略面临的风险管理挑战波动率调整机制:实现风险标准化策略实施的技术细节波动率调整的战略价

电脑提示Winmm.dll缺失怎么办? Winmm.dll文件丢失的多种修复技巧

《电脑提示Winmm.dll缺失怎么办?Winmm.dll文件丢失的多种修复技巧》有时电脑会出现无法启动程序,因为计算机中丢失winmm.dll的情况,其实,winmm.dll丢失是一个比较常见的问... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

Redis中6种缓存更新策略详解

《Redis中6种缓存更新策略详解》Redis作为一款高性能的内存数据库,已经成为缓存层的首选解决方案,然而,使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性,本文将介绍Redis中6种缓存更... 目录引言策略一:Cache-Aside(旁路缓存)策略工作原理代码示例优缺点分析适用场景策略二:Re