kubernetes学习之路--污点容忍度横向主节点

news2024/11/15 18:56:49

参考:K8s污点容忍度横向主节点-安全客 - 安全资讯平台

一.kube-scheduler调度

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

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

通俗来讲:在k8s集群中,我们不需要手动创建一个容器,我们只需要编辑Pod的配置文件,然后k8s就会根据我们的需求自动生成一个Pod,而Pod是会运行在某个node节点上的,那么如何做到这样就需要使用调度器(scheduler)和调度算法了。

从安全角度出发的话,要想体现出scheduler的作用,我们想的就是是否只拥有node节点上创建Pod的权限,但最终可以实现创建Pod到master节点。

二.影响调度的因素

2.1.pod资源限制

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

例如:下面是一个Pod的配置文件,关注spec字段中的resources的内容,其中requests是要求分配给这个Pod的内存为7.2G,内存限制也是7.2G

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

2.2 节点选择器nodeSelector 

这个就是方便运维人员管理的了,和docker差不多,打一个tag方便知道这个node的作用。

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

#打标签
kubectl label node nodename env_role=worker-node

#查看标签
kubectl get nodes k8s-worker --show-labels

 然后我们在配置文件的spec字段中加入nodeSelector就可以实现让这个Pod只会部署在指定的节点上,如下:

 2.3 节点亲和性nodeAffinity

这个的功能比上面那个强大,上面的那个方式如果没有找到该标签内容的node,就会一直处在等待(Pending)状态。

节点亲和性概念上类似于 nodeSelector, 它使可以根据节点上的标签来约束 Pod 可以调度到哪些节点上,这种方法比上面的nodeSelector更加灵活,它可以进行一些简单的逻辑组合了,不只是简单的相等匹配。而且如果使用节点亲和性,就算当前没有这个节点,k8s还是可以根据调度调度策略进行调度。

调度策略

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

  • 软亲和性(preferredDuringSchedulingIgnoredDuringExecution)就是如果你没有满足调度要求的节点的话,POD 就会忽略这条规则,继续完成调度过程,说白了就是满足条件最好了,没有的话也无所谓了的策略;
  • 硬亲和性(requiredDuringSchedulingIgnoredDuringExecution)表示当前的条件必须满足,如果没有满足条件的节点的话,就不断重试直到满足条件为止,简单说就是你必须满足我的要求,不然我就不干的策略。

亲和性操作符

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

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

常用的配置示例:

#还是在spce字段中
...
tolerations:
  - key: node-role.kubernetes.io/master
    operator: Exists
    effect: NoSchedule
...

三.污点(Taints)与容忍(tolerations)

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

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

3.1 污点(Taints)

查看污点:

kubectl describe node nodename | grep Taint

其中master节点中会存在默认污点:NoSchedule

污点里的值有三种:

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

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

3.2 污点容忍度(tolerations)

污点容忍度(tolerations)

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

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

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

说白了就是:

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

四.示例

目标:通过在Pod中修改配置文件实现将Pod创建在master节点上。

4.1 nodeName节点选择器

首先查看master节点名称:

此时master节点名称为k8s-control-plan 

还是使用BadPods中的everything-allowed,查看everything-allowed的配置文件,将nodeName注释符去掉

 应用该配置文件

 kubectl apply -f everything-allowed-exec-pod.yaml

 此时成功运行在了master节点上,进入Pod进行验证

4.2 使用污点容忍方式横向到master节点 

首先我们要知道,什么时候调度器才会把Pod分配到存在NoSchedule污点的节点上:

  1. 调度器优先调度的节点不能给该Pod提供它需要的配置(内存,CPU等)
  2. Pod存在可以容忍存在NoSchedule污点的节点
  3. master节点可以为该Pod提供它需要的配置(内存,CPU等)

首先我们查看worker-node的详细信息,使用命令

kubectl describe node k8s-worker

其中下面两个字段分别代表着节点的容量(Capacity)和可以分配(Allocatable)的配置信息,其中cpu的个数为4个,如果Pod中要求cpu超过4个,该node节点无法提供,那么就不会被分配到此node上

同理该node提供最到内存(memory)为7643140Ki,即7.2G 

