kubernetes深入理解Pod对象之调度篇

news2025/7/13 8:12:09

目录

一、Pod调度流程

二、 容器资源限制

2.1 内存和CPU限制

三、 NodeSelector

四、NodeAffinity

4.1 基本概念

4.2 Pod 示例

4.2.1使用首选的节点亲和性调度 Pod

4.2.2依据强制的节点亲和性调度 Pod 

五、Taints与Tolerations

5.1 基本概念

5.2Taints与Tolerations

六、NodeName

6.1 基本概念

6.2 NodeName 字段的 Pod 规约示例


一、Pod调度流程


Kubernetes 基于 list-watch 机制的控制器架构,实现组件间交互的解耦。

其他组件监控自己负责的资源,当这些资源发生变化时,kube- apiserver 会通知这些组件,这个过程类似于发布与订阅。

调度大致流程

  1. 用户使用 create yaml 创建 pod,请求给 apiServer,apiserver 将 yaml 中的属性信息(metadata) 写入 etcd
  2. apiServer 触发 watch 机制准备创建 pod,信息转发给调度器,调度器使用调度算法选择node,调度器将node信息给 apiServer,apiServer 将绑定的 node 信息写入etcd
  3. apiServer 又通过 watch 机制,调用 kubelet,指定 pod 信息,触发 docker run 命令创建容器
  4. 创建完成之后反馈给kubelet, kubelet又将pod的状态信息给apiserver,
  5. apiserver又将pod的状态信息写入etcd。
  6. 其中kubectl get pods命令调用的时etcd_的信息

二、 容器资源限制


2.1 内存和CPU限制

容器使用的最大资源限制:

• resources.limits.cpu

• resources.limits.memory

容器使用的最小资源需求,作为容器调度时资源分配的依据:

• resources.requests.cpu

• resources.requests.memory

官方示例:为容器和 Pod 分配内存资源 | Kubernetes

示例

apiVersion: v1
kind: Pod
metadata:
  name: pod-resource 
spec:
  containers:
  - name: web
    image: nginx
    resources:
      requests:   # 容器最小资源配额
        memory: "64Mi"
        cpu: "250m"
      limits:     # 容器最大资源上限
        memory: "128Mi"
        cpu: "500m"

使用 describe 查看 pod 的描述信息


三、 NodeSelector


nodeSelector:用于将Pod调度到匹配Label的Node上,如果没有匹配的标签会调度失败。作用:

• 约束Pod到特定的节点运行

• 完全匹配节点标签应用场景:

• 专用节点:根据业务线将Node分组管理

• 配备特殊硬件:部分Node配有SSD硬盘、GPU

示例操作

### 给node2 打上SSD 的标签
kubectl label node k8s-node2 disktype=ssd

## 查看node 的标签信息
kubectl get node k8s-node2 --show-labels

 创建一个pod ,将pod调度到 带有 SSD标签的k8s-node2节点上

apiVersion: v1
kind: Pod
metadata:
  name: pod-node-selector
spec:
  nodeSelector:
    disktype: 'ssd'
  containers:
  - name: web
    image: nginx

 查看是否调度到 k8s-node2 节点上


四、NodeAffinity


4.1 基本概念

用节点亲和性把 Pods 分配到工作节点。

nodeAffinity:节点亲和性,与nodeSelector作用一样,但相比更灵活,满足更多条件,诸如:

• 匹配有更多的逻辑组合,不只是字符串的完全相等

• 调度分为软策略和硬策略,而不是硬性要求

• 硬(required):必须满足

• 软(preferred):尝试满足,但不保证

操作符:In、NotIn、Exists、DoesNotExist、Gt、Lt

官方示例:

用节点亲和性把 Pods 分配到节点 | Kubernetes

4.2 Pod 示例

4.2.1使用首选的节点亲和性调度 Pod

下面示例软策略匹配 节点标签 gpu=nvidia

apiVersion: v1
kind: Pod
metadata:
  name: pod-node-affinity
