解决DaemonSet没法调度到master节点的问题

news/2024/11/18 0:21:50/

最近在kubernetes部署一个springcloud微服务项目,到了最后一步部署边缘路由:使用nginx-ingress和traefik都可以,必须使用DaemonSet部署,但是发现三个节点,却总共只有两个pod。

换句话说, DaemonSet没法调度到master节点上。

 要理解这种情况,就必须理解kubernets中pod的污点和容忍度的问题

什么是污点(taint)和容忍度(toleration)

“污点”是Kubernetes节点的一个属性,字段名为taint,它的含义说的直白点,就是表明这个节点“不干净”

和“污点”相对应的,就是Pod的“容忍度”,顾名思义,就是Pod能否“容忍”污点。

      打个形象的比喻:集群里的节点各式各样,有的节点“纯洁无瑕”,没有“污点”;而有的节点因为某种原因粘上了“泥巴”,也就有了“污点”。Pod也脾气各异,有的“洁癖”很严重,不能容忍“污点”,只能挑选“干净”的节点;而有的Pod则比较“大大咧咧”,要求不那么高,可以适当地容忍一些小“污点”。

这么看来,“污点”和“容忍度”倒是有点像是一个“相亲”的过程。Pod就是一个挑剔的“甲方”,而“乙方”就是集群里的各个节点,Pod会根据自己对“污点”的“容忍程度”来选择合适的目标,比如要求“不抽烟不喝酒”,但可以“无车无房”,最终决定在哪个节点上“落户”。

Kubernetes在创建集群的时候会自动给节点Node加上一些“污点”,方便Pod的调度和部署。

如下面Master和Node节点的状态

[root@k8s-node2 vhost]# kubectl get nodes
NAME         STATUS   ROLES    AGE      VERSION
k8s-master   Ready    master   3y292d   v1.17.2
k8s-node1    Ready    <none>   4d5h     v1.17.2
k8s-node2    Ready    <none>   3y292d   v1.17.2
[root@k8s-node2 vhost]# kubectl describe node k8s-master|grep Taints
Taints:             node-role.kubernetes.io/master:NoSchedule
[root@k8s-node2 vhost]# kubectl describe node k8s-node1|grep Taints
Taints:             <none>
[root@k8s-node2 vhost]# kubectl describe node k8s-node2|grep Taints
Taints:             <none>
 

 可以看到,Master节点默认有一个 taint污点,名字是 node-role.kubernetes.io/master,它的效果是 NoSchedule,也就是说这个污点会拒绝Pod调度到本节点上运行,而node节点的 taint 字段则是空的。

这正是Master和node在Pod调度策略上的区别所在,通常来说Pod都不能容忍任何“污点”,所以加上了 taint 属性的Master节点被认为是有污点,pod默认不会调度到该节点

这个也很好理解: 由于master节点具有一定的特殊性,出于安全及角色的原因,一般不建议在Master节点部署应用的Pod实例, 因为Master 节点主要运行集群管理组件和控制面等关键组件。

那么怎么解决这个问题,让pod能调度到master节点: 引入toleration,允许容忍这个污点

具体来说,就是在pod定义yml文件中跟container容器的同级字段加入下面的配置:

tolerations:

- key: node-role.kubernetes.io/master

  effect: NoSchedule

  operator: Exists

它的定义位置或者可以说在这里:daemonSet定义的spec.template.spec下

解释一下它们的含义:

  1. key: node-role.kubernetes.io/master key表示tolerations能容忍的节点标记,这里就是指能容忍的节点类型是master节点

  2. effect: NoSchedule effect表示taint污点标记产生的效果,NoSchedule是指告诉调度器,不允许调度到带有这个 taint 污点标识的节点上,除非 Pod 显式容忍(tolerate)这个 taint,

  3. operator: Exists 表示只容忍key指定类型的节点。在这个例子中,Pod 只要运行在带有 node-role.kubernetes.io/master taint 的节点上,就能够被容忍。

 配置在yml文件中的具体情形:

 定义了容忍污点以后,pod果然可以调度到master节点了:

 


http://www.ppmy.cn/news/1236965.html

相关文章

vue2.0+elementui集成file-loader之后图标失效问题

背景 跑vue2elementUI项目时&#xff0c;由于前端这边需要在本地存放xlsx模板文件&#xff0c;供用户下载模板文件&#xff0c;所以需要在webpack构建的时候增加file-loader进行解析xlsx文件打包。 vue版本2.x element-ui 版本 2.13.x 注意 npm i -D file-loader版本号给vue项…

Scala---WordCount

一、创建Maven项目导入pom.xml文件 安装Maven仓库管理工具&#xff0c;版本要求是3.2版本以上。新建Maven项目&#xff0c;配置pom.xml。导入必要的包。 二、Spark-Scala版本的WordCount 1.val conf new SparkConf() 2.conf.setMaster("local") 3.conf.setAppNam…

C练习题_2

一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中选出一个正确的答案&#xff0c;并将所选项前的字母填写在答题纸的相应位置上。&#xff09; 以下叙述中错误的是&#xff08;) A.对于double类型数组&#xff0c;不可以直接用数组名对数组进行整…

配置华为云镜像加速器

登录华为云官网&#xff0c;点击控制台 在服务列表里面寻找swr服务 点击镜像中心&#xff0c;点击镜像加速器 {"registry-mirrors": [ "https://301dc05233c6419b810bdb22135af9eb.mirror.swr.myhuaweicloud.com" ]}配置镜像加速器 vim /etc/docker…

浅谈C#在unity应用中的工厂模式

文章目录 前言简单工厂模式工厂方法模式抽象工厂模式Unity实战 前言 工厂模式是一种创建型设计模式&#xff0c;它提供了一种将对象的实例化过程封装起来的方法&#xff0c;使得客户端代码不必直接依赖于具体类。这有助于降低代码的耦合度&#xff0c;提高代码的可维护性和可扩…

常见树种(贵州省):013桉树、米槠、栲类

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、桉树 …

打包和部署Java应用程序:Maven和Shell脚本的实用方法

在软件开发领域&#xff0c;高效打包和分发Java应用程序是至关重要的。本博客将探讨一种使用Maven插件和Shell脚本的简化方法&#xff0c;以创建一个分发包&#xff0c;其中包含了您项目的可执行JAR文件、配置文件和一个方便的启动脚本。 步骤1&#xff1a;Maven插件配置 旅程…

自己动手打包构建编译cri-dockerd

1.背景 本机是 armv7l架构cpu&#xff0c;发现官方文档中竟然没有&#xff0c;因此需要自己编译下&#xff1b; [rootcontainer0 ~]# uname -a Linux container0 5.4.206-v7l.1.el7 #1 SMP Mon Jul 25 14:13:29 UTC 2022 armv7l armv7l armv7l GNU/Linux2.打包/构建/编译 gi…