24.污点和容忍度深入研究

24.污点和容忍度深入研究

Taint(污点)和Toleration(容忍度)可以作用于node和pod上,其目的是优化pod在集群间的调度,这跟节点亲和性类似;

只不过它们作用的方式相反,其用作确保pod不会被调度在指定的节点上。

1.概念引入

在这里插入图片描述

为了可以让大家更简单、更直观的了解到污点和容忍度的意思,我这里画了个趣图。

如图所示,node节点上分别有云、五角星、十字架这三个不同组合的污点;Pod-A上有云和五角星的污点容忍度,Pod—B上则没有容忍度。

最终调度结果为:
1.Pod-A:调度至node-1和node-3
2.Pod-B:只会调度至node-3

注意:Taints(污点)存在于node,Tolerations(容忍度)存在于pod

再举个例子,3d的射击类游戏一般会让人有头晕目眩的感觉(这就是污点),如果你是长期射击类游戏的玩家(这就是容忍度),就不会有问题,且愿意尝试这块游戏(这就是完成匹配,准备调度)

此时,你对污点和容忍度应该有了较基础的了解了。

2.污点和容忍度配置

污点的容忍度配置主要有三个字段:key、value和effect,其中:

1>key:表示字段名,如图形
2>value:表示字段值,如云、五角星、十字架
3>effect:表示调度规则,其又细分:Noschedule、PreferNoSchedule和NoExecute三种

具体描述可参考下面的表格:

参数描述
keystring类型,最大长度253个字符,必须小写或数字开头
valuestring类型,最大长度63个字符,必须小写或数字开头
effect:Noschedule1.不允许非法pod调度上来。2.taints变更后,不会驱离非法的pod
effect:PreferNoSchedule1.最好不要把非法pod调度上来。2.taints变更后,不会驱离非法的pod
effect:NoExecute1.不允许非法pod调度上来。2.taints变更后,会驱离非法的pod,驱离时间为tolerationSeconds

3.怎么配置?

就如我上面所说,无论是Taints还是Tolerations(污点和容忍度),都有三个字段:key、value和effect,那么他们是如何匹配工作的呢?

此时会用到一个判断控制器operator,具体匹配规则如下:

operator描述
Equal(默认) key、value和effect必须都相同
Existskey和effect必须相同
需要注意operator没指定的话,默认是Equal。

另外,这里还有两个特殊用法:

tolerations:
- operator: "Exists"

1>Exists:空字段key,会匹配所有的keys, values and effects,意味着容忍所有

tolerations:
- key: "key"
  operator: "Exists"

2>Exists:空effect,会匹配所有的键为"key"的effect

4.内置污点

从K8S1.6开始支持了很多封装好的驱离式effect,node controller会根据实际情况,自动给node节点打上对应污点,保证了Pod调度的合理性和安全性,从而对生产环境保驾护航。

具体如下所示:

taint effect描述
node.kubernetes.io/not-ready节点未就绪
node.kubernetes.io/unreachable节点不可达
node.kubernetes.io/out-of-disk节点地盘耗尽
node.kubernetes.io/memory-pressure内存存在压力
node.kubernetes.io/disk-pressure磁盘存在压力
node.kubernetes.io/network-unavailable网络不可用
node.kubernetes.io/unschedulable节点不可调度
node.cloudprovider.kubernetes.io/uninitialized节点未初始化,不可用

试想一下,如果没有这些内置的effect帮助会怎么样呢?

如果节点还未就绪,就有pod调度上来,又比如节点的硬盘资源已经满了,pod再调度上来?等等;
这是不是很不合理,也很可怕呢?

5.常用命令补充

命令说明
kubectl taint -htaint的帮助命令
kubectl taint nodes foo dedicated=special-user:NoSchedule给node打污点,修改时需要使用–overwrite=true进行覆盖
kubectl taint nodes foo dedicated:NoSchedule-移除taint污点

