Kubernetes节点管理与故障排查

📅 2026/7/9 1:02:30 👁️ 阅读次数 📝 编程学习
Kubernetes节点管理与故障排查

Kubernetes节点管理与故障排查

引言

在 Kubernetes 集群中,节点是运行 Pod 的基础设施。节点的健康状态直接影响整个集群的稳定性。本文将深入探讨 Kubernetes 节点管理的核心概念、常见问题排查方法和最佳实践。

一、节点架构概述

1.1 节点组件

┌─────────────────────────────────────────────────────────────┐ │ Kubernetes 节点 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Master Node │ │ │ │ ┌─────────┐ ┌──────────┐ ┌───────────┐ │ │ │ │ │ API │ │ Scheduler│ │ Controller│ │ │ │ │ │ Server │ │ │ │ Manager │ │ │ │ │ └────┬────┘ └────┬─────┘ └─────┬─────┘ │ │ │ └───────┼────────────┼──────────────┼─────────────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Worker Node │ │ │ │ ┌─────────┐ ┌──────────┐ ┌───────────┐ │ │ │ │ │ Kubelet │ │ Kube- │ │ Container │ │ │ │ │ │ │ │ proxy │ │ Runtime │ │ │ │ │ └────┬────┘ └────┬─────┘ └─────┬─────┘ │ │ │ │ │ │ │ │ │ │ │ └────────────┼──────────────┘ │ │ │ │ ▼ │ │ │ │ ┌──────────────┐ │ │ │ │ │ Pods │ │ │ │ │ └──────────────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘

1.2 节点状态

状态描述原因
Ready节点正常运行所有组件健康
NotReady节点不可用Kubelet 未响应或资源不足
Unknown状态未知节点失联
SchedulingDisabled禁止调度手动设置或污点

二、节点管理命令

2.1 查看节点状态

# 查看所有节点 kubectl get nodes # 查看节点详细信息 kubectl describe node <node-name> # 查看节点资源使用 kubectl top nodes # 查看节点标签 kubectl get nodes -L zone,region

2.2 节点标签管理

# 添加节点标签 kubectl label nodes <node-name> zone=us-west-2 # 更新节点标签 kubectl label nodes <node-name> zone=us-west-2 --overwrite # 删除节点标签 kubectl label nodes <node-name> zone- # 查看节点标签 kubectl get nodes --show-labels

2.3 节点污点管理

# 添加污点 kubectl taint nodes <node-name> key=value:NoSchedule # 删除污点 kubectl taint nodes <node-name> key:NoSchedule- # 查看污点 kubectl describe node <node-name> | grep Taints

2.4 节点调度控制

# 禁止节点调度 kubectl cordon <node-name> # 允许节点调度 kubectl uncordon <node-name> # 驱逐节点上的 Pod kubectl drain <node-name> --ignore-daemonsets # 安全驱逐(等待 Pod 优雅终止) kubectl drain <node-name> --grace-period=60

三、节点故障排查

3.1 常见节点问题

问题现象排查方向
节点 NotReadyPod 无法调度到该节点检查 Kubelet、网络、资源
Pod 无法启动Pod 卡在 Pending 状态检查资源请求、节点选择器、污点
节点资源不足Pod 被驱逐检查 CPU、内存、磁盘使用
网络不通Pod 无法通信检查 CNI、防火墙、路由

3.2 Kubelet 问题排查

# 检查 Kubelet 状态 systemctl status kubelet # 查看 Kubelet 日志 journalctl -u kubelet -f # 检查 Kubelet 配置 cat /var/lib/kubelet/config.yaml # 验证 Kubelet 健康状态 curl -s http://localhost:10248/healthz

3.3 节点资源问题排查

# 查看节点资源使用 kubectl top nodes # 查看节点详细资源信息 kubectl describe node <node-name> | grep -A 20 "Allocated Resources" # 检查节点磁盘使用 df -h # 检查节点内存使用 free -h # 检查节点 CPU 使用 top

3.4 网络问题排查

# 检查节点网络连接 ping <node-ip> # 检查 Pod 网络 kubectl exec -it <pod-name> -- ping <target-pod-ip> # 检查 CNI 插件状态 kubectl get pods -n kube-system -l k8s-app=calico # 检查节点路由 ip route

3.5 节点日志分析

