K8s之标签、Node选择器与亲和性详解

news2024/12/27 12:10:01

文章目录

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

一、标签

1、标签是什么?

  • 标签其实就是一对key/value,key的值必须唯一
  • 标签可以在创建一个对象的时候直接定义,也可以在后期随时修改,每一个对象可以拥有多个标签
  • 标签可以用来划分特定的对象(比如版本,服务类型等)
  • 创建标签后,方便我们对资源进行分组管理(通过标签查询资源,通过标签删除资源)
  • 在K8s中,绝大部分资源都可以打标签

2、给Pod打标签

创建一个名为 mypod 的Pod资源,并定义两个标签分别是:app: nginxenv: dev

apiVersion: v1
kind: Pod
metadata:
  name: mypod
  labels:
    app: nginx
    env: dev
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

执行yaml文件:

kubectl apply -f pod.yaml

创建后给Pod添加version=1.0标签:

kubectl label pods mypod version=1.0

查看此Pod,标签内容:

kubectl get pod mypod --show-labels

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2GFtSai0-1684286651782)(D:\MD归档文档\IMG\image-20230511104317911.png)]

3、给Node节点打标签

1、添加 env 标签 针对 k8s-node-1 节点

kubectl label nodes k8s-node-1 env=dev

2、查看标签

kubectl get nodes k8s-node-1 --show-labels

3、删除 env 标签 针对 k8s-node-1 节点

kubectl label nodes k8s-node-1 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节点,如下文件指定该Pod运行在k8s-node-1 节点

apiVersion: v1
kind: Pod
metadata:
  name: mypod
  labels:
    app: nginx
    env: dev
spec:
  nodeName: k8s-node-1  # 运行在k8s-node-1节点
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

执行资源文件:

kubectl apply -f pod.yaml

可以看到该Pod调度到 k8s-node-1 节点了:

kubectl get pods -o wide

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J7DS9oUK-1684286651783)(D:\MD归档文档\IMG\image-20230511111750834.png)]

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

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

如下配置将,该Pod资源调度到具有 name=work 的节点上

at pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mypod
  labels:
    app: nginx
    env: dev
spec:
  nodeSelector:
    name: work
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

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

kubectl label nodes k8s-node-1 name=work

当我们再次查看时,Pod会处于Running状态,并调度到了指定节点。

kubectl get pods -o wide

三、亲和性

1、Node亲和性-nodeAffinity

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

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

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

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

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

cat pod-require-affinity.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-nginx
  namespace: default
  labels:
    app: nginx
    env: dev
spec:
  affinity:
    nodeAffinity:                                     # 定义Node亲和性
      requiredDuringSchedulingIgnoredDuringExecution: # 定义硬亲和性
        nodeSelectorTerms:                           
        - matchExpressions:                 # 根据标签选择Node
          - key: env                        # 定义标签key 
            operator: In                    # IN:等于
            values:                         # 定义标签values(或者关系)
            - dev                           # 调度到具有env=dev 或者 env=test 的标签Node节点
            - test
        
  containers:
  - name: nginx-1
    image: nginx
    imagePullPolicy: IfNotPresent
    ports: 
    - containerPort: 80 

执行后并不会创建Pod,因为没有满足标签的Node节点:

kubectl apply -f pod-require-affinity.yaml	

打标签,env=test 后则会调度到此Node节点上

kubectl label node k8s-master  env=test
kubectl get pods

2、定义Node软亲和性 示例如下:

cat pod-prefered-affinity.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-nginx-prefered
  namespace: default
  labels:
    env: uat
    app: nginx
spec:
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:   # 软亲和性
      - preference:
          matchExpressions:                           # 根据标签选择Node
          - key: zone                  
            operator: In
            values:
            - foo
            - bar
        weight: 10                                    # 权重值

  containers:
  - name: pod-nginx-prefered
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

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

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

2、Pod亲和性-podAffinity

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-1
  namespace: default
  labels:
    app: nginx
    env: uat

