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

news2024/9/27 19:21:42

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-pod
  namespace: default
  labels:
    app: myapp
    env: dev
spec:
  nodeName: k8snode1
  containers:
  - name:  tomcat-pod-java
    ports:
    - containerPort: 8080
    image: tomcat:8.5-jre8-alpine
    imagePullPolicy: IfNotPresent
  - name: busybox
    image: busybox:latest
    command:
    - "/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-1
  namespace: default
  labels:
    app: myapp
    env: dev
spec:
  nodeSelector:
    disk: ceph
  containers:
  - name:  tomcat-pod-java
    ports:
    - containerPort: 8080
    image: tomcat:8.5-jre8-alpine
    imagePullPolicy: 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 constraints
    Affinity 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-demo
  namespace: default
  labels:
    app: myapp
    tier: frontend
spec:
  affinity:
    nodeAffinity:
     requiredDuringSchedulingIgnoredDuringExecution:
       nodeSelectorTerms:
       - matchExpressions:
         - key: zone
           operator: In
           values: 
           - foo
           - bar
  containers:
  - name: myapp
    image: 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-2
  namespace: default
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: docker.io/ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - preference:
          matchExpressions: 
          - key: zone1
            operator: In
            values:
            - foo1
            - bar1
        weight: 10
      - preference:
          matchExpressions:
          - key: zone2
            operator: In
            values:
            - foo2
            - bar2
        weight: 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-2
  namespace: default
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: docker.io/ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - preference:
          matchExpressions: 
          - key: zone1
            operator: In
            values:
            - foo1
            - bar1
        weight: 10
      - preference:
          matchExpressions:
          - key: zone2
            operator: In
            values:
            - foo2
            - bar2
        weight: 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 the
     same 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-first
  labels:
    app2: myapp2
    tier: frontend
spec:
    containers:
    - name: myapp
      image: ikubernetes/myapp:v1
      imagePullPolicy: IfNotPresent

kubectl apply -f pod-required-affinity-demo-1.yaml
vim pod-required-affinity-demo-2.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-second
  labels:
    app: backend
    tier: db
