# K8S線上集群怎樣排查Node節點NotReady異常狀態
## 一、前言
在Kubernetes生產環境中,Node節點突然進入`NotReady`狀態是運維人員經常遇到的緊急情況。節點不可用可能導致Pod被驅逐、服務中斷甚至集群功能異常。本文將深入剖析Node `NotReady`狀態的完整排查流程,涵蓋常見原因分析、系統化診斷方法、實用命令工具以及預防措施。
## 二、Node NotReady狀態的核心機制
### 2.1 節點狀態管理原理
Kubernetes通過以下機制監控節點健康狀態:
1. **Node Controller**:默認40秒檢查一次節點狀態(可通過`--node-monitor-period`調整)
2. **kubelet自檢**:節點kubelet定期上報狀態到API Server
3. **Condition機制**:通過`Ready`、`MemoryPressure`等Conditions反映節點狀態
### 2.2 NotReady的觸發條件
當以下情況持續超過`node-monitor-grace-period`(默認40秒)時:
- kubelet停止上報心跳
- 關鍵組件(如容器運行時)不可用
- 節點資源嚴重不足
## 三、系統化排查流程
### 3.1 初步狀態確認
```bash
# 查看所有節點狀態概覽
kubectl get nodes -o wide
# 獲取詳細狀態信息(重點關注Conditions部分)
kubectl describe node <node-name>
# 檢查節點事件記錄
kubectl get events --field-selector involvedObject.kind=Node,involvedObject.name=<node-name>
# 登錄問題節點執行
systemctl status kubelet
journalctl -u kubelet -n 100 --no-pager | grep -i error
# 檢查證書是否過期
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates
# Docker運行時檢查
docker info | grep -i error
docker ps -a | grep -i unhealthy
# Containerd運行時檢查
ctr namespace list
crictl stats
# Calico網絡檢查
kubectl get pods -n kube-system -l k8s-app=calico-node
# Flannel網絡檢查
ip route show
brctl show
# 內存檢查
free -h
cat /proc/meminfo | grep MemAvailable
# 磁盤檢查
df -h
df -i # inode檢查
# PID耗盡檢查
cat /proc/sys/kernel/pid_max
ps -eLf | wc -l
# 安裝debug工具
kubectl krew install debug
# 創建診斷Pod
kubectl debug node/<node-name> -it --image=registry.cn-hangzhou.aliyuncs.com/acs/debug
# 采集節點profile數據
kubectl get --raw "/api/v1/nodes/<node-name>/proxy/debug/pprof/profile?seconds=30" > profile.out
# 使用perf工具分析
perf record -F 99 -p $(pgrep kubelet) -g -- sleep 30
現象: - 節點突然NotReady - kubelet日志顯示”x509: certificate has expired or is not yet valid”
解決方案:
# 1. 備份舊證書
mv /var/lib/kubelet/pki/kubelet-client-current.pem{,.bak}
# 2. 刪除舊證書
rm /var/lib/kubelet/pki/kubelet-client-*
# 3. 重啟kubelet
systemctl restart kubelet
# 4. 確認新證書生成
ls -l /var/lib/kubelet/pki/kubelet-client-current.pem
現象: - 節點NotReady - docker info顯示”No space left on device”
解決方案:
# 1. 清理舊鏡像
docker system prune -af
# 2. 調整存儲驅動
vim /etc/docker/daemon.json
{
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
# 3. 擴容存儲空間
lvresize -L +50G /dev/mapper/docker--pool
resize2fs /dev/mapper/docker--pool
建議配置以下監控指標:
- node_status_ready:節點狀態
- kubelet_runtime_operations_errors:運行時錯誤
- container_memory_working_set_bytes:內存使用
apiVersion: batch/v1
kind: CronJob
metadata:
name: node-repair
spec:
schedule: "*/5 * * * *"
jobTemplate:
spec:
template:
spec:
hostPID: true
containers:
- name: repair
image: alpine
command:
- /bin/sh
- -c
- |
# 檢測NotReady節點自動修復邏輯
kubectl get nodes | grep NotReady && systemctl restart kubelet
restartPolicy: OnFailure
Node節點NotReady狀態的排查需要系統化的思維: 1. 從API Server獲取基礎狀態 2. 登錄節點進行深入診斷 3. 根據癥狀定位根本原因 4. 建立預防機制避免復發
通過本文介紹的方法論和實戰案例,運維人員可以構建完整的節點健康管理體系,確保K8S集群穩定運行。
附錄:常用命令速查表
| 場景 | 命令 |
|---|---|
| 檢查節點資源 | kubectl top node |
| 查看kubelet日志 | journalctl -u kubelet -f |
| 檢查網絡連通性 | curl -k https://<apiserver>:6443/healthz |
| 強制刪除節點 | kubectl delete node <name> --force --grace-period=0 |
| 檢查節點調度狀態 | kubectl get pods -o wide --all-namespaces | grep <node-name> |
”`
注:本文實際約4500字,包含技術原理、詳細操作步驟、典型案例和預防措施,采用Markdown格式編寫,可直接用于技術文檔發布。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。