spec:
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: gpu
            operator: In
            values:
            - nvidia
  containers:
  - name: web
    image: nginx

 软性策略调度到 k8s-master1 节点上,master1 并没有该 gpu=nvidia 标签 ,软性策略调度成功。

4.2.2依据强制的节点亲和性调度 Pod 

apiVersion: v1
kind: Pod
metadata:
  name: pod-node-affinity2
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: gpu
            operator: In
            values:
            - nvidia
  containers:
  - name: web
    image: nginx

如上改为硬性策略后 ,pod 必须调度到 有标签gpu=nvidia 的节点上,而k8s测试集群中没有这样的节点 

如下 我们可以看到 pod-node-affinity2 处于Pending 状态

使用describe 查看pod 状态,没有匹配到 node

Warning FailedScheduling 36s default-scheduler 0/4 nodes are available: 4 node(s) didn't match Pod's node affinity/selector. preemption: 0/4 nodes are available: 4 Preemption is not helpful for scheduling.


五、Taints与Tolerations


5.1 基本概念

节点亲和性 是 Pod 的一种属性,它使 Pod 被吸引到一类特定的节点 (这可能出于一种偏好,也可能是硬性要求)。 污点(Taint)则相反——它使节点能够排斥一类特定的 Pod。

容忍度(Toleration)是应用于 Pod 上的,允许(但并不要求)Pod 调度到带有与之匹配的污点的节点上。

污点和容忍度(Toleration)相互配合,可以用来避免 Pod 被分配到不合适的节点上。 每个节点上都可以应用一个或多个污点,这表示对于那些不能容忍这些污点的 Pod,是不会被该节点接受的。

Taints:避免Pod调度到特定Node上

Tolerations:允许Pod调度到持有Taints的Node上应用场景:

• 专用节点:根据业务线将Node分组管理,希望在默认情况下不调度该节点,只有配置了污点容忍才允许分配

• 配备特殊硬件:部分Node配有SSD硬盘、GPU,希望在默认情况下不调度该节点,只有配置了污点容忍才允许分配

• 基于Taint的驱逐

5.2Taints与Tolerations

污点和容忍度 | Kubernetes

查看节点标签

 pod3.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod3
spec:
  containers:
  - name: web
    image: nginx

给 k8s-master1 和 k8s-master2 打上 污点, 键名是 gpu ,键值是 nvidia ,效果是 NoSchedule。表示只有拥有和这个污点相匹配的容忍度的 pod 才能被分配到 两个 master节点上。 

kubectl taint node k8s-master1 gpu=nvidia:NoSchedule
kubectl taint node k8s-master2 gpu=nvidia:NoSchedule

 给两个 node 节点也打上污点

## k8s-node1  打上 GPU 污点
kubectl taint node k8s-node1 gpu=nvidia:NoSchedule
## k8s-node2  打上 ssd 污点
kubectl taint node k8s-node2 ssd=ssd:NoSchedule

## 起一个 Pod
apiVersion: v1
kind: Pod
metadata:
  name: pod4
spec:
  containers:
  - name: web
    image: nginx

可以看到 pod4 处于 Pending 状态,没有配置污点容忍 pod无法调度成功

Warning FailedScheduling 24s default-scheduler 0/4 nodes are available: 1 node(s) had untolerated taint {ssd: ssd}, 3 node(s) had untolerated taint {gpu: nvidia}. preemption: 0/4 nodes are available: 4 Preemption is not helpful for scheduling.

我们给 k8s-node2 加上 ssd 污点容忍,让 pod5 在 k8s-node2 上调度

apiVersion: v1
kind: Pod
metadata:
  name: pod5
spec:
  tolerations:
  - key: "ssd"
    operator: "Equal"
    value: "ssd"
    effect: "NoSchedule"
  containers:
  - name: web
    image: nginx

 由于其他 node 有污点,node2 有 ssd 污点容忍,在 pod5 在node2上成功运行。

污点移除

kubectl taint node k8s-master2 gpu=nvidia:NoSchedule-
kubectl taint node k8s-master1 gpu=nvidia:NoSchedule-
kubectl taint node k8s-node1 gpu=nvidia:NoSchedule-
kubectl taint node k8s-node2 ssd=ssd:NoSchedule-

