k8s租约 && containerd status上报

从kube-controller-manager 和kube-scheduler 租约看 平面本身正常。从event看 部分node离线了default 10m
要判断 Kubernetes 控制平面是否曾发生过异常,不能仅看当前状态,而应通过历史事件、组件日志、租约续期记录、节点心跳中断等多维度进行回溯分析。以下是系统性的判断方法:
一、检查控制平面组件的租约(Lease)历史记录
你已查看了 kube-controller-manager 和 kube-scheduler 的 Endpoints,其中包含 control-plane.alpha.kubernetes.io/leader 注解,该注解记录了 Leader 选举和续期信息:
acquireTime:首次获得 Leader 的时间。renewTime:最近一次成功续期的时间。leaderTransitions:Leader 切换次数。
异常判断依据:
- 如果
leaderTransitions数值异常高(如短时间内多次切换),说明组件曾频繁重启或网络不稳定导致 Leader 丢失。 - 如果
renewTime与当前时间间隔远超leaseDurationSeconds(默认15秒),说明组件曾长时间无法续期,可能发生过宕机或 API Server 不可用。
二、查看控制平面组件的 Pod 事件与日志
控制平面组件通常以静态 Pod 形式运行在 kube-system 命名空间下。可通过以下命令查看其历史状态:
# 查看 kube-apiserver、kube-controller-manager、kube-scheduler 的 Pod 状态
kubectl get pods -n kube-system | grep -E 'apiserver|controller|scheduler'
# 查看某个组件的详细事件(如 kube-controller-manager)
kubectl describe pod <pod-name> -n kube-system
# 查看组件日志(重点关注错误、重启、超时等关键词)
kubectl logs <pod-name> -n kube-system --previous # 查看上一次崩溃前的日志
异常判断依据:
- Pod 状态为
CrashLoopBackOff、Error、Evicted或重启次数(RESTARTS)过高。 - 日志中出现
etcd connection refused、context deadline exceeded、leader election lost等关键错误。
三、检查 etcd 集群健康状态
etcd 是控制平面的“记忆中枢”,其稳定性直接影响 API Server 和组件选举。
# 检查 etcd 集群健康(需在 master 节点执行)
ETCDCTL_API=3 etcdctl endpoint health \
--endpoints=https://<etcd-ip>:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key
异常判断依据:
- 输出中包含
unhealthy或connection refused。 - etcd Pod 重启频繁或资源占用过高(CPU/内存)。
四、分析节点心跳(Node Lease)中断情况
节点通过 kube-node-lease 命名空间下的 Lease 对象向 API Server 发送心跳。如果大量节点同时出现心跳中断,可能是 API Server 或网络层异常。
# 查看 kube-node-lease 命名空间下的 Lease 对象
kubectl get leases -n kube-node-lease
# 检查节点状态变化事件
kubectl get events -n default --field-selector reason=NodeNotReady,NodeReady
异常判断依据:
- 多个节点的
renewTime同时停滞或大幅延迟。 - 事件中出现大规模
NodeNotReady与NodeReady交替震荡(如你截图中所示),这通常不是节点本身问题,而是控制平面无法及时处理心跳。
五、检查 API Server 的审计日志或监控指标
如果集群开启了审计日志或接入了 Prometheus/Grafana 监控系统,可通过以下方式回溯:
- 审计日志:搜索
403、500、timeout等 HTTP 状态码,或impersonate、delete等敏感操作。 - 监控指标:
apiserver_request_total{code=~"5.."}:API Server 5xx 错误请求数。etcd_disk_wal_fsync_duration_seconds:etcd 磁盘写入延迟。leader_election_master_status:Leader 选举状态变化。
六、结合你当前截图的分析结论
从你提供的截图来看:
kube-controller-manager和kube-scheduler的renewTime均为2026-07-27T09:12:xxZ,说明当前它们正在正常工作。- 但
kubectl get event -A显示多个节点(如spider50,spider59)在 10 分钟内反复出现NodeNotReady→NodeReady→NodeNotReady的震荡。
这表明:控制平面组件本身当前是正常的,但可能在 10 分钟前经历过一次短暂的中断或高负载,导致无法及时处理节点心跳,从而引发节点状态震荡。 建议重点排查:
- API Server 在该时间段的日志和 resourceVersion 变化。
- etcd 是否有短暂的写入延迟或连接中断。
- Master 节点的网络或资源(CPU/内存)是否在 10 分钟前出现过瓶颈。
以上方法可组合使用,形成完整的“控制平面异常回溯”诊断链路。如果你能提供 kubectl describe pod 或 etcdctl endpoint health 的输出,我可以帮你进一步定位具体原因。
是的,kube-apiserver 也有租约(Lease),但它的工作机制与 kube-controller-manager 和 kube-scheduler 不同,因此你无法通过 kubectl get endpoints 看到它的“Leader 租约”。
为什么 api-master 没有“Endpoints 租约”?
- Controller/Scheduler:它们是“主备模式”,同一时间只有一个实例在工作(Leader),所以需要通过 Endpoints 的注解来记录谁是 Leader。
- API Server:它是“多活模式”,所有 API Server 实例同时工作,共同分担流量,不存在“只有一个能干活”的情况,所以不需要 Leader 选举租约。
如何查看 API Server 的租约?
从 Kubernetes v1.26 开始,API Server 会为自己创建一个身份租约,用于标识自己还活着。你可以通过以下命令查看:
kubectl get lease -n kube-system -l apiserver.kubernetes.io/identity=kube-apiserver
或者查看所有 Lease 对象:
kubectl get lease -n kube-system
你会看到类似这样的输出:
NAME HOLDER AGE
kube-apiserver-<hash> kube-apiserver-<hash> 10d
这个 Lease 的 renewTime 就是 API Server 最近一次“报平安”的时间。如果这个时间很久远,说明该 API Server 实例可能已经宕机或网络中断。
如何判断 API Server 是否异常过?
除了看 Lease,你还可以:
-
查看 API Server Pod 的重启次数:
kubectl get pods -n kube-system | grep kube-apiserver如果
RESTARTS列数字很大,说明它频繁崩溃过。 -
查看 API Server 的日志:
kubectl logs <apiserver-pod-name> -n kube-system --previous重点关注
error、panic、timeout、context deadline exceeded等关键词。 -
检查 Etcd 的健康状态:
API Server 依赖 Etcd,如果 Etcd 不稳定,API Server 也会表现异常。etcdctl endpoint health --endpoints=<etcd-endpoint> -
监控 API Server 的请求延迟和错误率:
通过 Prometheus + Grafana 监控apiserver_request_duration_seconds和apiserver_request_total{code=~"5.."},可以直观看到 API Server 是否经历过性能瓶颈或服务中断。
总结
- API Server 有租约,但不是 Leader 租约,而是身份租约,用于多实例共存时的健康标识。
- 判断其历史异常,应结合 Lease 续期时间、Pod 重启次数、日志错误、以及 Etcd 状态综合判断。
- 你之前看到的节点 NotReady 事件,如果 API Server 本身稳定,那问题更可能出在 Kubelet、容器运行时或节点资源上。
既然排除了控制平面的问题,需要我帮你列一份排查节点 NodeNotReady 的具体命令清单吗?
分析:
查了一下containerd status上报和pods status上报是两个循环,containerd流程正常,pods都阻塞了。syncPod()
↓
computePodStatus()
↓
generatePodStatus()
↓
statusManager.SetPodStatus()
↓
statusManager.sync()
↓
PatchPodStatus → API Server kubelet 内 statusManager 自己死了,还没到PatchPodStatus → API Server
遗留问题:
不清楚是api慢拖死了,还是kubelet因为服务器过载了。
嗯。我找了几台kubelet看了pprof没看到podstatus问题 应该是kubelet自己出问题了
浙公网安备 33010602011771号