当前位置: 首页 > news >正文

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

最近在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节点了:

 

相关文章:

  • 短视频获客系统成功分享,与其开发流程与涉及到的技术
  • Ubuntu18.04安装A-Loam保姆级教程
  • 4-20mA高精度采集方案
  • 【nlp】3.5 Transformer论文复现:3.解码器部分(解码器层)和4.输出部分(线性层、softmax层)
  • Re54:读论文 How Context Affects Language Models‘ Factual Predictions
  • CSS:浏览器设置placeholder样式 / 微信小程序设置placeholder样式
  • Feign接口请求返回异常 no suitable HttpMessageConvert found for response type
  • 网络安全(黑客技术)—0基础小白自学
  • 系列六、Spring整合单元测试
  • Pycharm创建项目新环境,安装Pytorch
  • java springboot测试类虚拟MVC环境 匹配返回值与预期内容是否相同 (JSON数据格式) 版
  • HCIA题目解析(1)
  • element-vue实现网页锁屏功能
  • webshell之Laravel和yii
  • 2023.11.25更新关于mac开发APP(flutter)的笔记与整理(实机开发一)
  • 【5+】跨webview多页面 触发事件(二)
  • 2019年如何成为全栈工程师?
  • ES6--对象的扩展
  • in typeof instanceof ===这些运算符有什么作用
  • Magento 1.x 中文订单打印乱码
  • Python连接Oracle
  • TypeScript实现数据结构(一)栈,队列,链表
  • uni-app项目数字滚动
  • VuePress 静态网站生成
  • 对超线程几个不同角度的解释
  • 学习ES6 变量的解构赋值
  • 由插件封装引出的一丢丢思考
  • 原生js练习题---第五课
  • 带你开发类似Pokemon Go的AR游戏
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #QT(智能家居界面-界面切换)
  • (003)SlickEdit Unity的补全
  • (1)常见O(n^2)排序算法解析
  • (2)STL算法之元素计数
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .Net 8.0 新的变化
  • .NET CLR Hosting 简介
  • .NET Core 项目指定SDK版本
  • .net 发送邮件
  • .NET正则基础之——正则委托
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [Android]Android P(9) WIFI学习笔记 - 扫描 (1)
  • [BZOJ1178][Apio2009]CONVENTION会议中心
  • [bzoj4240] 有趣的家庭菜园
  • [C puzzle book] types
  • [CDOJ 838]母仪天下 【线段树手速练习 15分钟内敲完算合格】
  • [codeforces]Checkpoints
  • [ERROR] 不再支持目标选项 5。请使用 7 或更高版本
  • [ffmpeg] av_opt_set 解析