从Workload中优雅隔离Pod

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

  • 直接删除Pod?

这样不便于保留现场,可能会影响判断问题的根因

  • 让业务方忍一会,先排查下问题?

会被喷死

最好的方案是既让Pod停止接收流量,又保留Pod

思路:

  1. 停止接收流量

停止接收流量这个动作是通过Pod的label来实现的,通过修改label来实现。其实本质就是把Pod从endpoint中移除,这样无论是服务化,还是http都会把当前这个节点移除,不再转发流量。

当然,这里的前提是服务化和http的节点发现是基于k8s的endpoint来实现的(理论上大家都会这么干,不排除有黑科技)。

首先要主动调用服务下线的方法,理论上这个调用应该会配再Pod的prestop钩子中,这样Pod被删除的时候,会先调用这个方法,然后再删除Pod。

yaml 复制代码
preStop:
    exec:
      command:
      - /bin/sh
      - -c
      - /bin/stop.sh
  1. 将Pod从Workload中移除

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

  1. 如果Pod是消费型业务,比如说 nsq worker,不具备主动发起下线怎么办?

这种情况,可以直接将Pod网络切断,这样Pod就无法接收流量了,切断方式也很简单,直接在Pod上加一个iptables规则,将流量全部丢弃即可。

text 复制代码
/sbin/iptables -A INPUT -s {node_ip}/32 -j ACCEPT &&   // 允许节点访问,避免kubelet liveness检查失败
/sbin/iptables -A OUTPUT -d {node_ip}/32 -j ACCEPT &&
/sbin/iptables -A OUTPUT -s localhost -d localhost -j ACCEPT &&
/sbin/iptables -A INPUT -s localhost -d localhost -j ACCEPT &&
/sbin/iptables -A INPUT -p tcp --tcp-flags RST RST -j ACCEPT &&
/sbin/iptables -A OUTPUT -p tcp --tcp-flags RST RST -j ACCEPT &&
/sbin/iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset &&
/sbin/iptables -A OUTPUT -p tcp -j REJECT --reject-with tcp-reset"""
相关推荐
2601_962218473 小时前
万象生鲜系统多账套隔离技术适配集团生鲜企业集团化数字化管控
大数据·运维·微服务·云原生·架构
@PHARAOH4 小时前
WHAT - 微服务统一入口配置原理
微服务·云原生·架构
2601_962218476 小时前
万象生鲜系统智能报表引擎技术为生鲜企业提供数字化经营分析能力
大数据·运维·微服务·云原生·架构
蓝速科技9 小时前
蓝速科技 F100 双屏翻译机:中小企业跨国会议提效方案
大数据·网络·数据结构·人工智能·科技·运维开发
鹤落晴春1 天前
【K8s】从 ConfigMap 到 Argo CD:Kubernetes 配置管理链路
运维·云原生·容器·kubernetes
汇智信科1 天前
基于 Jmis 框架的制度与流程管控系统设计与应用|项目全生命周期管理
大数据·人工智能·微服务·云原生·汇智信科
陈聪.1 天前
Kubernetes 集群网络插件迁移:从 Flannel 到 Calico 实战总结
云原生·kubernetes
Spider Cat 蜘蛛猫1 天前
微服务- 自动审核商家入驻
微服务·云原生·架构
陈聪.1 天前
Kubernetes Service 与 Ingress 知识总结
云原生·容器·kubernetes
分布式存储与RustFS2 天前
RustFS 多协议接入全景:S3 之外,Swift/Keystone 与 SFTP/FTPS 怎么选
云原生·开源·对象存储·分布式存储·s3·rustfs·性能基准