当前位置: 首页 > news >正文

K8S 节点选择器

 今天我们来实验 pod 调度的 nodeName 与 nodeSelector。官网描述如下:

假设有如下三个节点的 K8S 集群:

k8s31master 是控制节点

k8s31node1、k8s31node2 是工作节点

容器运行时是 containerd

一、镜像准备

1.1、镜像拉取

docker pull tomcat:8.5-jre8-alpine

# 查看是否下载完成
docker images | grep tomcat

 1.2、镜像导出

docker save -o tomcat-8.5-jre8-alpine.tar.gz 镜像TAG
或者
docker save 镜像TAG -o tomcat-8.5-jre8-alpine.tar.gz
都可以

 1.3、镜像导入工作节点 containerd

# k8s31node1 执行
[root@k8s31node1 ~]# ctr -n=k8s.io images import tomcat-8.5-jre8-alpine.tar.gz
[root@k8s31node1 ~]# ctr -n=k8s.io images ls|grep tomcat# k8s31node2 执行
[root@k8s31node2 ~]# ctr -n=k8s.io images import tomcat-8.5-jre8-alpine.tar.gz
[root@k8s31node2 ~]# ctr -n=k8s.io images ls|grep tomcat

 说明:

  • ctr 是 containerd 命令
  • ctr images import:导入镜像
  • -n=k8s.io:K8S 镜像存储命名空间

二、nodeName

  • 查看帮助文档
# 查看 pod 帮助文档
kubectl explain pod.spec
# nodeName 属性位于 spec 下
# 它可以指定 pod 运行在哪个 nodeName 的节点上

  •  编写资源文件

pod-node-name-demo.yaml

apiVersion: v1
kind: Pod
metadata:name: pod-node-name
spec:nodeName: k8s31node1containers:- name: tomcatimage: tomcat:8.5-jre8-alpineimagePullPolicy: IfNotPresentports:- containerPort: 8080

nodeName 可以指定节点名称(节点的 metadata.name)。

  •  运行并查看
kubectl apply -f pod-node-name-demo.yaml
kubectl get pod -owide
# -o output 的意思,wide 更详细的 -owide 表示输出更详细的信息

查看 pod 被调度到哪个节点: 

 删除这个 pod,修改 nodeName 为 k8s31node2,重新运行:

# 使用资源文件删除 pod-node-name 这个 pod
kubectl delete -f pod-node-name-demo.yaml
# 修改资源文件 nodeName 改为 k8s31node2
vim pod-node-name-demo.yaml
# 重新运行
kubectl apply -f pod-node-name-demo.yaml
# 查看被调度到哪个节点
kubectl get pod -owide

 可以看到 pod 被调度到 k8s31node2 上。

 三、nodeSelector

  • 查看帮助文档
# 查看 pod 帮助文档
kubectl explain pod.spec
# nodeSelector 属性位于 spec 下
# 它可以指定 pod 调度到具有哪些标签的 node 节点上
# 它是键值对格式

  • 给 node 节点打上标签
# 给 node1 节点打上标签 zone=east
kubectl label node k8s31node1 zone=east
# 给 node2 节点打上标签 zone=south
kubectl label node k8s31node2 zone=south
  • 查看已打上的标签
kubectl get node --show-labels
# --show-labels 显示标签

  •  编写资源文件

pod-node-selector-demo.yaml

apiVersion: v1
kind: Pod
metadata:name: pod-node-selector
spec:nodeSelector:zone: eastcontainers:- name: tomcatimage: tomcat:8.5-jre8-alpineimagePullPolicy: IfNotPresentports:- containerPort: 8080

 nodeSelector 指定 pod 要被调度到的节点,需满足具有 zone=east 这个标签。

  •  运行并查看
kubectl apply -f pod-node-selector-demo.yaml
kubectl get pod -owide

 查看 pod 被调度到哪个节点: 

 删除这个 pod,修改 nodeSelector 为 zone=south,重新运行:

# 使用资源文件删除 pod-node-selector 这个 pod
kubectl delete -f pod-node-selector-demo.yaml
# 修改资源文件 nodeSelector 改为 zone=south
vim pod-node-selector-demo.yaml
# 重新运行
kubectl apply -f pod-node-selector-demo.yaml
# 查看被调度到哪个节点
kubectl get pod -owide

  可以看到 pod 被调度到 k8s31node2 上。因为 k8s31node2具有标签 zone=south。

 四、同时使用 nodeName 和 nodeSelector

  • 编写资源文件

pod-node-name-and-selector-demo.yaml

