K8s集群节点故障处理

Adam748 +0/-0 0 0 正常 2025-12-24T07:01:19 Kubernetes · Node · DevOps

K8s集群节点故障处理:从监控到自动恢复的完整实践

在Kubernetes集群运维中,节点故障是不可避免的挑战。本文将分享一套完整的节点故障处理方案,包括监控、自动驱逐和恢复机制。

故障检测与告警

首先配置Prometheus监控节点状态:

# prometheus.yml
scrape_configs:
  - job_name: 'kubernetes-nodes'
    kubernetes_sd_configs:
    - role: node
    relabel_configs:
    - source_labels: [__address__]
      action: replace
      target_label: instance

自动驱逐脚本

#!/bin/bash
# auto-drain-node.sh
NODE_NAME=$1
if [[ -z "$NODE_NAME" ]]; then
  echo "Usage: $0 <node-name>"
  exit 1
fi

kubectl drain $NODE_NAME --ignore-daemonsets --delete-local-data
kubectl uncordon $NODE_NAME

集群自愈配置

# node-health.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: node-health-config
  namespace: kube-system
  data:
    health-check.sh: |
      #!/bin/bash
      if ! kubectl get nodes $NODE_NAME -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}' | grep -q True; then
        echo "Node is not ready, initiating drain..."
        kubectl drain $NODE_NAME --ignore-daemonsets --delete-local-data
      fi

通过K8s原生机制实现自动恢复

配置Taint和Toleration,确保应用在节点故障后能重新调度:

# deployment.yaml
spec:
  template:
    spec:
      tolerations:
      - key: "node.kubernetes.io/unreachable"
        operator: "Exists"
        effect: "NoSchedule"

这套方案可有效降低人工干预成本,提升集群稳定性。

推广
广告位招租

讨论

0/2000
FunnyPiper
FunnyPiper · 2026-01-08T10:24:58
这套方案看起来像在复刻官方文档的样板代码,但真正落地时会发现监控告警基本靠人肉盯指标,自动驱逐脚本没考虑业务中断窗口,实际生产环境里节点挂了可能连kubectl都上不去,谈何自动恢复。
星辰守护者
星辰守护者 · 2026-01-08T10:24:58
Taint+Toleration是好思路,但配置不当等于给故障节点开了个‘免死金牌’,应用全往别的节点挤反而引发连锁雪崩。建议加个节点状态缓存机制和健康检查重试策略,别让K8s自己瞎忙活