学习笔记十七:node节点选择器,亲和性

node节点选择器,污点、容忍度、亲和性

  • node节点选择器
      • nodeName,指定pod节点运行在哪个具体node上
      • nodeSelector:指定pod调度到具有哪些标签的node节点上
  • 亲和性
    • node节点亲和性
        • 使用requiredDuringSchedulingIgnoredDuringExecution硬亲和性
        • 使用preferredDuringSchedulingIgnoredDuringExecution软亲和性
        • weight权重
    • Pod节点亲和性
        • pod自身的亲和性调度有两种表示形式
        • 定义两个pod,第一个pod做为基准,第二个pod跟着它走
    • pod节点反亲和性
        • 定义两个pod,第一个pod做为基准,第二个pod跟它调度节点相反
        • topologykey 位置拓扑键

node节点选择器

我们在创建pod资源的时候,pod会根据schduler进行调度,那么默认会调度到随机的一个工作节点,如果我们想要pod调度到指定节点或者调度到一些具有相同特点的node节点,怎么办呢?
可以使用pod中的nodeName或者nodeSelector字段指定要调度到的node节点

nodeName,指定pod节点运行在哪个具体node上

把tomcat.tar.gz上传到k8snode1和k8snode2,手动解压

ctr -n=k8s.io images import  tomcat.tar.gz 

把busybox.tar.gz上传到k8snode1和k8snode2,手动解压

ctr -n=k8s.io images import  busybox.tar.gz
vim pod-node.yaml 
apiVersion: v1
kind: Pod
metadata:name: demo-podnamespace: defaultlabels:app: myappenv: dev
spec:nodeName: k8snode1containers:- name:  tomcat-pod-javaports:- containerPort: 8080image: tomcat:8.5-jre8-alpineimagePullPolicy: IfNotPresent- name: busyboximage: busybox:latestcommand:- "/bin/sh"- "-c"
- "sleep 3600"
kubectl apply -f pod-node.yaml

查看pod调度到哪个节点

kubectl get pods  -o wide
NAME             READY   STATUS    RESTARTS             
demo-pod        1/1     Running   0            k8snode1  

nodeSelector:指定pod调度到具有哪些标签的node节点上

同一个yaml文件里定义pod资源,如果同时定义了nodeName和NodeSelector,那么条件必须都满足才可以,有一个不满足都会调度失败

给node节点打标签,打个具有disk=ceph的标签

kubectl label nodes k8snode2 disk=ceph

定义pod的时候指定要调度到具有disk=ceph标签的node上

vim pod-1.yaml 
apiVersion: v1
kind: Pod
metadata:name: demo-pod-1namespace: defaultlabels:app: myappenv: dev
spec:nodeSelector:disk: cephcontainers:- name:  tomcat-pod-javaports:- containerPort: 8080image: tomcat:8.5-jre8-alpineimagePullPolicy: IfNotPresent
kubectl apply -f pod-1.yaml

查看pod调度到哪个节点

kubectl get pods  -o wide
NAME             READY   STATUS    RESTARTS             
demo-pod-1        1/1     Running   0            k8snode2

做完上面实验,需要把default名称空间下的pod全都删除,kubectl delete pods pod名字

kubectl delete pods demo-pod-1

删除node节点打的标签

kubectl label nodes k8snode2 disk-

亲和性

node节点亲和性

node节点亲和性调度:nodeAffinity,查看官方介绍

kubectl explain pods.spec.affinity 
KIND:     Pod
VERSION:  v1
RESOURCE: affinity <Object>
DESCRIPTION:If specified, the pod's scheduling constraintsAffinity is a group of affinity scheduling rules.
FIELDS:nodeAffinity	<Object> #节点亲和性podAffinity	<Object> #pod亲和性podAntiAffinity	<Object> #pod反亲和性
kubectl explain  pods.spec.affinity.nodeAffinity
KIND:     Pod
VERSION:  v1
RESOURCE: nodeAffinity <Object>
DESCRIPTION:Describes node affinity scheduling rules for the pod.Node affinity is a group of node affinity scheduling rules.
FIELDS:preferredDuringSchedulingIgnoredDuringExecution	<[]Object>requiredDuringSchedulingIgnoredDuringExecution	<Object>prefered表示有节点尽量满足这个位置定义的亲和性,这不是一个必须的条件,软亲和性
require表示必须有节点满足这个位置定义的亲和性,这是个硬性条件,硬亲和性

