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,region2.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-labels2.3 节点污点管理
# 添加污点 kubectl taint nodes <node-name> key=value:NoSchedule # 删除污点 kubectl taint nodes <node-name> key:NoSchedule- # 查看污点 kubectl describe node <node-name> | grep Taints2.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 常见节点问题
| 问题 | 现象 | 排查方向 |
|---|---|---|
| 节点 NotReady | Pod 无法调度到该节点 | 检查 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/healthz3.3 节点资源问题排查
# 查看节点资源使用 kubectl top nodes # 查看节点详细资源信息 kubectl describe node <node-name> | grep -A 20 "Allocated Resources" # 检查节点磁盘使用 df -h # 检查节点内存使用 free -h # 检查节点 CPU 使用 top3.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 route3.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 wide4.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: 30s5.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-user6.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 --system6.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 运维的核心:
- 节点状态监控:定期检查节点状态和资源使用
- 故障排查:掌握 Kubelet、网络、资源问题的排查方法
- 节点维护:掌握 cordon/drain/uncordon 流程
- 节点监控:配置监控指标和告警规则
- 节点安全:实施访问控制和安全加固
通过有效的节点管理,可以保障集群的稳定性和可靠性。
下一步行动:
- 建立节点监控和告警体系
- 制定节点维护流程
- 实施节点安全加固
- 定期进行节点健康检查
- 建立节点故障处理手册
