前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >k8s运维:基于taint污浊节点实现pod节点迁移

k8s运维:基于taint污浊节点实现pod节点迁移

作者头像
机械视角
发布2020-12-30 15:59:09
8350
发布2020-12-30 15:59:09
举报
文章被收录于专栏:TensorbytesTensorbytes

背景

由于业务需求要做节点迁移,旧节点要被废弃,正好可以试试 k8s 的 taint 污浊节点操作。

taint

基本用法:

代码语言:javascript
复制
$ kubectl taint --help
# 添加/更新一个节点的污浊标识效果
kubectl taint nodes <节点名称> <键>=<值>:<效果> 
# 删除一个节点的污浊标识效果,在后面加一个小横杆 -
kubectl taint nodes <节点名称> <键>:<效果>-
# 删除一个节点这个key的所有效果
kubectl taint nodes <键>-
## 如果要改动所用节点可以用 --all=true

taint 分为三部分,键、值和效果(key=value:effect),其中健和值构成关联的键值对用于和pod匹配的,effect 用来表示 node 的效果,主要包括:

  • PerferNoSchedule,会让k8s尽量不去调度这个节点(不保证,比如如果其他节点资源满了的情况)
  • NoSchedule,表示这个节点不可调度,也就是新pod不会再被分配到这个节点上,旧节点依然能运行
  • NoExecute,表示这个节点不能运行 pod ,不仅不可调度新的pod,旧的正在运行的pod也会被移除

effect 虽然会影响 pod 调度的不同行为,但同时也受到 pod 的 tolerations 设置的影响,比如我们可以通过设置 pod 的 tolerations 让他在 NoExecute 节点继续运行或者 NoSchedule 进行调度,这里就会用到键和值,这个后面再细将。

上面三种 effect 的核心区别: 首先是 PerferNoScheduleNoSchedule, 他们之间的区别就是,即使不设置 pod 的容忍度,PerferNoSchedule的节点在特定的条件下也可能会被调度,是一种不严格的限制策略,而 NoSchedule 只有在 pod 设置了对应的tolerations的情况下才能被调度。然后是 NoScheduleNoExecute ,一个是不让调度,一个不让响应节点调度同时 kill 掉不匹配的 pod。

tolerations

pod 里面主要包括五部分,keyvalueoperatoreffecttolerationSeconds

  • keyvalue是键值对,会和 node 节点的keyvalue匹配,如果operatorExistes的时候只会匹配keyvalue可以不用,如果key为空表示匹配所有的taintkey
  • operator 包含两个值 EqualExists,默认是Equal,即键和值都要完全匹配才能容忍污浊。
  • tolerationSeconds 表示可以容忍的时间,这个设置只对NoExecute这种 effec 生效,默认是永久容忍。
  • effect 和 node 的 taint 一样

注意的是: DaemonSet 创建的pod 的 tolerations 不会指定 tolerationSeconds,这样保证了其面对node.kubernetes.io/unreachablenode.kubernetes.io/not-ready的时候永远不会被驱逐

实战:节点pod迁移

集群原来两个 node 节点 10.213.20.18310.213.20.215 由于资源不足,需要纵向扩容,需要将里面的 pod 移除到其他节点,实施步骤:

  • 将两个节点设置为不可调度NoSchedule,观测资源运行情况
  • 逐个节点进行驱逐

设置NoSchedule

代码语言:javascript
复制
# 这里10.213.20.183 是 node 名字
kubectl taint nodes 10.213.20.183 node-tranfer:NoSchedule
kubectl taint nodes 10.213.20.215 node-tranfer:NoSchedule

查看一下:

代码语言:javascript
复制
$ kubectl get nodes 10.213.20.215 -ojson | jq '.spec.taints'
[
  {
    "effect": "NoSchedule",
    "key": "node-tranfer"
  }
]

okay, 设置成功

观测在 pod 上运行的节点:

代码语言:javascript
复制
$ kubectl get pods -A -owide | grep 10.213.20.215
...

对pod进行扩容测试:

代码语言:javascript
复制
$ kubectl scale --replicas=5 deployment/<名称>

将pod从节点驱逐

通过设置NoExecute驱逐 pod:

代码语言:javascript
复制
$ kubectl taint nodes 10.213.20.215 node-expel:NoExecute
node/10.213.20.215 tainted

查看:

代码语言:javascript
复制
$ kubectl get nodes 10.213.20.215 -ojson | jq '.spec.taints'
[
  {
    "effect": "NoExecute",
    "key": "node-expel"
  },
  {
    "effect": "NoSchedule",
    "key": "node-tranfer"
  }
]

查看pod 状况:

代码语言:javascript
复制
kubectl get po -A -owide --watch
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • taint
  • tolerations
  • 实战:节点pod迁移
    • 设置NoSchedule
    • 将pod从节点驱逐
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档