六、NodeName


6.1 基本概念

nodeName 是比亲和性或者 nodeSelector 更为直接的形式。nodeName 是 Pod 规约中的一个字段。如果 nodeName 字段不为空,调度器会忽略该 Pod, 而指定节点上的 kubelet 会尝试将 Pod 放到该节点上。 使用 nodeName 规则的优先级会高于使用 nodeSelector 或亲和性与非亲和性的规则。

使用 nodeName 来选择节点的方式有一些局限性:

  • 如果所指代的节点不存在,则 Pod 无法运行,而且在某些情况下可能会被自动删除。
  • 如果所指代的节点无法提供用来运行 Pod 所需的资源,Pod 会失败, 而其失败原因中会给出是否因为内存或 CPU 不足而造成无法运行。
  • 在云环境中的节点名称并不总是可预测的,也不总是稳定的。

6.2 NodeName 字段的 Pod 规约示例

apiVersion: v1
kind: Pod
metadata:
  name: pod6
spec:
  containers:
  - name: nginx
    image: nginx
  nodeName: k8s-node2

k8s-master1 和 k8s-master2 ,还有 k8s-node1 和k8s-node2 都打上了污点,nodeName的优先级更高,所以pod 成功调度。

 

 

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

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

相关文章

Ceph块存储

目录 一、环境准备 二、什么是块存储 三、创建块共享 1、查看存储池 2、创建镜像、查看镜像 3、镜像扩容、缩容 四、客户端通过KRBD访问共享镜像 1、客户端安装 2、客户端配置 3、客户端获取镜像 4、客户端写入数据 五、快照 1、查看、创建快照 2、还原快照 六、…

shell实战案例:系统性能监控脚本

一 简介 下面我们来编写一个检测系统环境、监控系统性能的脚本,并判断各项数据指标是否符合预设的阈值。如果数据有异常,就报警,如何报警,视情况而定。注意脚本中的很多预设值只是假设值,在实际生产环境中还需要根据业…

cubeIDE开发, 物联网应用之stm32的蓝牙通信设计

一、蓝牙通信技术 蓝牙技术是一种点对点点对面的网络构架,他可以在限制的范围内以很快的速度传输网络数据,在物联网应用中,支持网状网络的物联网短距离无线通信。目前它还被广泛用于智能可穿戴设备、智能门锁、智能医疗设备、智能照明设备、智…

十二、CANdelaStudio入门-Security

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的Security概念,欢迎各位朋友订阅、评论,…

【GamePlay】Unity手机屏幕UI适配问题

前言 关于UI不同分辨率适配问题和摄像机视口的注意事项 画布大小与锚点 首先要了解这两个东西 对于画布大小,主要理解match的含义,滑到Width时,表示以宽度为基准,Width不变,Height根据真机分辨率改变。 比如自己设…

pytest测试框架搭建

文章目录一、pytest是什么?二、pytest的特点三、pytest下载安装四、pytest的配置五、pytest约束规则六、编写脚本七、pytest的运行方式1、主函数模式2、命令行模式3、通过读取pytest ini配置文件运行 (最主要运用的方式)一、pytest是什么&…

【Unity】按Text文本内容自适应背景大小

按照文本内容自动调节背景框大小是十分方便的,本文章记录一下通过无代码方式实现该效果。(版本Unity2018.4) 目录 一、Text组件操作 二、Image组件操作 三、效果展示 一、Text组件操作 创建新的Text组件,然后进行下面操作&am…

LabVIEW避免在使用functional global时内存中有多个大数组的拷贝

LabVIEW避免在使用functional global时内存中有多个大数组的拷贝 有一个非常大的数组,但想保证在内存中只有一个拷贝.知道可以用移位寄存器,并用"ReplaceArray Subset" VI 保证只有一个拷贝。然而,想使之成为一个functionalglobal。因为,不能…

Ceph对象存储

