污点 节点亲和性 容忍度

污点是K8s高级调度的特性,用于限制哪些Pod可以被调度到某一个节点。在普通节点横向时我们可以使用污点容忍度创建恶意pod来对主节点进行横向控制。

1、kube-scheduler调度

kube-schedulerKubernetes 集群的默认调度器,并且是集群控制面(master)的一部分。对每一个新创建的Pod或者是未被调度的Pod,kube-scheduler会选择一个最优的Node去运行这个Pod。

然而,Pod内的每一个容器对资源都有不同的需求,而且Pod本身也有不同的资源需求。因此,Pod在被调度到Node上之前,根据这些特定的资源调度需求,需要对集群中的Node进行一次过滤。

如下为在创建pod的流程中,调度器的作用:

当创建pod时候,会首先把创建的命令请求提交给apiserver,通过一系列认证授权,apiserver把pod数据存储到etcd,创建deployment资源并初始化。然后再是scheduler通过进行list-watch机制进行监测,经过调度算法把pod调度到某个node节点上,最后信息更新到etcd,再后面就是kubelet接受信息到创建容器。

2、哪些因素影响调度

1.pod资源限制

当前调度器选择适当的节点时,调度程序会检查每个节点是否有足够的资源满足 Pod 调度,比如查看CPU和内存限制是否满足:

通过资源限制调度程序可确保由于过多 Pod 竞争消耗节点所有可用资源,从而导致节点资源耗尽引起其他系统异常。

2.节点选择器nodeSelector

在创建pod的时候,节点选择器可以约束pod在特定节点上运行。

nodeSelector 也是节点选择约束的最简单推荐形式,nodeSelector 字段添加到 Pod 的规约中设置希望目标节点所具有的节点标签。 K8s 只会将 Pod 调度到拥有你所指定的每个标签的节点上。

例子, 比如多个节点需要调度时候,通过给1,2节点打上标签,创建pod时候使用节点选择器,那么pod会被按照节点选择器希望的目标在相应节点调度。

为节点打上标签:

kubectl label node nodename env_role=env

查看节点的标签:

kubectl get nodes nodename --show-labels

3.节点亲和性nodeAffinity

节点亲和性概念上类似于 nodeSelector, 它使可以根据节点上的标签来约束 Pod 可以调度到哪些节点上,这种方法比上面的nodeSelector更加灵活,它可以进行一些简单的逻辑组合了,不只是简单的相等匹配。

节点亲和性和节点选择器相比功能更强大,比如还是刚才的图,如果我使用节点选择器env_role:dev1的话是找不到相应的节点的,就没有办法调度,会一直是一个等待的状态:

但我如果使用节点亲和性,就算当前没有这个节点,我还是可以根据调度调度策略进行调度,不只是简单的相等匹配。

调度策略

调度可以分成软策略(软亲和性)和硬策略(硬亲和性)两种方式:

  • 软亲和性(preferredDuringSchedulingIgnoredDuringExecution)就是如果你没有满足调度要求的节点的话,POD 就会忽略这条规则,继续完成调度过程,说白了就是满足条件最好了,没有的话也无所谓了的策略;

  • 硬亲和性(requiredDuringSchedulingIgnoredDuringExecution)表示当前的条件必须满足,如果没有满足条件的节点的话,就不断重试直到满足条件为止,简单说就是你必须满足我的要求,不然我就不干的策略。

如图可以看到软亲和性和硬亲和性的字段其实差不多,软亲和性多了一个weight字段,表权重:

亲和性操作符

如上亲和性还有一个字段是operator表匹配的逻辑操作符,可以使用descirbe命令查看具体的调度情况是否满足我们的要求,K8s提供的操作符有下面的几种:

  • In:label 的值在某个列表中
  • NotIn:label 的值不在某个列表中
  • Gt:label 的值大于某个值
  • Lt:label 的值小于某个值
  • Exists:某个 label 存在
  • DoesNotExist:某个 label 不存在

如果nodeSelectorTerms下面有多个选项的话,满足任何一个条件就可以了;如果matchExpressions有多个选项的话,则必须同时满足这些条件才能正常调度 POD。