使用requiredDuringSchedulingIgnoredDuringExecution硬亲和性

把myapp-v1.tar.gz上传到k8snode2和k8snode1上,手动解压:

ctr -n=k8s.io images import  myapp-v1.tar.gz 
vim pod-nodeaffinity-demo.yaml 
apiVersion: v1
kind: Pod
metadata:name:  pod-node-affinity-demonamespace: defaultlabels:app: myapptier: frontend
spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: zoneoperator: Invalues: - foo- barcontainers:- name: myappimage: docker.io/ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent

我们检查当前节点中有任意一个节点拥有zone标签的值是foo或者bar,就可以把pod调度到这个node节点的foo或者bar标签上的节点上

kubectl apply -f pod-nodeaffinity-demo.yaml 
kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo             0/1     Pending     0   k8snode1   

status的状态是pending,上面说明没有完成调度,因为没有一个拥有zone的标签的值是foo或者bar,而且使用的是硬亲和性,必须满足条件才能完成调度
给这个k8snode1节点打上标签zone=foo,在查看

kubectl label nodes k8snode1 zone=foo
kubectl get pods -o wide 
pod-node-affinity-demo             1/1     Running  0   k8snode1 

删除pod-nodeaffinity-demo.yaml

kubectl delete -f pod-nodeaffinity-demo.yaml

使用preferredDuringSchedulingIgnoredDuringExecution软亲和性

vim pod-nodeaffinity-demo-2.yaml 
apiVersion: v1
kind: Pod
metadata:name: pod-node-affinity-demo-2namespace: defaultlabels:app: myapptier: frontend
spec:containers:- name: myappimage: docker.io/ikubernetes/myapp:v1imagePullPolicy: IfNotPresentaffinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- preference:matchExpressions: - key: zone1operator: Invalues:- foo1- bar1weight: 10- preference:matchExpressions:- key: zone2operator: Invalues:- foo2- bar2weight: 20
kubectl apply -f pod-nodeaffinity-demo-2.yaml
kubectl get pods -o wide |grep demo-2
pod-node-affinity-demo-2           1/1     Running     0       k8snode1

上面说明软亲和性是可以运行这个pod的,尽管没有运行这个pod的节点定义的zone1标签
Node节点亲和性针对的是pod和node的关系,Pod调度到node节点的时候匹配的条件

测试完成,删除 pod-nodeaffinity-demo-2.yaml

kubectl delete -f pod-nodeaffinity-demo-2.yaml

weight权重

weight是相对权重,权重越高,pod调度的几率越大
假如给xianchaonode1和xianchaonode2都打上标签

kubectl label nodes k8snode1 zone1=foo1
kubectl label nodes k8snode2 zone2=foo2
vim pod-nodeaffinity-demo-2.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-node-affinity-demo-2namespace: defaultlabels:app: myapptier: frontend
spec:containers:- name: myappimage: docker.io/ikubernetes/myapp:v1imagePullPolicy: IfNotPresentaffinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- preference:matchExpressions: - key: zone1operator: Invalues:- foo1- bar1weight: 10- preference:matchExpressions:- key: zone2operator: Invalues:- foo2- bar2weight: 20
kubectl apply -f pod-nodeaffinity-demo-2.yaml

pod在定义node节点亲和性的时候,k8sode1和k8snode2都满足条件,都可以调度pod,且都具有标签,pod在匹配zone2=foo2的权重高,那么pod就会优先调度到k8snode2上

删除对应标签和pod

kubectl delete -f pod-nodeaffinity-demo.yaml
kubectl delete -f pod-nodeaffinity-demo-2.yaml

查看是否还有对应pod未删除

kubectl get pods -owide 

Pod节点亲和性

pod自身的亲和性调度有两种表示形式

  • podaffinity:pod和pod更倾向腻在一起,把相近的pod结合到相近的位置,如同一区域,同一机架,这样的话pod和pod之间更好通信,比方说有两个机房,这两个机房部署的集群有1000台主机,那么我们希望把nginx和tomcat都部署同一个地方的node节点上,可以提高通信效率;
  • podunaffinity:pod和pod更倾向不腻在一起,如果部署两套程序,那么这两套程序更倾向于反亲和性,这样相互之间不会有影响。
  • 第一个pod随机选则一个节点,做为评判后续的pod能否到达这个pod所在的节点上的运行方式,这就称为pod亲和性;我们怎么判定哪些节点是相同位置的,哪些节点是不同位置的;我们在定义pod亲和性时需要有一个前提,哪些pod在同一个位置,哪些pod不在同一个位置,这个位置是怎么定义的,标准是什么?以节点名称为标准,这个节点名称相同的表示是同一个位置,节点名称不相同的表示不是一个位置。
