随笔 - 318  文章 - 0  评论 - 5  阅读 - 4588

K8s集群节点宕机排查

Kubernetes集群节点宕机排查指南:生产环境常见原因与解决方案

在生产环境中,Kubernetes集群节点的宕机直接影响业务稳定性。本文将结合实际案例,总结六大类常见故障原因及应对策略。


一、内存资源耗尽(最频繁问题)

现象:节点突然失联,kubectl get node显示NotReady
常见原因

  1. OOM杀进程

    • 未合理设置Pod内存限制,导致进程吃光节点内存
    • 禁用Swap时更易触发(尤其内存密集型应用)
      案例:某Java应用未设memory limit,堆内存泄漏导致节点崩溃
  2. Cgroup内存泄漏(经典内核Bug)

    • Linux 3.x内核存在cgroup无法释放内存的缺陷
    • 表现为/sys/fs/cgroup/memory/memory.usage_in_bytes持续增长
      解决方案:升级内核至4.4+版本
  3. Slab缓存无法回收

    • 文件系统缓存(如ext4的inode_cache)占用过高
    • 通过echo 2 > /proc/sys/vm/drop_caches可临时释放

预防措施

  • 所有Pod必须设置requests/limits(建议预留20%内存缓冲)
  • 部署Node Exporter监控node_memory_MemAvailable指标
  • 生产环境建议保留适量Swap(避免完全禁用)

二、操作系统与内核层故障

典型场景

  1. 内核死锁/Panic

    • 硬件驱动不兼容(常见于GPU节点)
    • 内核模块内存泄漏(如iptables规则过多)
  2. 关键系统服务崩溃

    • systemd、dbus等服务异常导致节点不可用
    • 日志中出现kernel: BUG: soft lockup等错误

应对方案

  • 选择LTS内核版本(推荐5.4+),定期打安全补丁
  • 使用kured实现自动节点重启维护

三、硬件故障(物理机常见问题)

硬件故障类型

故障类型 检测手段 应急方案
内存故障 memtester工具 替换内存条
磁盘坏道 smartctl 迁移Pod后下线节点
网卡异常 ethtool 绑定多网卡
CPU过热 IPMI日志 检查散热系统

云环境特有问题

  • 云厂商底层维护导致VM静默宕机
  • 应对:启用kubelet的--node-status-update-frequency=4s(加快状态上报)

四、Kubernetes核心组件故障

高危组件清单

  1. etcd集群异常

    • 表现:API Server返回504错误
    • 检测:etcdctl endpoint status查看leader状态
    • 预防:
      • 使用SSD磁盘,保持奇数节点
      • 定期执行etcdctl snapshot save备份
  2. 控制平面瘫痪

    • 场景:API Server证书过期、调度器死锁
    • 高可用方案:
      # Kubeadm高可用配置示例  
      apiVersion: kubeadm.k8s.io/v1beta3  
      kind: ClusterConfiguration  
      apiServer:  
        extraArgs:  
          advertise-address: 192.168.0.100  
        certSANs:  
        - "k8s-api.example.com"  
      controlPlaneEndpoint: "k8s-api.example.com:6443"  
      

五、网络系统故障

经典网络问题

  1. CNI插件异常

    • Calico/BGP路由泄露导致节点失联
    • 排查:calicoctl node status检查对等连接
  2. DNS解析中断

    • CoreDNS Pod被驱逐导致服务发现失效
    • 快速检测:dig +short kubernetes.default.svc.cluster.local
  3. 网络策略冲突

    • 错误的NetworkPolicy阻塞kubelet通信
      案例:某策略误禁用了节点IP段导致心跳丢失

关键监控指标

  • kubelet_network_plugin_errors_total
  • coredns_dns_request_count_total

六、人为操作与配置错误

高频失误操作

  1. 误删关键资源

    • 防护方案:
      # 保护系统命名空间  
      kubectl annotate ns kube-system \  
        kubernetes.io/metadata.name=kube-system \  
        --overwrite  
      
  2. 错误配置驱逐策略

    • 不当的PodDisruptionBudget导致节点排水卡死
  3. 证书管理疏忽

    • kubelet证书过期导致节点被标记NotReady
    • 自动续期配置:
      # kubelet-config.yaml  
      apiVersion: kubelet.config.k8s.io/v1beta1  
      kind: KubeletConfiguration  
      rotateCertificates: true  
      serverTLSBootstrap: true  
      

运维黄金法则

  1. 监控三板斧

    • 基础层:Node Exporter+Prometheus(内存/磁盘/进程)
    • K8S层:kube-state-metrics(节点/Pod状态)
    • 业务层:Blackbox Exporter(服务可达性检测)
  2. 灾备措施

    • 每个集群至少跨3个可用区
    • 定期演练节点驱逐:kubectl drain <node> --ignore-daemonsets
  3. 自动化修复

    • 通过Cluster API实现节点自愈
    • 配置Alertmanager自动触发修复脚本

生产经验:每次K8s版本升级前,使用kube-no-trouble工具检测API弃用情况,避免兼容性问题导致节点异常。

通过以上多维度的防护策略,可显著降低节点宕机风险。建议每季度进行一次全链路的故障演练,模拟节点故障场景,验证集群的容灾能力。

posted on   Leo-Yide  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示