污点(Taints)与容忍(tolerations)

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

对于节点亲和性无论是软亲和性和硬亲和性,都是调度 POD 到预期节点上,而污点(Taints)恰好与之相反,如果一个节点标记为 Taints除非 POD 也被标识为可以容忍污点节点,否则该 Taints 节点不会被调度pod

污点(Taints)

查看污点情况:

kubectl describe node nodename | grep Taint

可以看到,默认污点也只有master有。

污点里的值有三种:

  1. NoSchedule:POD 不会被调度到标记为 taints 节点。
  2. PreferNoSchedule:NoSchedule 的软策略版本。
  3. NoExecute:该选项意味着一旦 Taint 生效,如该节点内正在运行的 POD 没有对应 Tolerate 设置,会直接被逐出。

NoSchedule就是字面意思,不会被调度,PreferNoSchedule说白了是尽量不被调度,NoExecute是不会调度并且还会驱逐node已有的pod

创建一个pod:

如果不加污点,可以看到这个pod会随机调度到节点1或者节点2:

这时候把pod删除了,重新创建pod并且给node加上污点:

给节点打污点:

kubectl taint node nodename key=value:NoSchedule

重新创建pod并且deployment多个:

可以发现全部被调度在节点2上,节点1的污点NoSchedule起了作用。

删除污点:

污点容忍度(tolerations)

容忍度tolerations是定义在 Pod对象上的键值型属性数据,用于配置其可容忍的节点污点,而且调度器仅能将Pod对象调度至其能够容忍该节点污点的节点之上。

污点定义在节点的node Spec中,而容忍度则定义在PodpodSpec中,它们都是键值型数据。

Pod对象上定义容忍度时,它支持两种操作符:一种是等值比较Equal,表示容忍度与污点必须在keyvalueeffect三者之上完全匹配;另一种是存在性判断Exists,表示二者的keyeffect必须完全匹配,而容忍度中的value字段要使用空值。

这里的key和value对应的值都是你自己设置的key和value:

说白了就是:

  • 如果operatorExists(此时容忍度不能指定 value)
  • 如果operatorEqual,则它们的value应该相等

而污点容忍的作用举个例子,如果像上面污点一样设置了NoSchedule污点的节点,那么创建pod的时候是必不被调度到的,但是如果我使用污点容忍,那这个节点可以在设置NoSchedule污点的情况下可能又被调度,类似于亲和性那种作用。

3、污点横向渗透

污点和污点容忍度的作用也就是获取主节点的shell,因为像常见或者节点shell的流程是创建pod--》分配到正常node---》通过常规挂载目录拿到节点的shell,而默认主节点是不被调度的,所以只有使用污点容忍度,创建一个能够被调度到master节点的pod,然后通过挂载之类的手法来拿到主节点的shell。

通过创建一个具有node-role.kubernetes.io/master:NoSchedule的容忍度让Pod被Kubernetes Master所调度。

apiVersion: v1
kind: Pod
metadata:name: nginxlabels:env: test
spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresenttolerations:- key: "node-role.kubernetes.io/master"operator: "Exists"effect: "NoSchedule"

如上的Pod中将宿主机的根目录挂载到容器中(volumes与volumeMounts)即可逃逸至Kubernetes Master中接管集群。

查看节点,当前是在普通节点:

多次创建可以发现在master节点上了:

可以通过挂载操作master节点母机shell:

K8s污点容忍度横向主节点相关推荐

  1. k8s污点容忍度概念介绍

    1. 概念介绍 污点(Taint) 应用于node身上,表示该节点有污点了,如果不能忍受这个污点的pod,你就不要调度/运行到这个节点上.如果是不能运行到这个节点上,那就是污点驱逐了. 容忍度(Tol ...

  2. K8S污点容忍度调度

    污点类型 解释(相当于做标签) kubectl taint nodes node key=value:NoSchedule 添加effect类型污点,新的pod不能调度过来,老的不影响 kubectl ...

  3. 云原生kubernetes七 :Pod进阶篇:污点-容忍度-亲和性-Affinity-调度

    1.pod资源清单详细介绍 #版本号 apiVersion: v1 #资源类型 kind: Pod #元数据 metadata:#Pod名字name: string#pod所属命名空间namespac ...

  4. Kubernetes 调度 - 污点和容忍度详解

    当我们使用节点亲和力(Pod 的一个属性)时,它会将Pod吸引到一组节点(作为偏好或硬性要求).污点的行为完全相反,它们允许一个节点排斥一组 Pod. 在 Kubernetes 中,您可以标记(污染) ...

  5. 3.11 污点和容忍度

    文章目录 一.污点和容忍度介绍 1.显示污点信息 2.显示容忍度信息 3.污点因子 二.污点应用 三.污点容忍度应用 上一章节介绍了,pod的调度方式有选择器.节点亲和性.pod亲和性和反亲和性,本章 ...

  6. 云原生之Kubernetes:24、污点和容忍度详解

    文章目录 前言 1.概念引入 2.污点和容忍度配置 3.该如何配置? 4.内置污点 5.常用命令补充 6.实战:Taints and Tolerations 前言 Taint(污点)和Tolerati ...

  7. K8s 污点(Taints)与容忍(Tolerations)

    概念 先来看一个容忍标记和污点标记的调度关系图: 与 亲和性(点击查看) 不同的是:Taints(污点)恰恰相反,它可以 Pod 不被调度到污点 Node,甚至将已经在污点中运行的 Pod 驱逐掉. ...

  8. Kubernetes 笔记(08)— Daemonset 产生缘由、yaml 描述、使用方法、污点和容忍度的定义及使用、静态 Pod

    DaemonSet,它会在 Kubernetes 集群的每个节点上都运行一个 Pod,就好像是 Linux 系统里的"守护进程"(Daemon). 1. 产生缘由 Deployme ...

  9. 图解 K8S(06):调度利器之污点与容忍度(压力驱逐)

    本系列教程目录(已发布): 图解 K8S(01):基于ubuntu 部署最新版 k8s 集群 图解 K8S(02):认识 K8S 中的资源对象 图解 K8S(03):从 Pause 容器理解 Pod ...

  10. K8S 污点和容忍度

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

最新文章

  1. 使用Valgrind的callgrind做c/c++代码的code profiling/性能调优
  2. 深入剖析 iOS 编译 Clang LLVM(编译流程)
  3. 天翼云centos7.5系统挂载磁盘
  4. git 撤销对工作区中文件的修改
  5. Blazor 模板化组件开发指南
  6. 图谱(学习地图)系列总结,持续更新中
  7. Odoo10参考系列--混合而有用的类
  8. 将pdbqt文件转成SMILES文件
  9. 以WinGrub 引导安装Fedora 4.0 为例,详述用WinGrub来引导Linux的安装
  10. 如何在Android Studio中获取SHA-1指纹证书以获得调试模式?
  11. scala的map映射问题
  12. 固态硬盘测试软件怎么测速,AS SSD Benchmark(SSD硬盘测速工具),如何发挥最佳性能?...
  13. MySQL二进制日志文件格式
  14. c语言pic延时1ms程序,几个延时子程序
  15. matlab的wthcoef函数,小波去噪及其MATLAB中的函数.pdf
  16. 动态随机存储器的刷新
  17. 计算机网络安全ipc默认共享,关闭远程ipc共享
  18. 马虎词汇教程21-25(转载)
  19. 网络基础一(物理层)
  20. SpringBoot+EasyPOI word模板导出,含多张图片

热门文章

  1. STM32实战总结:HAL之触摸屏
  2. 【易错】Python中for循环删除元素,有个坑,请勿入坑!!
  3. 最新Oracle官网JDK 8.0的下载
  4. mysql创建联合主键
  5. 三口烧瓶规格有哪些_三口烧瓶有哪些规格,用途是什么 | | 化工资讯网
  6. 最新版火车头织梦内容发布规则_火车头采集 - 织梦图集发布模块的制作
  7. 操作系统实验六、死锁问题实验——单车道问题
  8. 我的世界java版安装mod手机版,我的世界国际版手机版
  9. java对zip、rar、7z文件带密码解压实例
  10. 密钥管理系统研究(一)