kubectl explain pods.spec.affinity.podAffinity
KIND:     Pod
VERSION:  v1
RESOURCE: podAffinity <Object>
DESCRIPTION:Describes pod affinity scheduling rules (e.g. co-locate this pod in thesame node, zone, etc. as some other pod(s)).Pod affinity is a group of inter pod affinity scheduling rules.
FIELDS:preferredDuringSchedulingIgnoredDuringExecution	<[]Object>requiredDuringSchedulingIgnoredDuringExecution	<[]Object>requiredDuringSchedulingIgnoredDuringExecution: 硬亲和性
preferredDuringSchedulingIgnoredDuringExecution:软亲和性
kubectl explain pods.spec.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution
KIND:     Pod
VERSION:  v1
RESOURCE: requiredDuringSchedulingIgnoredDuringExecution <[]Object>
DESCRIPTION:
FIELDS:labelSelector	<Object>namespaces	<[]string>topologyKey	<string> -required-topologyKey:
位置拓扑的键,这个是必须字段
怎么判断是不是同一个位置:
rack=rack1
row=row1
使用rack的键是同一个位置
使用row的键是同一个位置
labelSelector:
我们要判断pod跟别的pod亲和,跟哪个pod亲和,需要靠labelSelector,通过labelSelector选则一组能作为亲和对象的pod资源
namespace:
labelSelector需要选则一组资源,那么这组资源是在哪个名称空间中呢,通过namespace指定,如果不指定namespaces,那么就是当前创建pod的名称空间

在这里插入图片描述

定义两个pod,第一个pod做为基准,第二个pod跟着它走

查看默认名称空间有哪些pod,把看到的pod删除,让默认名称空间没有pod

kubectl get pods

创建的pod必须与拥有app=myapp标签的pod在一个节点上

vim pod-required-affinity-demo-1.yaml 
apiVersion: v1
kind: Pod
metadata:name: pod-firstlabels:app2: myapp2tier: frontend
spec:containers:- name: myappimage: ikubernetes/myapp:v1imagePullPolicy: IfNotPresent
kubectl apply -f pod-required-affinity-demo-1.yaml
vim pod-required-affinity-demo-2.yaml 
apiVersion: v1
kind: Pod
metadata:name: pod-secondlabels:app: backendtier: db
spec:containers:- name: busyboximage: busybox:latestimagePullPolicy: IfNotPresentcommand: ["sh","-c","sleep 3600"]affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- {key: app2, operator: In, values: ["myapp2"]}topologyKey: kubernetes.io/hostname
kubectl apply -f pod-required-affinity-demo-2.yaml 

第一个pod调度到哪,第二个pod也调度到哪,这就是pod节点亲和性

kubectl get pods -o wide
pod-first              running        k8snode2
pod-second             running        k8snode2

删除测试pod

kubectl delete -f pod-required-affinity-demo-1.yaml
kubectl delete -f pod-required-affinity-demo-2.yaml

pod节点反亲和性

定义两个pod,第一个pod做为基准,第二个pod跟它调度节点相反

vim pod-required-anti-affinity-demo-1.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-firstlabels:app1: myapp1tier: frontend
spec:containers:- name: myappimage: ikubernetes/myapp:v1imagePullPolicy: IfNotPresent
kubectl apply -f  pod-required-anti-affinity-demo-1.yaml
vim pod-required-anti-affinity-demo-2.yaml
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: app1, operator: In, values: ["myapp1"]}topologyKey: kubernetes.io/hostname
kubectl apply -f pod-required-anti-affinity-demo-2.yaml

显示两个pod不在一个node节点上,这就是pod节点反亲和性

kubectl get pods -o wide
pod-first            running        k8snode1
pod-second           running        k8snode2

删除测试用pod

kubectl delete -f pod-required-anti-affinity-demo-1.yaml
kubectl delete -f pod-required-anti-affinity-demo-2.yaml

topologykey 位置拓扑键