其中我们可以看到这上面运行了两个默认的Pod,它们占用了多少cpu和内存 

 所以现在我们知道了,要想将Pod创建在master节点上,首先我们要把worker节点占满,然后创建一个可以容忍NoSchedule污点的Pod,那么该Pod就会被创建到master节点上了。

那么我们首先建立一个需要7.1G内存的Pod

1.yaml

apiVersion: v1
kind: Pod
metadata:
  name: memory-demo-3
  namespace: default
spec:
  containers:
  - name: memory-demo-3-ctr
    image: polinux/stress
    resources:
      requests:
        memory: "7.2Gi"
      limits:
        memory: "7.2Gi"
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
kubectl apply -f 1.yaml 

此时我们再次查看worker节点的详细信息,发现内存和CPU已经几乎满了

 那么我们继续新建一个使用nginx镜像Pod,要求使用的内存大于worker节点剩余的容量,且可以容忍污点,同时保证master可以分配给它足够的需要的配置

test.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    command: ["/bin/sleep","3650d"]
    volumeMounts:
    - name: nodename
      mountPath: /host
    resources:
      requests:
        memory: "1Gi"
      limits:
        memory: "1Gi"
  tolerations:
  - key: "node-role.kubernetes.io/master"
    operator: "Exists"
    effect: "NoSchedule"
  volumes:
  - name: nodename
    hostPath:
      path: /
      type: Directory

创建成功结果如下


总结:本文主要介绍了污点及容忍度的相关知识,并结合环境进行了实战练习。

感觉自己写的东西有点太基础了,没什么技术含量,不过我现在收集到的现有的资料也就是这样的,接下来搜集一下容器(Pod)逃逸相关内容和工具,感觉这方面还是比较有搞头的。

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

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

相关文章

[附源码]Nodejs计算机毕业设计基于图书管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

43_SDIO基础知识

目录 SDIO协议简介 SDIO设备分类 SD卡物理结构 SD卡寄存器列表 SDIO总线拓扑 SDIO总线 SDIO总线协议 SDIO命令 命令格式 命令类型 响应 SD卡的操作模式 卡识别模式 数据传输模式 STM32 SDIO功能框图 命令通道 命令状态机 数据通道 数据状态机 数据FIFO SDI…

自定义java注解案例

今天与大家分享java注解的基本使用,如有哪里有问题,望大家指教。 目录 1. 什么是java注解 2. java注解的分类 2.1 JDK基本注解 2.2 JDK元注解 3. 自定义注解 3.1 自定义注解语法 4. 注解示例 4.1 定义注解 4.2 拦截器 4.3 使用注解 4.4 测试 …

Kali Linux渗透测试演示——DNS欺骗

目录 一、DNS欺骗 1.介绍 2.原理 二、环境和工具 1.kali Linux和靶机(这里选择windows 7) 2.ettercap 三、攻击过程 1.首先确认一下Kali和靶机的IP地址以及网关 2.进入ettercap的配置文件 3.打开ettercap,进行主机发现 总结 一、DNS…

MR案例:计算学生成绩

计算学生成绩一、提出任务二、完成任务(一)准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录(二)实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建成绩映射器类5、创建成绩驱动器类6、启动成绩驱动…

adb常用命令(二)

