从Workload中优雅隔离Pod

盛世宏图  金牌会员 | 2024-9-5 19:24:43 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 977|帖子 977|积分 2931

线上集群中,业务跑着跑着,突然发现有个Pod上出现大量错误日志,其他的Pod是正常的,该如何处置惩罚呢?

  • 直接删除Pod?
这样未便于生存现场,大概会影响判断问题的根因

  • 让业务方忍一会,先排查下问题?
会被喷死
最好的方案是既让Pod停止吸收流量,又生存Pod
思绪:

  • 停止吸收流量
停止吸收流量这个动作是通过Pod的label来实现的,通过修改label来实现。着实本质就是把Pod从endpoint中移除,这样无论是服务化,还是http都会把当前这个节点移除,不再转发流量。
当然,这里的条件是服务化和http的节点发现是基于k8s的endpoint来实现的(理论上大家都会这么干,不清除有黑科技)。
首先要主动调用服务下线的方法,理论上这个调用应该会配再Pod的prestop钩子中,这样Pod被删除的时候,会先调用这个方法,然后再删除Pod。
  1. preStop:
  2.     exec:
  3.       command:
  4.       - /bin/sh
  5.       - -c
  6.       - /bin/stop.sh
复制代码

  • 将Pod从Workload中移除
调用下线完毕之后,再修改Pod的标签,这个标签的修改可以让Pod离开Workload的控制,变成孤儿Pod,注意修改Pod标签也要让service的selector选择不到这个Pod,这样Pod也就从endpoint中移除,服务发现也就感知不到这个节点了。

  • 如果Pod是消耗型业务,比如说 nsq worker,不具备主动发起下线怎么办?
这种情况,可以直接将Pod网络切断,这样Pod就无法吸收流量了,切断方式也很简单,直接在Pod上加一个iptables规则,将流量全部丢弃即可。
  1. /sbin/iptables -A INPUT -s {node_ip}/32 -j ACCEPT &&   // 允许节点访问,避免kubelet liveness检查失败
  2. /sbin/iptables -A OUTPUT -d {node_ip}/32 -j ACCEPT &&
  3. /sbin/iptables -A OUTPUT -s localhost -d localhost -j ACCEPT &&
  4. /sbin/iptables -A INPUT -s localhost -d localhost -j ACCEPT &&
  5. /sbin/iptables -A INPUT -p tcp --tcp-flags RST RST -j ACCEPT &&
  6. /sbin/iptables -A OUTPUT -p tcp --tcp-flags RST RST -j ACCEPT &&
  7. /sbin/iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset &&
  8. /sbin/iptables -A OUTPUT -p tcp -j REJECT --reject-with tcp-reset"""
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

盛世宏图

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表