spec:
    containers:
    - name: busybox
      image: busybox:latest
      imagePullPolicy: IfNotPresent
      command: ["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-first
  labels:
    app1: myapp1
    tier: frontend
spec:
    containers:
    - name: myapp
      image: ikubernetes/myapp:v1
      imagePullPolicy: 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-second
  labels:
    app: backend
    tier: db
spec:
    containers:
    - name: busybox
      image: busybox:latest
      imagePullPolicy: IfNotPresent
      command: ["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-first
  labels:
    app3: myapp3
    tier: frontend
spec:
    containers:
    - name: myapp
      image: ikubernetes/myapp:v1
      imagePullPolicy: 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-second
  labels:
    app: backend
    tier: db
spec:
    containers:
    - name: busybox
      image: busybox:latest
      imagePullPolicy: IfNotPresent
      command: ["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.coloradmin.cn/o/889498.html

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

相关文章

Linux编程库

1、Linux编程库介绍&#xff1a; 编程库就是指始终可以被多个Linux软件项目重复使用的代码集。 使用编程库有两个主要的优点&#xff1a; 可以简化编程&#xff0c;实现代码重复使用&#xff0c;进而减小应用程序的大小。可以直接使用比较稳定的代码。 Linux下的库文件分为共…

rabbitmq容器启动后修改连接密码

1、进入容器 docker exec -it rabbitmq bash 2、查看当前用户列表 rabbitmqctl list_users 3、修改密码 rabbitmqctl change_password [username] ‘[NewPassword]’ 4、修改后退出容器 ctrlpq 5、退出容器后即可生效&#xff0c;不需要重启容器

三分之一的英国大学生被欺诈

根据NatWest的一项新研究&#xff0c;去年英国大学三分之一的学生在网上遭遇欺诈。 今年5月&#xff0c;这家高街银行委托咨询公司RedBrick对来自63个城镇的3000多名英国大学生进行了调查。 尽管三分之一的受访者表示他们在过去的12个月里遇到过诈骗&#xff0c;但没有统计数…

动手学深度学习-pytorch版本(二):线性神经网络

参考引用 动手学深度学习 1. 线性神经网络 神经网络的整个训练过程&#xff0c;包括: 定义简单的神经网络架构、数据处理、指定损失函数和如何训练模型。经典统计学习技术中的线性回归和 softmax 回归可以视为线性神经网络 1.1 线性回归 回归 (regression) 是能为一个或多个…

【06 英语语法:时态、语态、虚拟语气】

时态、语态、虚拟语气 1. 时态和语态1.1 时态: 4个时间*4个状态 &#xff08;时间&#xff1a;现在、过去、将来、过去将来&#xff1b;状态&#xff1a;一般、进行、完成、完成进行&#xff09;⑴ 16 时态 详解表⑵ 主从句的 时态搭配⑶ 常用的 不规则动词变化 1.2 语态&#…

url下载地址含非法字符下载失败

示例下载链接&#xff1a;https://666666.shei.org.cn:2023/20230105/0ac280a3-498b-45d8-830c-a788475a8022/2023817-F2666666很六 &#xff08;改&#xff09;.doc java.lang.IllegalArgumentException: Illegal character in path at index 96: https://666666.shei.org.c…

android resoure资源图片颜色值错乱

最近androidstudio开发&#xff0c;添加一些颜色值或者drawable资源文件时&#xff0c;运行app,颜色值或者图片对应不上&#xff0c;暂时找不到原因&#xff0c;望告知。 暂时解决方法&#xff1a;

IT 运营管理中的根本原因分析(RCA)

全球数字化的兴起造成了一种情况&#xff0c;即组织在很大程度上依赖于其IT基础架构&#xff0c;就像我们依赖神经系统一样。我们可以将其等同于神经系统&#xff0c;因为IT基础架构可以实现有效控制&#xff0c;协调所有功能&#xff0c;并确保高效&#xff0c;顺利地完成每项…

代码随想录算法训练营第60天|动态规划part17| 647. 回文子串、516.最长回文子序列、动态规划总结篇

代码随想录算法训练营第60天&#xff5c;动态规划part17&#xff5c; 647. 回文子串、516.最长回文子序列、动态规划总结篇 647. 回文子串 647. 回文子串 思路&#xff1a; 暴力解法 两层for循环&#xff0c;遍历区间起始位置和终止位置&#xff0c;然后还需要一层遍历判断…

vue2.0/vue3.0学习笔记——2022.08.16

vue2&#xff08;查漏补缺&#xff09; 一、vue基础 内置指令&#xff08;查漏补缺&#xff09; 1、v-text 更新元素的textContent 2、v-html 更新元素的innerHtml 3、v-cloak 防止闪现&#xff0c;与css配合: [v-cloak] {dispaly: none} 4、v-once 在初次动态渲染厚&#x…

1N4007S 整流二极管 1A 1000V A-405

前两天二极管生产厂家东沃电子科普过1N4007和1N4007G这两种普通塑封整流二极管&#xff0c;查看“STD-1N4001 Thru 1N4007 (DO-41) Datasheet”和“STD-1N4001G Thru 1N4007G (DO-41) Datasheet”产品手册可知&#xff0c;1N4007和1N4007G参数除了结电容和芯片尺寸不一样以外&a…

每日一练 | mongo集群如何创建分片键

文章目录 MongoDB是什么什么是分片键环境如何设置分片键 MongoDB是什么 MongoDB 是一个基于分布式文件存储的数据库 什么是分片键 分片&#xff1a;每个分片包含分片数据的一部分。每个分片可以部署为副本集。 而分片键的作用就是把数据按一定的条件分布到各个分片中&#…

Linux 修改信号的响应方式

修改信号的响应方式 1.signal()方法介绍&#xff1a; 修改信号的响应方式要用到方法signal()。需要引用头文件signal.h。signal()的原型&#xff1a; typedef重命名了一个函数指针的类型&#xff0c;这个指针的类型为指向一个参数为int返回值为void的函数的指针。这个函数指针…

学生学徒班适学人员介绍

什么是学生学徒制呢&#xff1f; 产业技能生态链企业与院校毕业年度学生&#xff0c;按照学生就业意愿&#xff0c;建立就业导向的学生学徒制关系&#xff0c;签订学徒培养协议&#xff0c;确定学生的就业岗位和培养计划&#xff08;含岗位实习&#xff09;。 泰迪-学生学…

Python中随机数的使用详解

目录标题 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~!随机数功能1. choice(seq)2. randint(start, end)3. random()4. uniform(a, b)5. randrange(start, end, step)6. sample(seq, number)7. shuffle(lt)尾语 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python资料、源码…

[JavaWeb]【二】Vue Ajax Elemnet Vue路由打包部署

目录 一 什么是Vue 1.1 Vue快速入门 1.2 常用指令 1.2.1 v-bind && v-model 1.2.2 v-on 1.2.3 v-if && v-show 1.2.4 v-for 1.2.5 案例 1.3 生命周期 二 Ajax 2.1 Ajax介绍 2.2 同步与异步 2.3 原生Ajax&#xff08;繁琐&#xff0c;过时了&#xff09…

Windows安装 Elasticsearch 教程

下载地址 Past Releases of Elastic Stack Software | Elastic 解压 解压完的样子 进入BIN目录 D:\Develop\elasticsearch\elasticsearch-7.12.0\bin 按住shift 鼠标右键 打开 powershell 窗口 查看ES版本 .\elasticsearch.bat --version 出现问题了 警告&#xff1a;不赞成…

第十二课:QSsh 库编译及客户端开发

功能描述&#xff1a;QSsh 库编译以及如何运用 QSsh 做应用开发 一、最终演示效果 本次制作的 Demo 是通过输入主机的 IP 、端口号、用户名和密码&#xff0c;能够实现 SSH 自动连接&#xff0c;从而对远程设备进行操作。 主机(H)&#xff1a;输入远程设备的 IP 端口(P)&…

分享twinmotion获得逼真效果的渲染技巧

正如所引用的那样&#xff0c;“渲染与软件无关。它关乎艺术家的眼睛、看到脑海中最终图像的能力&#xff0c;以及将这一愿景变为现实的技能。一些流行的渲染软件包括 V-Ray、Arnold、Unreal Engine、Blender 和 Octane Render。 其中之一是 TwinMotion&#xff0c;这是一款功…

自然语言处理技术:NLP句法解析树与可视化方法

自然语言处理(Natural Language Processing,NLP)句法解析树是一种表示自然语言句子结构的图形化方式。它帮助将句子中的每个词汇和短语按照语法规则连接起来,形成一个树状结构,以便更好地理解句子的语法结构和含义。句法解析树对于理解句子的句法关系、依存关系以及语义角…