16.2.6 核心组件健康检查与故障处理
核心组件包括 apiserver、etcd、controller-manager、scheduler、kubelet、kube-proxy、CoreDNS 以及容器运行时。健康检查与故障处理遵循“先控制面、后节点面、再业务面”的顺序,结合日志、事件、指标与探针形成闭环。
0. 原理草图(控制面与节点面健康链路)
1. 健康检查方法与关键指标(含命令示例)
- kube-apiserver
- 健康端点:
/healthz、/readyz - 关键指标:请求延迟、QPS、5xx 比例、认证鉴权失败次数
-
示例命令:
```bash
# 1) 通过 apiserver 进行健康检查(readyz 更严格)
kubectl get --raw='/readyz?verbose'2) 获取 apiserver 组件状态#
kubectl get componentstatuses
`` - 预期效果:readyz输出ok或每个子检查均为ok;组件状态为Healthy` -
etcd
- 健康检查:
etcdctl endpoint health - 关键指标:leader 变化、wal fsync 延迟、db size、延迟飙升
-
示例命令(含安装与证书):
```bash
# 安装 etcdctl(以二进制为例)
ETCD_VER=v3.5.10
wget -q https://github.com/etcd-io/etcd/releases/download/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz
tar -xzf etcd-${ETCD_VER}-linux-amd64.tar.gz
sudo mv etcd-${ETCD_VER}-linux-amd64/etcdctl /usr/local/bin/指定证书进行健康检查(kubeadm 默认路径)#
export ETCDCTL_API=3
etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
endpoint health
`` - 预期效果:输出is healthy,无timeout` -
controller-manager / scheduler
- 健康端点:
/healthz - 关键指标:reconcile 速率、调度失败/延迟
- 示例命令:
bash # 通过本地端口或 apiserver 代理查看 kubectl -n kube-system get pods -o wide | grep kube-controller-manager kubectl -n kube-system get pods -o wide | grep kube-scheduler -
预期效果:Pod 状态为
Running,重启次数不异常 -
kubelet
- 健康端点:
https://<node>:10250/healthz - 关键指标:节点 NotReady、Pod 启动失败率、镜像拉取失败 示例命令:
-
kube-proxy / CoreDNS
- 关键指标:服务访问异常、DNS 解析失败率、iptables/ipvs 规则异常
-
示例命令:
```bash
# CoreDNS 日志
kubectl -n kube-system logs -l k8s-app=kube-dns --tail=50kube-proxy 模式确认#
kubectl -n kube-system get cm kube-proxy -o yaml | grep mode
```
- 预期效果:DNS 解析正常、kube-proxy 模式符合预期(iptables/ipvs) -
容器运行时(containerd)
- 关键指标:runtime socket 可用性、镜像拉取/解压失败、容器创建延迟
-
示例命令:
```bash
# 检查 containerd 服务
systemctl status containerd --no-pager使用 crictl 进行运行时健康检查(需安装)#
安装 crictl#
VER=v1.28.0
wget -q https://github.com/kubernetes-sigs/cri-tools/releases/download/${VER}/crictl-${VER}-linux-amd64.tar.gz
tar -xzf crictl-${VER}-linux-amd64.tar.gz
sudo mv crictl /usr/local/bin/查看运行时与镜像#
crictl info
crictl images
`` - 预期效果:crictl info` 输出正常、镜像列表可见 - apiserver 不可用
- 现象:所有
kubectl命令失败、控制面组件报错 - 排查路径(示例):
bash # 1) 确认 apiserver 静态 Pod ls -l /etc/kubernetes/manifests/ # 2) 查看 apiserver 容器日志 kubectl -n kube-system logs -l component=kube-apiserver --tail=200 # 3) 确认证书有效期 openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates # 4) 验证 etcd 连接是否超时 curl -k https://127.0.0.1:6443/healthz -
预期效果:
healthz返回ok;证书未过期 -
etcd 不健康
- 现象:apiserver 频繁超时、集群写入失败
-
排查路径:
```bash
# 1) 检查 etcd 健康
export ETCDCTL_API=3
etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/peer.crt \
--key=/etc/kubernetes/pki/etcd/peer.key \
endpoint status -w table2) 查看磁盘压力与 IOPS#
iostat -xm 1 3
df -h /var/lib/etcd
`` - 预期效果:endpoint status` 显示 leader 正常、延迟无异常 -
节点 NotReady
- 现象:Pod 驱逐、调度失败 排查路径:
-
Pod 无法启动或反复重启
- 现象:CrashLoopBackOff、ImagePullBackOff 排查路径:
-
服务访问异常(ClusterIP/NodePort)
- 现象:服务不可达、DNS 解析失败
-
排查路径:
```bash
# 1) DNS 测试
kubectl run dns-test --image=busybox:1.36 -it --rm -- sh
# 在 Pod 中执行:
nslookup kubernetes.default2) kube-proxy 规则抽查(iptables 模式)#
sudo iptables -t nat -L | grep KUBE-SVC | head
```
- 预期效果:DNS 返回 IP;iptables 规则存在 -
确认范围
bash # 核心组件是否普遍异常 kubectl get pods -A | grep -E "kube-system|coredns|kube-proxy" -
查看事件与状态
bash kubectl get events -A --sort-by=.lastTimestamp | tail -n 20 -
查看核心日志
bash journalctl -u kubelet -n 200 --no-pager kubectl -n kube-system logs -l component=kube-apiserver --tail=100 kubectl -n kube-system logs -l k8s-app=kube-dns --tail=100 -
恢复策略
```bash
# 重启 kubelet(节点级异常)
sudo systemctl restart kubelet - 验证与回归
bash kubectl get nodes kubectl get pods -A | grep -E "Running|Completed" kubectl get --raw='/readyz?verbose' - 证书过期
- 预防:定期检查并续期
bash kubeadm certs check-expiration - 磁盘压力
- 预防:清理镜像与日志
bash # 清理未使用镜像(containerd) crictl rmi --prune journalctl --vacuum-time=7d - etcd 膨胀
-
预防:压缩与碎片整理
```bash
export ETCDCTL_API=3
etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
compact $(etcdctl endpoint status -w json | jq -r '.[0].Status.header.revision')etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
defrag
- **时间漂移** - 预防:统一 NTPbash
timedatectl status
chronyc sources -v
```
```bash
# 查看节点状态与条件
kubectl get nodes -o wide
kubectl describe node | sed -n '/Conditions:/,/Addresses:/p'
本机检查 kubelet 服务状态#
systemctl status kubelet --no-pager
``
- 预期效果:Ready=True、无DiskPressure/MemoryPressure`
2. 常见故障现象与排查路径(含命令解释与结果)
```bash
# 1) 查看节点条件与事件
kubectl describe node
2) 查看 kubelet 日志#
journalctl -u kubelet -n 200 --no-pager
3) 检查 CNI 与容器运行时#
ls /etc/cni/net.d/
crictl ps -a | head
``
- 预期效果:Ready=True,无NetworkUnavailable`
```bash
# 1) 查看 Pod 事件与状态
kubectl describe pod -n
2) 查看容器日志(确认退出原因)#
kubectl logs -n --previous```
- 预期效果:找到具体错误(镜像、探针、权限或资源)
3. 典型故障处理流程(步骤 + 命令)
# 重新生成证书(示例:kubeadm 管理)
sudo kubeadm certs check-expiration
sudo kubeadm certs renew all
sudo systemctl restart kubelet
# etcd 快照恢复(示例)
export ETCDCTL_API=3
etcdctl snapshot save /backup/etcd-$(date +%F).db \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key
```
4. 高危场景与预防策略(含可执行方案)
5. 日常巡检要点(基础 + 命令)
# 1) 控制面健康
kubectl get --raw='/readyz?verbose'
# 2) etcd 健康
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
endpoint health
# 3) 节点 Ready
kubectl get nodes
# 4) CoreDNS 解析测试
kubectl run dns-test --image=busybox:1.36 -it --rm -- sh -c "nslookup kubernetes.default"
6. 练习(含明确目标与预期)
1. 练习1:模拟 CoreDNS 异常并定位
- 操作:将 CoreDNS 副本数改为 0
bash
kubectl -n kube-system scale deployment coredns --replicas=0
- 预期:DNS 解析失败;恢复后解析正常
bash
kubectl -n kube-system scale deployment coredns --replicas=2
-
练习2:模拟节点 NotReady
- 操作:停止 kubelet
bash sudo systemctl stop kubelet
- 预期:节点变为 NotReady;恢复后 Ready
bash sudo systemctl start kubelet -
练习3:检查并续期证书
- 操作:
bash kubeadm certs check-expiration kubeadm certs renew all sudo systemctl restart kubelet
- 预期:证书有效期更新,apiserver 正常响应