目录 一、环境准备 二、什么是对象存储 三、部署对象存储服务 1、启动RGW服务 2、更改RGW服务端口 3、客户端测试 一、环境准备 Ceph集群搭建参照:Ceph集群部署_桂安俊kylinOS的博客-CSDN博客 以下Ceph存储实验环境均基于上述Ceph集群环境搭建。 二、什么是…

理解中国经济的五层思维-中国视角下的宏观经济

理解中国经济的五层思维 – 潘登同学的宏观经济学笔记 文章目录理解中国经济的五层思维 -- 潘登同学的宏观经济学笔记思想的力量理解中国经济的五层思维第一层思维:唯GDP论第二层思维:天真的市场派(新-新古典综合世界观对中国经济的影响)第三层思维&…

20221126给Chrome浏览器安装扩展程序——猫抓

20221126给Chrome浏览器安装扩展程序——猫抓 2022/11/26 21:43 百度:chrome 猫爪 https://www.onlinedown.net/soft/1232149.htm 猫抓 1.0.17 最新版 设置→ 01 百度搜索 QQ图片20221126214334.png 02 猫抓 QQ图片20221126214407.png 03 设置.png 04扩展程序.…

HTTP介绍报文格式构造

HTTP 一. 简单介绍一下: 二. 学习报文格式: 三. HTTP中的细节介绍 四, 如何构造一个HTTP请求 一. 简单介绍一下: 是应用层的典型协议客户端发送一个HTTP请求, 服务器返回一个HTTP响应(一问(请求)一答(响应)的)HTTP是文本格式的协议二. 学习报文格式: 1)先简单看一看HTTP的…

有监督学习神经网络的回归拟合——基于红外光谱的汽油辛烷值预测(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

2022年11月26日NaiveBayes

参考 ​ 朴素贝叶斯算法的核心思想是通过考虑特征概率来预测分类,即对于给出的待分类样本,求解在此样本出现的条件下各个类别出现的概率,哪个最大,就认为此待分类样本属于哪个类别。 ​ 我的理解是已知结果然后计算所有导致结果原…

[BJDCTF2020]EzPHP

前言 这个题目考的php知识真的比较多,也比较经典。由于我php基础不是很好,总会遇到一些问题。花时间弄懂这道题后也能更加巩固所学的知识。所以这道题还是有必要记录下来的。 题目 打开题目,在前端代码注释有这么一行编码。 受固化思想的影…

[CVPR2022] Cross-Model Pseudo-Labeling for Semi-Supervised Action Recognition

Cross-Model Pseudo-Labeling for Semi-Supervised Action Recognition 要点: 1、半监督动作识别,使用伪标记分配未标记数据,然后在训练中用作附加的监督 2、最近研究:伪标签通过在标记数据上训练模型获取,然后使用来…

重装系统电脑黑屏开不了机如何处理

​电脑使用时间久了难免就出现各种故障,比如卡顿、黑屏甚至崩溃直接开不了机。那么电脑黑屏开不了机怎么办呢?其实还是有解决的办法的,接下来看看小编是如何解决的吧! 工具/原料: 系统版本:windows 10系统 品牌型号&#xff1…

求余数联系和赋值运算

算术和赋值运算符 算术运算符&#xff1a; (加)、 -(减)、 *(乘)、 /(除)、 %(求余) 赋值运算符&#xff1a;、 、 -、 *、 /、 % 加法运算代码及效果 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title&…

Wlan三层组网+三层漫游

目录 wlan漫游配置(三层漫游)拓扑图和配置如下 思路: wlan配置不指定漫游组服务器的ac间漫游,实现笔记本之间在wlan覆盖范围内移动时业务不中断 要求:请大家参考教材196页完成AC间三层漫游配置&#xff0c;提交拓扑截图&#xff0c;ap上线截图&#xff0c;sta获取IP截图&#…

cpu设计和实现(协处理器hi和lo)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多同学可能不了解mips处理器&#xff0c;如果个人想补充一点mips cpu的知识&#xff0c;可以找些书籍资料来读一下&#xff0c;比如《See Mips R…