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

在CSDN学Golang云原生(Kubernetes Pod调度)

一,NodeSelector定向调度

在 Kubernetes 中,可以使用 NodeSelector 字段来指定 Pod 调度到哪些节点上运行。NodeSelector 是一个键值对的 map,其中键是节点的标签名,值是标签值。具体步骤如下:

  1. 在节点上添加标签

首先需要在节点上添加相应的标签,例如:

kubectl label nodes node1 app=example-app
  1. 编写 Pod 的 YAML 文件

在编写 Pod 的 YAML 文件时,需要添加 nodeSelector 字段来指定 Pod 要调度到哪些节点上运行。

apiVersion: v1
kind: Pod
metadata:name: example-pod
spec:containers:- name: example-containerimage: your_image_namenodeSelector:app: example-app # 指定要调度到带有 app=example-app 标签的节点上运行 
  1. 使用 kubectl apply 命令部署 Pod
kubectl apply -f your_pod_yaml_file.yaml
  1. 查看 Pod 是否部署成功
kubectl get pods example-pod -o wide # -o wide 可以查看分配给该 pod 的节点名称和 IP 地址等信息。

以上就是使用 golang NodeSelector 定向调度的步骤。

二,Node亲和性调度NodeAffinity

在 Kubernetes 中,可以使用 NodeAffinity 字段来指定 Pod 的亲和性调度规则,NodeAffinity 是一个结构体,其中包含两个属性:

  • requiredDuringSchedulingIgnoredDuringExecution: 在调度阶段必须满足的亲和性规则。
  • preferredDuringSchedulingIgnoredDuringExecution: 优先级较低的亲和性规则。

下面是一个使用 golang NodeAffinity 进行亲和性调度的例子:

import ("k8s.io/api/core/v1"
)// 创建 PodSpec 对象
podSpec := &v1.PodSpec{...Affinity: &v1.Affinity{NodeAffinity: &v1.NodeAffinity{RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{ // 必须满足以下标签要求NodeSelectorTerms: []v1.NodeSelectorTerm{{MatchExpressions: []v1.NodeSelectorRequirement{{Key:      "zone",Operator: v1.NodeSelectorOpIn,Values:   []string{"cn-east-01", "cn-east-02"},},},},},},PreferredDuringSchedulingIgnoredDuringExecution: nil, // 暂不需要优先级较低的亲和性规则},},
}// 创建 Pod 对象
pod := &v1.Pod{...Spec: *podSpec,
}

在上述代码中,我们通过定义 RequiredDuringSchedulingIgnoredDuringExecution 属性,并设置 NodeSelectorTerms 和 MatchExpressions 来指定 Pod 调度到哪些节点上运行。这里我们要求节点的 zone 标签的值必须是 cn-east-01 或者 cn-east-02

需要注意的是,如果指定了多个亲和性规则,则每个规则都必须满足才能将 Pod 调度到对应的节点上。

除了使用 golang 代码进行调度之外,也可以在 Pod 的 YAML 文件中添加相应的 NodeAffinity 字段来指定 Pod 的亲和性调度规则。

三,Pod亲和度与互斥调度PodAffinity

在 Kubernetes 中,Pod 的亲和度与互斥调度可以通过 PodAffinity 和 PodAntiAffinity 字段进行设置。其中,PodAffinity 用于指定必须共存的 Pod,而 PodAntiAffinity 用于指定不得共存的 Pod。

这两个字段都包含了一个 requiredDuringSchedulingIgnoredDuringExecution 属性和一个 preferredDuringSchedulingIgnoredDuringExecution 属性:

  • requiredDuringSchedulingIgnoredDuringExecution: 在调度阶段必须满足的规则。
  • preferredDuringSchedulingIgnoredDuringExecution: 优先级较低的规则。

下面是一个使用 golang 进行 Pod 亲和度与互斥调度的例子:

import ("k8s.io/api/core/v1"
)// 创建 PodSpec 对象
podSpec := &v1.PodSpec{...Affinity: &v1.Affinity{PodAffinity: &v1.PodAffinity{ // 设置必须共存规则RequiredDuringSchedulingIgnoredDuringExecution: []v1.PodAffinityTerm{{LabelSelector: &metav1.LabelSelector{MatchLabels: map[string]string{"app": "nginx"},},Namespaces: []string{"default"},TopologyKey: "kubernetes.io/hostname",},},PreferredDuringSchedulingIgnoredDuringExecution: nil, // 暂不需要优先级较低的规则},PodAntiAffinity: &v1.PodAntiAffinity{ // 设置不得共存规则RequiredDuringSchedulingIgnoredDuringExecution: []v1.PodAffinityTerm{{LabelSelector: &metav1.LabelSelector{MatchLabels: map[string]string{"app": "nginx"},},Namespaces: []string{"default"},TopologyKey: "kubernetes.io/hostname",},},PreferredDuringSchedulingIgnoredDuringExecution: nil, // 暂不需要优先级较低的规则},},
}// 创建 Pod 对象
pod := &v1.Pod{...Spec: *podSpec,
}

在上述代码中,我们通过定义 PodAffinity 和 PodAntiAffinity 属性,并设置 requiredDuringSchedulingIgnoredDuringExecution 字段和相应的规则,来指定 Pod 的亲和度与互斥调度。这里我们要求必须共存的 Pod 必须是标签为 app=nginx 的 Pod,而不得共存的 Pod 也必须是标签为 app=nginx 的 Pod。

需要注意的是,在设置亲和度与互斥调度时,可以通过多种方式指定匹配规则,如使用 label selector、namespace 等。在实际使用中,请根据实际情况进行选择。

四,pod Taints 和Tolerations

在Kubernetes集群中,Taints和Tolerations是用于控制Pod是否可以被调度到某个Node上的机制。

  • Taints:Taints是标记Node的一种方式,通过将一个或多个Taints添加到Node上,可以限制哪些Pod能够调度到该节点。例如,如果您希望禁止在生产环境中运行的应用程序部署到具有特定硬件或软件配置的节点上,则可以使用Taint来实现这一点。
  • Tolerations:Tolerations是告诉Kubernetes哪些Pod可以调度到具有特定Taints的Node上的一种方法。如果您想要将特定应用程序部署到具有某些硬件或软件配置的节点上,则必须使用Tolerations来实现这一点。

例如,假设我们有三个节点:node1、node2和node3。我们希望防止任何Pod被调度到node1上,并且只允许具有“gpu=true”标签的Pod在node2和node3上进行调度。我们可以执行以下操作:

  1. 在 node1 上添加 taint
kubectl taint nodes node1 key=value:NoSchedule
  1. 在具有 toleration 的 Pod 上声明 toleration
apiVersion: v1
kind: Pod
metadata:name: gpu-pod
spec:containers:- name: gpu-containerimage: gpu-image:v1.0tolerations:- key: "gpu"operator: "Equal"value: "true"effect: "NoSchedule"

这样,只有具有“gpu=true”标签的Pod才能被调度到node2和node3上。而在node1上添加了taint,因此不会有任何Pod被调度到该节点上。

五,pod Priority 优先级调度

在 Kubernetes 集群中,Pod 被分配给 Node 运行。而 Pod 之间的优先级是由 Kubernetes 的调度器(Scheduler)来控制的。Pod 的优先级越高,则它被分配到节点上的机会就越大。

为了设置 Pod 的优先级,可以使用 PriorityClass 对象。PriorityClass 是一个资源对象,用于定义 Pod 的优先级和访问策略。

下面是一个示例 PriorityClass:

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:name: high-priority
value: 1000000
globalDefault: false
description: "This priority class should be used for important pods only."

在这个示例中,我们创建了一个名为 high-priority 的 PriorityClass,并将其值设置为 1000000。这意味着当一个 Pod 使用此 PriorityClass 来定义它的优先级时,它将比其他具有较低值的 PriorityClass 更容易被分配到节点上运行。

要使用这个 PriorityClass,请在 Pod 定义文件中添加如下字段:

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:priorityClassName: high-prioritycontainers:- name: my-containerimage: nginx

注意,在设置完 priorityClassName 字段后,请确保所有相关的 Node 上都安装了 kube-scheduler 组件,并且该组件已经启动。这样才能使调度器根据定义的优先级来调度 Pod 的运行。

相关文章:

在CSDN学Golang云原生(Kubernetes Pod调度)

一,NodeSelector定向调度 在 Kubernetes 中,可以使用 NodeSelector 字段来指定 Pod 调度到哪些节点上运行。NodeSelector 是一个键值对的 map,其中键是节点的标签名,值是标签值。具体步骤如下: 在节点上添加标签 首…...

Rust vs Go:常用语法对比(七)

题图来自 Go vs Rust: Which will be the top pick in programming?[1] 121. UDP listen and read Listen UDP traffic on port p and read 1024 bytes into buffer b. 听端口p上的UDP流量,并将1024字节读入缓冲区b。 import ( "fmt" "net&qu…...

【HarmonyOS】API6使用storage实现轻量级数据存储

写在前面 本篇内容基于API6 JS语言进行开发,通过结合轻量级数据存储开发指导的文档,帮助大家完成一个实际的代码案例,通过这个小案例,可以实现简单数据的存储。 参考文档:文档中心 1、页面布局 首先我们编写一个简单…...

Python Flask构建微信小程序订餐系统 (十二)

🔥 创建切换商品分类状态的JS文件 🔥 ; var food_act_ops={init:function(){this.eventBind();},eventBind:function(){//表示作用域var that = this;$(".wrap_search select[name=status]").change(function(){$(".wrap_search").submit();});$(&qu…...

C++——模板的作用2:特例化

目录 模板的形式: 一.模板的多参数应用: 例: 错误使用1:使用不标准的模板形参表 ​编辑 错误使用2:使用变量作为实参传递给函数模板 二.模板的特例化: 类模板: 针对模板的特化步骤&am…...

Python Web开发技巧VII

目录 装饰器inject_serializer 装饰器atomic rebase git 清理add的数据 查看git的当前工作目录 makemigrations文件名称 action(detailTrue, methods["GET"]) 如何只取序列化器的一个字段进行返回 Response和JsonResponse有什么区别 序列化器填表和单字段如…...

LaTex4【下载模板、引入文献】

下载latex模板:(模板官网一般都有,去找) 我这随便找了一个: 下载得到一个压缩包,然后用overleaf打开👇: (然后改里面的内容就好啦) 另外,有很多在线的数学公式编辑器&am…...

【VSCode部署模型】导出TensorFlow2.X训练好的模型信息

参考tensorflow2.0 C加载python训练保存的pb模型 经过模型训练及保存,我们得到“OptimalModelDataSet2”文件夹,模型的保存方法(.h5或.pb文件),参考【Visual Studio Code】c/c部署tensorflow训练的模型 其中“OptimalModelDataSet2”文件夹保…...

windows环境下,安装elasticsearch

目录 前言准备安装 jdk 安装nodejsElasticSearch下载ElasticSearch-head 下载 安装ElasticSearch安装ElasticSearch-head插件设置用户名密码访问ElasticSearch 默认用户名和密码参考 前言 win10elasticsearch 8.9.0 准备 安装 jdk ElasticSearch 是基于lucence开发的&#…...

Elasticsearch入门笔记(一)

环境搭建 Elasticsearch是搜索引擎,是常见的搜索工具之一。 Kibana 是一个开源的分析和可视化平台,旨在与 Elasticsearch 合作。Kibana 提供搜索、查看和与存储在 Elasticsearch 索引中的数据进行交互的功能。开发者或运维人员可以轻松地执行高级数据分析…...

记一次安装nvm切换node.js版本实例详解

最后效果如下: 背景:由于我以前安装过node.js,后续想安装nvm将node.js管理起来。 问题:nvm-use命令行运行成功,但是nvm-list显示并没有成功。 原因:因为安装过node.js,所以原先的node.js不收n…...

生态共建丨YashanDB与构力科技完成兼容互认证

近日,深圳计算科学研究院崖山数据库系统YashanDB V22.2与北京构力科技有限公司BIMBase云平台完成兼容性互认证。经严格测试,双方产品完全兼容、运行稳定。 崖山数据库系统YashanDB是深算院自主研发设计的新型数据库系统,融入原创理论&#xf…...

React从入门到实战-react脚手架,消息订阅与发布

创建项目并启动 全局安装 npm install -g create-react-app切换到想创建项目的目录,使用命令:create-react-app 项目名称 ​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存中…(iQ6hEUgAABpQAAAD1CAYAAABeIRZoAAAAAXNSR0IArs4c6QAAIABJREFUe…...

从零构建深度学习推理框架-1 简介和Tensor

源代码作者:https://github.com/zjhellofss 本文仅作为个人学习心得领悟 ,将原作品提炼,更加适合新手 什么是推理框架? 深度学习推理框架用于对已训练完成的神经网络进行预测,也就是说,能够将深度训练框…...

使用WGCLOUD监测安卓(Android)设备的运行状态

WGCLOUD是一款开源运维监控软件,除了能监控各种服务器、主机、进程应用、端口、接口、docker容器、日志、数据等资源 WGCLOUD还可以监测安卓设备,比如安卓手机、安卓设备等 我们只要下载对应的安卓客户端,部署运行即可,如下是下…...

C++笔记之迭代器失效问题处理

C笔记之迭代器失效问题处理 code review! 参考博文:CSTL迭代器失效的几种情况总结 文章目录 C笔记之迭代器失效问题处理一.使用返回新迭代器的插入和删除操作二.对std::vector 来说,擦除(erase)元素会导致迭代器失效 一.使用返回…...

Tomcat的startup.bat文件出现闪退问题

对于双击Tomcat的startup.bat文件出现闪退问题,您提供的分析是正确的。主要原因是Tomcat需要Java Development Kit (JDK)的支持,而如果没有正确配置JAVA_HOME环境变量,Tomcat将无法找到JDK并启动,从而导致闪退。 以下是解决该问题…...

JAVA8-lambda表达式8:在设计模式-模板方法中的应用

传送门 JAVA8-lambda表达式1:什么是lambda表达式 JAVA8-lambda表达式2:常用的集合类api JAVA8-lambda表达式3:并行流,提升效率的利器? JAVA8-lambda表达式4:Optional用法 java8-lambda表达式5&#xf…...

React之组件间通信

React之组件间通信 组件通信: 简单讲就是组件之间的传值,包括state、函数等 1、父子组件通信 父组件给子组件传值 核心:1、自定义属性;2、props 父组件中: 自定义属性传值 import Header from /components/Headerconst Home ()…...

【MATLAB第58期】基于MATLAB的PCA-Kmeans、PCA-LVQ与BP神经网络分类预测模型对比

【MATLAB第58期】基于MATLAB的PCA-Kmeans、PCA-LVQ与BP神经网络分类预测模型对比 一、数据介绍 基于UCI葡萄酒数据集进行葡萄酒分类及产地预测 共包含178组样本数据,来源于三个葡萄酒产地,每组数据包含产地标签及13种化学元素含量,即已知类…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...

ui框架-文件列表展示

ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...