spec:
  containers:
  - name: nginx
    image: nginx

第二个Pod资源清单如下:

cat pod-podaffinity-2.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-affinity-2
  namespace: default
  labels:
    app: nginx
    env: uat
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:  # 硬亲和性
      - labelSelector: 
          matchExpressions:
          - key: app             # 定义 Pod的key
            operator: In         # In = =
            values: 
            - nginx              # 定义Pod的value,意思指调度到具有app=nginx标签的Pod所在节点
        topologyKey: kubernetes.io/hostname # 定义Node节点key,用于匹配节点判断是否在同一台服务器

  containers:
  - name: busybox
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command: ["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-1
  namespace: default
  labels:
    app: nginx
    env: uat

spec:
  containers:
  - name: nginx
    image: nginx

第二个Pod资源清单:

cat pod-2.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-2
  namespace: default

spec:
  affinity:
    podAntiAffinity:   # Pod反亲和性
      requiredDuringSchedulingIgnoredDuringExecution:
      - topologyKey: kubernetes.io/hostname
        labelSelector: # 标签匹配 app=nginx
          matchExpressions:
          - key: app
            operator: In
            values: 
            - nginx
  containers:
  - name: nginx
    image: nginx

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

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

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

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

相关文章

软件测试项目实战经验附视频以及源码【医疗项目,社区管理,前后端分离项目,银行项目,金融项目,车载项目】

前言: ​​大家好,我是测试小马。 很多初学的测试小白都在烦恼找不到合适的项目去练习,这也是难倒大部分测试小白的一个很常见的问题,项目经验确实是每一个测试非常宝贵的经验!这里小马哥给大家找了一些常用的项目合…

AJ-Captcha验证码使用教程源码解读

1.背景 验证码的主要作用是防止机器人恶意使用我们的程序........ 今天我们结束一款强大的验证码组件:aj-captcha 官方文档:AJ-Captcha在线体验 大家一定要认真阅读官方文档 2.项目启动与快速测试 启动后端: 快速页面测试: 使用浏览器访问这个页面 有修改后端源码的情况…

MySQL触发器Trigger加载以及目前局限

GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。作者: 亮文章来源:GreatSQL社区原创 概念介绍 首先需要知道MySQL中触发器特点,以及表table…

掌握这些技巧,让你的Facebook文案更具说服力!

面对广告瀑布流般的竞争,如何让自己的Facebook广告脱颖而出,吸引到用户的眼球,成为广告运营人员必须思考的问题。在这个过程中,文案的作用是至关重要的。 优秀的文案不仅可以吸引用户点击,还能让用户产生共鸣&#xf…

K8s scheduler 调度:预选和优选策略

1 环境准备 kube-scheduler是k8s的核心组件之一,主要负责Pod的调度。scheduler通过监听kube-apiserver,查询未分配 Node的Pod,根据配置的调度策略,将Pod调度到最优的工作节点上,从而高效、合理地利用k8s集群资源。 在m…

shell之数组

一. 关于数组的命令 1. 定义数组 数组名(value0 value1 value2 …) arr(元素1 元素2 元素3 ...) echo ${arr[]}数组名([0]value [1]value [2]value…" arr ([下标1]值1 [下标2]值2 ....) echo ${array3[]}列表名"value0 value1 value2 list"值1 值2 值3 ..…

一文解读spring中事务管理

目录 声明式事务概念 事务基本概念 ①什么是事务 ②事务的特性 编程式事务 声明式事务 基于注解的声明式事务 准备工作 测试无事务情况 加入事务 Transactional的使用 事务属性:只读 事务属性:超时 事务属性:回滚策略 事务属性…

华为OD机试真题 Java 实现【寻找链表的中间结点】【2023Q1 100分】

一、题目描述 给定一个单链表 L,请编写程序输出 L中间结点保存的数据。如果有两个中间结点,则输出第二个中间结点保存的数据。 例如: 给定 L 为 1 -> 7 -> 5,则输出应该为 7; 给定 L 为 1 -> 2 -> 3 -> 4&#…

微服务简介,SpringCloud Alibaba Nacos的安装部署与使用,Nacos集成springboot实现服务注册

目录 一.认识微服务 1.0.学习目标 1.1.单体架构 单体架构的优缺点如下: 1.2.分布式架构 分布式架构的优缺点: 1.3.微服务 微服务的架构特征: 1.4.SpringCloud 1.5Nacos注册中心 1.6.总结 二、Nacos基本使用安装部署服务注册 &am…

聊一聊适配器模式

接口不能用?行,我帮你适配 一、概述 适配器模式(Adapter),是23种设计模式中的结构型模式之一;它就像我们电脑上接口不够时,需要用到的拓展坞,起到转接的作用。它可以将新的功能和原…

SCS【26】单细胞细胞间通信第二部分通信网络的系统分析(CellChat)

桓峰基因公众号推出单细胞生信分析教程并配有视频在线教程,目前整理出来的相关教程目录如下: Topic 6. 克隆进化之 Canopy Topic 7. 克隆进化之 Cardelino Topic 8. 克隆进化之 RobustClone SCS【1】今天开启单细胞之旅,述说单细胞测序的前世…

《微服务实战》 第十一章 Spring Cloud Alibaba nacos配置中心

前言 Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。 Spring Cloud Aliba…

【C++ 入坑指南】(08)循环

文章目录 一、while 循环二、do...while 循环三、for 循环四、嵌套循环五、跳转语句5.1 break 语句5.2 continue 语句5.3 goto 语句 有的时候,可能需要多次执行同一块代码。一般情况下,语句是顺序执行的:函数中的第一个语句先执行&#xff0c…

c++ 11标准模板(STL) std::set(五)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class set;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using se…

Java中的线程通信的几种方式

Java中的线程间通信是指不同线程之间相互协作&#xff0c;以完成一些复杂的任务或实现某些功能的过程。线程间通信主要包括两个方面&#xff1a;线程之间的互斥和同步&#xff0c;以及线程之间的数据共享和通信。Java提供了多种方式来实现线程间通信&#xff0c;本文将介绍Java…

Java | 一分钟掌握定时任务 | 5 - Spring Task

作者&#xff1a;Mars酱 声明&#xff1a;本文章由Mars酱原创&#xff0c;部分内容来源于网络&#xff0c;如有疑问请联系本人。 转载&#xff1a;欢迎转载&#xff0c;转载前先请联系我&#xff01; 前言 多线程解决了并发阻塞问题&#xff0c;但是不能方便的表达我们的定时方…

redi可持久化配置

回顾&#xff1a;rpcbind111 nfs2049 redis高可用高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%&#xff0c;99.99%&#xff0c;99.999%等&#xff09; 还要考虑提供主从分离&#xff0c;快速容灾技术&#…

用netty实现聊天

1.引入netty依赖 <dependencies> <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.92.Final</version> </dependency> </dependencies> 2.准备一个服务端ChatServer和…

Redis优化与常见问题

---------------------- Redis 命令工具 ---------------------------------------- redis-server&#xff1a;用于启动 Redis 的工具 redis-benchmark&#xff1a;用于检测 Redis 在本机的运行效率 redis-check-aof&#xff1a;修复 AOF 持久化文件 redis-check-rdb&#xff1…

C语言库函数详解(两万字)

目录 目录 目录 前言 1.C 标准库 - <stdio.h> 简介 1.1 printf&#xff08;&#xff09;&#xff1b; 1.2 scanf(); 1.3 getchar(); 1.4 putchar(); 1.5 gets(); 1.6 puts(); 1.7fscanf(); 1.8 fprintf(); 1.9 fgetc(); 1.10 fgets(); 1.11 fputs(); 1.12 fclose();…