kubectl label nodes  k8snode2  zone=foo
kubectl label nodes  k8snode1  zone=foo
vim pod-first-required-anti-affinity-demo-1.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-firstlabels:app3: myapp3tier: frontend
spec:containers:- name: myappimage: ikubernetes/myapp:v1imagePullPolicy: IfNotPresent
kubectl apply -f pod-first-required-anti-affinity-demo-1.yaml
vim pod-second-required-anti-affinity-demo-1.yaml 
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: app3 ,operator: In, values: ["myapp3"]}topologyKey:  zone
kubectl apply -f pod-second-required-anti-affinity-demo-1.yaml
kubectl get pods -o wide 

显示如下

pod-first              running         k8snode1
pod-second            pending         <none>

第二个pod是pending,因为两个节点是同一个位置,现在没有不是同一个位置的了,而且我们要求反亲和性,所以就会处于pending状态,如果在反亲和性这个位置把required改成preferred,那么也会运行。

kubectl delete -f pod-first-required-anti-affinity-demo-1.yaml 
kubectl delete -f pod-second-required-anti-affinity-demo-1.yaml

移除标签

kubectl label nodes  k8snode1   zone-
kubectl label nodes  k8snode2   zone-
  • podaffinity:pod节点亲和性,pod倾向于哪个pod
  • poduntiaffinity:pod反亲和性
  • nodeaffinity:node节点亲和性,pod倾向于哪个node

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

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

相关文章

Intellij中直接运行ts配置:run configuration for typescript

在Intellij中可以借助插件run configuration for typescript直接运行typescript&#xff1a; run configuration for typescript插件本质还是依赖于 ts-node 来运行&#xff0c;只是其可以帮助我们自动配置好 ts-node 运行参数&#xff0c;简化使用。 第一步&#xff1a;安装…

Linux Mint 21.3 计划于 2023 年圣诞节发布

导读Linux Mint 项目近日公布了基于 Ubuntu 的 Linux Mint 发行版下一个重要版本的一些初步细节&#xff0c;以及备受期待的基于 Debian 的 LMDE 6&#xff08;Linux Mint Debian Edition&#xff09;版本。 近日&#xff0c;Linux Mint 项目负责人克莱门特-勒菲弗&#xff08;…

【STM32 学习】电源解析(VCC、VDD、VREF+、VBAT)

VCC电源电压GND电源供电负电压&#xff08;通常接地&#xff09;VDD模块工作正电压VSS模块工作负电压VREFADC参考正电压VREF-ADC参考负电压VBAT电池或其他电源供电VDDA模拟供电正电压VSSA模拟供电负电压 一、VCC&#xff08;供电电压&#xff09; VCC是指芯片的电源电压&#…

快解析内网穿透便捷访问内网私有云

快解析内网穿透软件的首要优势在于其不改变企业现有IT架构的特点。传统的内网穿透解决方案常常需要对企业网络进行重构&#xff0c;这不仅增加了工作量&#xff0c;还可能带来不稳定的因素。而快解析则巧妙地绕过了这一问题&#xff0c;让您能够在保持原有网络设备和配置的前提…

【设计模式】订单状态流传中的状态机与状态模式

文章目录 1. 前言2.状态模式2.1.订单状态流转案例2.1.1.状态枚举定义2.1.2.状态接口与实现2.1.3.状态机2.1.4.测试 2.2.退款状态的拓展2.2.1.代码拓展2.2.2.测试 2.3.小结 3.总结 1. 前言 状态模式一般是用在对象内部的状态流转场景中&#xff0c;用来实现状态机。 什么是状态…

使用percona-xtrabackup备份MySQL数据

xtrabackup备份分为两种 本文参考链接1 本文参考链接2 全量备份 1.备份数据 要创建备份&#xff0c;请xtrabackup使用xtrabackup --backup option. 您还需要指定一个xtrabackup --target-dir选项&#xff0c;即备份的存储位置&#xff0c;如果InnoDB数据或日志文件未存储在同…

今天,谷歌Chrome浏览器部署抗量子密码

谷歌已开始部署混合密钥封装机制&#xff08;KEM&#xff09;&#xff0c;以保护在建立安全的 TLS 网络连接时共享对称加密机密。 8月10日&#xff0c;Chrome 浏览器安全技术项目经理Devon O’Brien解释说&#xff0c;从 8 月 15 日发布的 Chrome 浏览器 116 开始&#xff0c;谷…