6.实战:Taints and Tolerations

1)首先给centos-3这个节点打上污点,其key=department,value=ops,effect=NoSchedule

kubectl taint nodes centos-3.shared department=ops:NoSchedule

我们再来回顾一下NoSchedule的策略:
1.不允许非法pod调度上来。
2.taints变更后,不会驱离非法的pod。

2)接着,我们编辑filebeat-ds,并apply

注意:这时候的ds应该不会调度至我们打了污点的centos-3.shared节点上。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat-ds
  labels:
    app: filebeat
spec:
  selector:
    matchLabels:
      app: filebeat
  template:
    metadata:
      labels:
        app: filebeat
    spec:
      containers:
      - name: filebeat
        image:  prima/filebeat:6.4.2
        env:
        - name: REDIS_HOST
          value: db.ikubernetes.is:6379
        - name: LOG_LEVEL
          value: info

3)发现ds并没有部署到centos-3节点,污点配置生效,且和预期一致

[root@centos-1 dingqishi]# kubectl get pod -o wide
NAME                     READY   STATUS              RESTARTS   AGE    IP           NODE              NOMINATED NODE   READINESS GATES
filebeat-ds-tg7gf        0/1     ContainerCreating   0          3m2s   <none>       centos-2.shared   <none>           <none>

4)接着,我们delete之前的yaml,重新编辑file-ds-tolerations.yaml(增加相关容忍度,希望能容忍centos-3.shared节点的污点),并apply

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat-ds
  labels:
    app: filebeat
spec:
  selector:
    matchLabels:
      app: filebeat
  template:
    metadata:
      labels:
        app: filebeat
    spec:
      containers:
      - name: filebeat
        image:  prima/filebeat:6.4.2
        env:
        - name: REDIS_HOST
          value: test.db:6379
        - name: LOG_LEVEL
          value: info
      tolerations:
      - key: "department"
        operator: "Equal"
        value: "ops"
        effect: "NoSchedule"

5)观察pod,发现centos-3.shared已经运行pod,新增的容忍度功能成功

[root@centos-1 dingqishi]# kubectl get pod -o wide
NAME                     READY   STATUS              RESTARTS   AGE     IP           NODE              NOMINATED NODE   READINESS GATES
filebeat-ds-l2png        0/1     ContainerCreating   0          2m43s   <none>       centos-2.shared   <none>           <none>
filebeat-ds-qq2nc        0/1     ContainerCreating   0          2m43s   <none>       centos-3.shared   <none>           <none>

6)接下来我们修改node3污点,测试Noschedule策略是否如期一致,是否会在taints变更后,不会驱离非法的pod?

kubectl taint nodes centos-3.shared department=test:NoSchedule --overwrite=true

7)我们发现pod还是在运行,并不会驱离,和预期一致

[root@centos-1 dingqishi]# kubectl get pod -o wide
NAME                     READY   STATUS              RESTARTS   AGE     IP           NODE              NOMINATED NODE   READINESS GATES
filebeat-ds-l2png        0/1     ContainerCreating   0          5m18s   <none>       centos-2.shared   <none>           <none>
filebeat-ds-qq2nc        0/1     ContainerCreating   0          5m18s   <none>       centos-3.shared   <none>           <none>

8)最后,我们将node3的污点effect修改为NoExecute,观察pod是否被驱离

如果没指定tolerationSeconds,就会马上驱离

kubectl taint nodes centos-3.shared department=test:NoExecute --overwrite=true

9)发现centos-3.shared上已经没有pod了,和预期一致

[root@centos-1 dingqishi]# kubectl get pod -o wide
NAME                     READY   STATUS             RESTARTS   AGE     IP           NODE              NOMINATED NODE   READINESS GATES
filebeat-ds-l2png        0/1     ImagePullBackOff   0          7m37s   10.244.1.7   centos-2.shared   <none>           <none>
### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

湫一刀

希望大家多多支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值