apiVersion: v1
kind: Pod
metadata:name: pod-node-name-selector
spec:nodeName: k8s31node1nodeSelector:zone: southcontainers:- name: tomcatimage: tomcat:8.5-jre8-alpineimagePullPolicy: IfNotPresentports:- containerPort: 8080

 我们现在 nodeName 希望它被调度到 k8s31node1 上,而 nodeSelector 却希望它有标签 

zone=south(k8s31node1 的标签是 zone=east),我们看看会发生什么-->

  •  运行并查看
kubectl apply -f pod-node-name-and-selector-demo.yaml
kubectl get pod -owide

 它会报 NodeAffinity 节点亲和性问题,无法被正确调度。

  •  查看 pod 日志
kubectl describe pod pod-node-name-selector

  • 修改资源文件 zone 改为 east,删除原来的 pod,重新执行
# zone 改为 east
vim pod-node-name-and-selector-demo.yaml
# 删除原来的 pod
kubectl delete pod pod-node-name-selector
# 重新执行
kubectl apply -f pod-node-name-and-selector-demo.yaml
# 查看
kubectl get pod -owide

 可以看到 pod 被正确调度到 k8s31node1 上了。

也就是说同时使用 nodeName 跟 nodeSelector 需要都满足,pod 才能被正确调度。

注意:

修改完资源文件,一定要先删除原来的 pod,因为没有工作负载管理的自主式 pod,没有声明式更新的能力。直接 apply -f 会报错。

 五、还原环境

实验完,删除掉已经创建的所有 pod,节省资源,删除节点标签,为下一次实验做准备。

# 删除节点1的标签 - 删除的意思
kubectl label node k8s31node1 zone-
# 删除节点2的标签
kubectl label node k8s31node2 zone-
# 查看
kubectl get node --show-labels

 六、总结

  • 给某个资源打上标签语法:
kubectl label [pod|node] 资源名称 key1=value1 key2=value2
  • nodeName 使用节点名称进行匹配
  • nodeSelector 使用节点标签进行匹配
  • 同时使用 nodeName 跟 nodeSelector 需要都满足,pod 才能被正确调度
  •  删除资源的标签语法:
kubectl label [pod|node] 资源名称 key-

相关文章:

K8S 节点选择器

今天我们来实验 pod 调度的 nodeName 与 nodeSelector。官网描述如下: 假设有如下三个节点的 K8S 集群: k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8…...

【2024年华为OD机试】 (C卷,200分)- 反射计数(Java JS PythonC/C++)

一、问题描述 题目解析 题目描述 给定一个包含 0 和 1 的二维矩阵,一个物体从给定的初始位置出发,在给定的速度下进行移动。遇到矩阵的边缘时会发生镜面反射。无论物体经过 0 还是 1,都不影响其速度。请计算并给出经过 t 时间单位后&#…...

AI编程工具使用技巧——通义灵码

活动介绍通义灵码1. 理解通义灵码的基本概念示例代码生成 2. 使用明确的描述示例代码生成 3. 巧妙使用注释示例代码生成 4. 注意迭代与反馈原始代码反馈后生成优化代码 5. 结合生成的代码进行调试示例测试代码 其他功能定期优化生成的代码合作与分享结合其他工具 总结 活动介绍…...

挖掘机检测数据集,准确识别率91.0%,4327张原始图片,支持YOLO,COCO JSON,PASICAL VOC XML等多种格式标注

挖掘机检测数据集,准确识别率91.0%,4327张图片,支持YOLO,COCO JSON,PASICAL VOC XML等多种格式标注 数据集详情 数据集分割 训练组70% 3022图片 有效集20% 870图片 测试集10&…...

使用Docker部署postgresql

使用Docker部署postgresql postgresql数据库在Docker中的镜像的名称为postgres,可以从DockerHub中pull下来,如果pull不下来那么很大概率是网络问题导致的,这时候你可能需要在网上找一些能用的镜像源,以成功拉取postgres镜像。 有…...

LabVIEW时域近场天线测试

随着通信技术的飞速发展,特别是在5G及未来通信技术中,天线性能的测试需求日益增加。对于短脉冲天线和宽带天线的时域特性测试,传统的频域测试方法已无法满足其需求。时域测试方法在这些应用中具有明显优势,可以提供更快速和精准的…...

LabVIEW桥接传感器数据采集与校准程序

该程序设计用于采集来自桥接传感器的数据,执行必要的设置(如桥接配置、信号采集参数、时间与触发设置),并进行适当的标定和偏移校正,最终通过图表呈现采集到的数据信息。程序包括多个模块,用于配置通道、触…...