SpringBoot集成Solr(一)保存数据到Solr

SpringBoot集成Solr&#xff08;一&#xff09;保存数据到Solr 添加依赖 <!--SpringBoot中封装过的Solr依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-solr</artifactId><ver…

数组详解

1. 一维数组的创建和初始化 1.1 数组的创建 数组是一组相同类型元素的集合。 数组的创建方式&#xff1a; type_t arr_name [const_n]; //type_t 是指数组的元素类型 //const_n 是一个常量表达式&#xff0c;用来指定数组的大小 数组创建的实例&#xff1a; //代码1 int a…

STM32 PB9的外部中断

STM32F103中&#xff0c;外部中断的IRQHandler&#xff0c;EXTI0至EXTI1都是单独的&#xff0c;如图1所示&#xff1b;而从EXTI5至9则共用一个&#xff0c;如图2所示。这些可以通过CtrlF在全工程内查找。 图1 图2 以PB9为例&#xff0c;宏定义可如下配置&#xff1a; // 定义…

【Lua】(一)VSCode 搭建 Lua 开发环境

前言 最近在找工作&#xff0c;基本所有的岗位都会问到 Lua&#xff08;甚至拼 UI 的都要求会 Lua&#xff09;&#xff0c;咱能怎么办呢&#xff0c;咱也只能学啊…… 工欲善其事&#xff0c;必先利其器。第一步&#xff0c;先来把环境配置好吧&#xff01; 当前适用版本&a…

图数据库_Neo4j学习cypher语言_常用函数_关系函数_字符串函数_聚合函数_数据库备份_数据库恢复---Neo4j图数据库工作笔记0008

然后再来看一些常用函数,和字符串函数,这里举个例子,然后其他的 类似 可以看到substring字符串截取函数 可以看到截取成功 聚合函数 这里用了一个count(n) 统计函数,可以看到效果 关系函数,我们用过就是id(r) 可以取出对应的r的id来这样..

学习电工有哪些好处?在哪学习电工?

学习电工有哪些好处&#xff1f;在哪学习电工&#xff1f;学习电工可以做什么&#xff1f;优势有哪些&#xff1f; 学习电工可以做什么&#xff1f;学习电工有哪些好处&#xff1f; 就业去向&#xff1a;可在企业单位从事电气设备的安装、调试、操作、维护等工作&#xff0c;…

“保姆级”考研下半年备考时间表

7月-8月 确定考研目标与备考计划 暑假期间是考研复习的关键时期&#xff0c;需要复习的主要内容有&#xff1a;重点关注重要的学科和专业课程&#xff0c;复习相关基础知识和核心概念。制定详细的复习计划并合理安排每天的学习时间&#xff0c;增加真题练习熟悉考试题型和答题技…

【框架类】—MVVM框架

一、MVVM框架有哪些 Vue.jsReact.jsAngular.js 二、对MVVM的认识 1. MVC是什么 全称 Model View Controller, 它采用模型(Model)-视图(View)-控制器(controller)的方法把业务逻辑、数据与界面显示分离 2. MVVM的定义 MVVM是一种软件架构模式&#xff0c;它代表了模型 --视…

聊聊51单片机

目录 1.介绍 2.发展 3.应用领域 4.发展前景 1.介绍 51单片机&#xff08;AT89C51&#xff09;是一种常见的8位微控制器&#xff0c;属于Intel MCS-51系列。它是一种低功耗、高性能的单片机&#xff0c;广泛应用于嵌入式系统中。 51单片机具有很多特点和功能&#xff0c;例如…

26、springboot的自动配置03--核心功能--自定义条件注解及使用

开发自己的自动配置------开发自己的条件注解 ★ 自定义条件注解 好处有两个&#xff1a; 1. 真正掌握Spring boot条件注解的本质。 2. 项目遇到一些特殊的需求时&#xff0c;也可以开发自己的自定义条件注解来解决问题。自定义条件注解&#xff1a; ▲ 所有自定义注解其实都…

uni-app的Vue.js实现微信小程序的紧急事件登记页面功能

主要功能实现 完成发生时间选择功能&#xff0c;用户可以通过日期选择器选择事件发生的时间。实现事件类型选择功能&#xff0c;用户可以通过下拉选择框选择事件的类型。添加子养殖场编号输入框&#xff0c;用户可以输入与事件相关的子养殖场编号。完成事件描述输入功能&#…