# 查看节点系统日志 journalctl -p err -f # 查看 Docker 日志 journalctl -u docker -f # 查看 containerd 日志 journalctl -u containerd -f # 查看节点事件 kubectl get events --field-selector involvedObject.kind=Node

四、节点维护

4.1 节点维护流程

┌─────────────────────────────────────────────────────────────┐ │ 节点维护流程 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 1. 禁止调度 → kubectl cordon <node> │ │ │ │ │ ▼ │ │ 2. 驱逐 Pod → kubectl drain <node> │ │ │ │ │ ▼ │ │ 3. 执行维护操作 │ │ │ │ │ ▼ │ │ 4. 恢复调度 → kubectl uncordon <node> │ │ │ │ │ ▼ │ │ 5. 验证节点状态 │ │ │ └─────────────────────────────────────────────────────────────┘

4.2 节点升级

# 查看当前版本 kubectl version # 升级 Kubelet(以 Ubuntu 为例) apt-get update && apt-get upgrade -y kubelet kubeadm kubectl # 重启 Kubelet systemctl restart kubelet # 验证升级 kubectl get nodes -o wide

4.3 节点替换

# 准备新节点 kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash <hash> # 驱逐旧节点 kubectl drain <old-node> --ignore-daemonsets # 删除旧节点 kubectl delete node <old-node> # 验证新节点 kubectl get nodes

五、节点监控与告警

5.1 节点监控指标

apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: node-exporter spec: selector: matchLabels: app: node-exporter endpoints: - port: metrics interval: 30s

5.2 节点告警规则

groups: - name: node-alerts rules: - alert: NodeNotReady expr: kube_node_status_condition{condition="Ready",status="false"} == 1 for: 5m labels: severity: critical annotations: summary: "Node {{ $labels.node }} is not ready" description: "Node {{ $labels.node }} has been not ready for more than 5 minutes" - alert: NodeHighCPU expr: 100 - (avg by(node) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100) > 90 for: 5m labels: severity: warning annotations: summary: "High CPU usage on node {{ $labels.node }}" description: "CPU usage is above 90% on node {{ $labels.node }}" - alert: NodeHighMemory expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes > 0.9 for: 5m labels: severity: warning annotations: summary: "High memory usage on node {{ $labels.node }}" description: "Memory usage is above 90% on node {{ $labels.node }}"

5.3 节点健康检查

# 节点健康检查脚本 #!/bin/bash echo "=== Node Health Check ===" echo -e "\n1. Node Status:" kubectl get nodes -o wide echo -e "\n2. Node Resources:" kubectl top nodes echo -e "\n3. Node Conditions:" kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{range .status.conditions[*]}{" "}{.type}{": "}{.status}{"\n"}{end}{end}' echo -e "\n4. Recent Events:" kubectl get events --field-selector involvedObject.kind=Node --sort-by='.lastTimestamp' | tail -10

六、节点安全加固

6.1 节点访问控制

apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: node-admin rules: - apiGroups: [""] resources: ["nodes"] verbs: ["get", "list", "watch", "patch", "update"] apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: node-admin-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: node-admin subjects: - kind: User name: admin-user

6.2 节点安全配置

# 禁用 swap swapoff -a sed -i '/swap/d' /etc/fstab # 关闭不必要的服务 systemctl disable --now firewalld systemctl disable --now auditd # 设置内核参数 cat > /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sysctl --system

6.3 节点审计

# 查看节点修改历史 kubectl get events --field-selector involvedObject.kind=Node # 检查节点标签变更 kubectl get nodes -o yaml | grep -E "name:|labels:" # 检查节点污点变更 kubectl describe node <node-name> | grep Taints

七、总结

节点管理是 Kubernetes 运维的核心:

  1. 节点状态监控:定期检查节点状态和资源使用
  2. 故障排查:掌握 Kubelet、网络、资源问题的排查方法
  3. 节点维护:掌握 cordon/drain/uncordon 流程
  4. 节点监控:配置监控指标和告警规则
  5. 节点安全:实施访问控制和安全加固

通过有效的节点管理,可以保障集群的稳定性和可靠性。

下一步行动

  1. 建立节点监控和告警体系
  2. 制定节点维护流程
  3. 实施节点安全加固
  4. 定期进行节点健康检查
  5. 建立节点故障处理手册