adb:Android下面一个通用的调试工具管理设备或者手机模拟器的状态,进行手机操作:安装软件、卸载软件、系统升级、运行shell命令等adb命令:一、环境配置1,Java--JDK java -version2,SDK adb versionsdk版本管理(SDK与…

Spark-RDD(转换算子、行动算子、序列化、依赖关系、持久化、分区器、文件读取和保存、累加器、广播变量)

文章目录RDDRDD特点核心属性执行原理RDD创建RDD并行度与分区内存数据的分区文件数据的并行度和分区RDD转换算子Value类型mapmapPartitionsmapPartitionsWithIndexflatMapglom(获取分区数组)groupByfilterdistinctcoalesce(缩小/扩大分区)repartition(扩大分区)sortBysample双 V…

人工智能 之 机器学习(Machine Learning)

目录 一:机器学习概述 二:机器学习算法 三:机器学习模型 四:机器学习过程 五:机器学习模型验证 六:sklearn模块 一:机器学习概述 程序化处理和机器学习处理; 主观思维和客观思…

python利用read()、readline()、readlines()读取文件

目录 1.语法和用法 2.实例 1.语法和用法 with open(file,moder,encodingNone) as f:#①读取所有文本data1 f.read()#②读取第一行数据data2 f.readline() #③读取所有文本数据 data3 f.readlines() 说明: with …… as ……:用于命名&#xff0c…

2022年总结:打开新世界,踏上新征程

一、前言 于我而言,2022年是我的幸运年,人生发生转折的关键点。同时,也可能是互联网行业、社会经济状况开始扭转的一年。因此,打算在CSDN开始记录下我的第一篇年总结。当然除了是意义特殊外,也还有现实实在的意义&…

【ROS服务通信】服务端和客户端

本文记录下ROS服务通信的实现,首先明确,ROS中的服务通信主要适用于偶然的,有实时要求的场景。服务通信基于客户-服务的架构,在主节点下,由服务端和客户端组成,服务端负责对请求做出响应,客户端发…

SQL Server2019详细安装教程(含JDBC连接)

文章目录一、安装SQL Server引擎1.1、安装SQL Server1.2、SQL Server选项配置二、SQL Server Management Studio(SSMS,客户端)2.1、安装连接工具2.2、连接SQL Server三、JDBC连接SQLServer提前配置查看SQLSever的启动端口Java代码参考文章一、…

雷神五代笔记本U盘重装系统图文教程

雷神五代笔记本U盘重装系统图文教程分享。有用户使用的雷神五代笔记本开机之后会自动安装很多的软件,导致卡到无法正常使用。这个情况是电脑中了病毒程序导致的,一起来看看如何通过U盘来重新安装系统操作教程吧。 准备工作: 1、U盘一个&#…

蓝桥杯嵌入式串口uart

文章目录前言一、板子串口原理图2.cubeMx配置3.波特率的简单讲解4.代码编写一、发送数据函数二、开启接收中断函数三、中断回调函数四、具体使用总结前言 本篇文章将带大家了解串口的编程,串口在比赛当中和实际工程中都是非常重要的,串口的难度也比较大…

微信小程序自定义tabbar底部菜单

自定义 tabBar 可以让开发者更加灵活地设置 tabBar 样式,以满足更多个性化的场景。 在自定义 tabBar 模式下,为了保证低版本兼容以及区分哪些页面是 tab 页,tabBar 的相关配置项需完整声明,但这些字段不会作用于自定义 tabBar 的渲…

UC伯克利提出AIGC图像编辑新利器InstructPix2Pix,AI模型P图更加精细

原文链接:https://www.techbeat.net/article-info?id4375 作者:seven_ 最近的一些工作向我们展示了AIGC在创造性生成图像、视频等方面的潜力,相信已有很多研究者在沿着这一方向进行拓展式的挖掘和创新。目前已有很多衍生应用出现在了大家眼前…

Java中的类和对象

文章目录1.面向对象和面向过程的含义2.类的定义与使用2.1什么是类2.2类的定义和格式2.3类名的修改方法![在这里插入图片描述](https://img-blog.csdnimg.cn/f126dbd47491402e93bc83bc07f51673.png)3.类和对象3.1类的实例化3.2成员的访问4.this引用4.1为何要this引用4.2什么是th…

java和vue的学生健康管理系统疫情打卡系统

需求:关注学生健康数据以及疫情打卡 系统分两个角色:学生和管理员 演示视频 https://www.bilibili.com/video/BV1iD4y1h74F/?share_sourcecopy_web&vd_sourceed0f04fbb713154db5cc611225d92156 技术:springbootvueelementuipagehelperm…

医疗器械实验室设计基本要求SICOLAB

医疗器械实验室设计基本要求SICOLAB 医疗器械实验室设计、医疗器械实验室装修、医疗器械实验室建设SICOLAB 一、实验室分类 (一)基础实验室 生物学评价检验实验室、电气安全检验实验室、环境试验检验实验室、手术医疗器械检验实验室、医用材料检验实…

【图像去噪】双立方插值和稀疏表示图像去噪【含Matlab源码 2009期】

⛄一、稀疏表示模型简介 图像的稀疏表示能够更好地表示出图像的特征, 其理论依据就是, 有用的图像信号是有序的, 而噪声普遍是杂乱无章的, 因此可以提取出能够表示图像特有奇异性特征的信息, 比如边缘、线段、条纹、端点等, 再用特定的过完备字典中的原子进行线性组合, 重构出…