菜品管理(day03)

公共字段自动填充 问题分析 业务表中的公共字段: 而针对于这些字段,我们的赋值方式为: 在新增数据时, 将createTime、updateTime 设置为当前时间, createUser、updateUser设置为当前登录用户ID。 在更新数据时, 将updateTime 设置为当前时间…...

深入理解 Android 混淆规则

在 Android 开发中,混淆(Obfuscation)是一种保护代码安全的重要手段,通常通过 ProGuard 或 R8 工具来实现。本文将详细介绍 Android 混淆规则的基本原理、配置方法以及最佳实践,帮助开发者更好地保护应用代码。 博主博…...

《Keras 3 在 TPU 上的肺炎分类》

Keras 3 在 TPU 上的肺炎分类 作者:Amy MiHyun Jang创建日期:2020/07/28最后修改时间:2024/02/12描述:TPU 上的医学图像分类。 (i) 此示例使用 Keras 3 在 Colab 中查看 GitHub 源 简介 设置 本教程将介…...

从 Android 进行永久删除照片恢复的 5 种方法

从 Android 设备中丢失珍贵的照片可能是一种毁灭性的经历。无论是由于意外删除、软件故障还是系统更新,如何从 Android 永久恢复已删除的照片是一个普遍的问题。 幸运的是,有一些解决方案可以帮助找回丢失的记忆。本指南将涵盖您需要了解的有关如何检索…...

SDL2:Android APP编译使用

SDL2:Android APP编译使用 3. SDL2:Android APP编译使用3.1 Android Studio环境准备:3.2 构建Android APP(1)方式一:快速构建APK工程(2)方式二:自定义APK工程&#xff08…...

linux systemd 服务连续启动失败,不会再重启分析

1. 问题现象 在Linux 系统中,将自已写的可执行文件放到 systemd 服务中做成service 服务,以支持开机自启和失败重启。但是发现服务在重启多次失败后再也起不来,服务状态是 failed,并且报 start request repeated too quickly. 2.…...

【云岚到家】-day03-门户缓存方案选择

【云岚到家】-day03-门户缓存方案选择 1.门户常用的技术方案 什么是门户 说到门户马上会想到门户网站,中国比较早的门户网站有新浪、网易、搜狐、腾讯等,门户网站为用户提供一个集中的、易于访问的平台,使他们能够方便地获取各种信息和服务…...

在IDEA中使用通义灵码插件:全面提升开发效率的智能助手

在IDEA中使用通义灵码插件:全面提升开发效率的智能助手 随着软件开发行业对效率和质量要求的不断提高,开发者们一直在寻找能够简化工作流程、提升代码质量的工具。阿里云推出的通义灵码插件正是这样一个旨在帮助开发者更高效地编写高质量代码的强大工具…...

【正则表达式】从0开始学习正则表达式

正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE) 一、推荐学习网站 正则表达式 – 语法 | 菜鸟教程 正则表达式30分钟入门教程 | 菜鸟教程 编程胶囊-打造学习编程的最好系统 二、必知必记 2.1 元字符…...

PHP智慧小区物业管理小程序

🌟智慧小区物业管理小程序:重塑社区生活,开启便捷高效新篇章 🌟 智慧小区物业管理小程序是一款基于PHPUniApp精心雕琢的智慧小区物业管理小程序,它犹如一股清新的科技之风,吹进了现代智慧小区的每一个角落…...

Linux安装Docker教程(详解)

如果想要系统学习docker,建议进入官方文档中学习:docker官方文档 一. 基本概念 Docker Desktop 和 Docker Engine 有什么区别? Docker Desktop for Linux 提供用户友好的图形界面,可简化容器和服务的管理。它包括 Docker Engine&#xff0c…...

开源AI微调指南:入门级简单训练,初探AI之路

112,如何让 113? 简单的微调你的 AI, 微调前的效果,怎么调教它都是 112. 要对其进行微调(比如训练113),可以按以下步骤进行。 确保你已经安装了以下工具和库: ollamallama3.2Pyt…...

Leetcode 91. 解码方法 动态规划

原题链接&#xff1a;Leetcode 91. 解码方法 自己写的代码&#xff1a; class Solution { public:int numDecodings(string s) {int ns.size();vector<int> dp(n,1);if(s[n-1]0) dp[n-1]0;for(int in-2;i>0;i--){if(s[i]!0){string ts.substr(i,2);int tmpatoi(t.c…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...