Kubernetes(k8s)-NodeStatus(PLEG)介绍

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

图片

我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。

前面介绍了Pod的创建过程和Pod各个状态,今天我们来讲讲Node的状态。

状态说明

Pod的状态可以有很多,但是Node状态实际上只有2个,一个是正常的Ready,和一个非正常状态NotReady。

在Kubernetes当中NotReady是一个比较常见的问题,引发的原因也有很多,主要涉及到kubelet本身异常,Docker异常(或者是Containerd异常),操作系统异常,以及PLEG等。在 Kubernetes 社区中,PLEG is not healthy 成名已久,只要出现这个报错,就有很大概率造成 Node 状态变成 NotReady,并且是在NotReady和Ready来回切换。那什么是PLEG呢?

PLEG 是 "Pod Lifecycle Event Generator" 的缩写,它是 Kubernetes 中负责监控和报告 Pod 生命周期事件的组件。具体来说,PLEG 的主要职责是监测运行在节点上的容器状态变化,并将这些变化通知给 Kubelet(Kubernetes 节点上的代理)。虽然说上报给Kubelet,实际执行这个逻辑的也是它,最后还是把信息汇总到kube-apiserver。

以下是 PLEG 的一些关键功能:

事件检测:PLEG 会定期检查容器的状态,比如它们是否已经启动、是否正在运行、是否已停止等。

事件生成:当检测到容器状态发生变化时,PLEG 会生成相应的生命周期事件。例如,当一个新容器被创建或现有容器终止时,它会产生对应的事件。

事件同步:这些事件随后会被同步给 kubelet,以便它可以更新其内部状态并采取必要的行动。如重新调度失败的容器或者更新 Pod 状态为 "Ready" 或 "NotReady"。

健康检查支持:PLEG 也参与了对容器执行存活探针(liveness probe)和就绪探针(readiness probe)的支持,确保只有健康的容器被认为是准备好的并且可以接收流量。

提高系统稳定性:通过及时捕获和响应容器状态的变化,PLEG 帮助维护集群中各个 Pod 和容器的稳定性和正确性。

状态异常影响

kubelet节点NotReady对pod的影响根据实际情况而已,影响的范围也有差异。

1.对于无状态Pod,当前节点NotReady,则处于不可调度状态,集群资源缩小,如果服务器资源紧张可能出现部分Pod无法调度,就可能影响业务。如果集群资源比较多,所有Pod都能正常调度,则几乎没什么影响,但是需要及时发现及时修复问题。

2.对于有状态Pod或者只能在当前节点的Pod,则无法调度到其他节点,可能会出现Pending或者Unknown状态。在正常高可用架构涉及下是不会影响的,但是需要尽快修复,因为如果在你修复之前可能另外节点也出现异常,则可能你的高可用失效。

3.单副本无状态Pod,虽然会调度到其他节点,但是这个是有有时间差的。首先一个时间是就kubelet状态最长40秒才会被判断为NoReady,然后还有一个驱逐超时时间5分钟,最慢是是5分40秒才会被调度到其他节点(这些是默认参数可以调整),也就是这个可能会导致业务中断超过5分钟。

生产案例

案例一:这个是曾经在某私有云遇到的生产环境案例,具体原因暂时未知。大概逻辑就是Kubelet无法获取Docker状态,导致节点出现NotReady,但是一会又可以获取正常状态,就会出现Node状态反复跳变。下面是当时解决方法。

# 遍历docker容器状态,验证是否会被卡住
for c in $(docker ps -aq); do echo $c; docker inspect $c 1>/dev/null 2>&1; done
# 如果被卡住,说明对应的容器有问题,一般直接删除容器即可
docker rm -f ${dockerid}
# 如果删除后还复现,则需要重点查看docker状态

案例二:也是某私有云生产案例,当前集群默认不能中断的Pod至少都是2副本,默认都是配置亲和性和反亲和性,但是由于这个集群在部署的时候只有一个节点,所以当时这两个Pod就都在一个节点,最后这个节点崩溃,业务中断了5分钟。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。

[root@aistudio-prod-node8 ~]# systemctl status kubelet ● kubelet.service - Kubernetes Kubelet Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled) Active: active (running) since Thu 2025-11-06 21:13:55 CST; 1ms ago Main PID: 11054 (kubelet) Tasks: 1 Memory: 120.0K CGroup: /system.slice/kubelet.service └─11054 /opt/kubernetes/bin/kubelet --logtostderr=false --v=2 --log-dir=/opt/kubernetes/logs --hostname-over... Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....x527 Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: goroutine 813 [sync.Cond.Wait]: Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: runtime.goparkunlock(...) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /usr/local/go/src/runtime/proc.go:312 Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: sync.runtime_notifyListWait(0xc001b87f50, 0xc000000000) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /usr/local/go/src/runtime/sema.go:513 +0xf8 Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: sync.(*Cond).Wait(0xc001b87f40) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /usr/local/go/src/sync/cond.go:56 +0x9d Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: k8s.io/kubernetes/vendor/k8s.io/client-go/util/workqueue.(*Type...600) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....0x89 Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: k8s.io/kubernetes/vendor/k8s.io/client-go/transport.(*dynamicCl...000) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....0x66 Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: k8s.io/kubernetes/vendor/k8s.io/client-go/transport.(*dynamicCl...f80) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....0x2b Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait.Back...620) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....0x5f Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait.Back...0c0) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....0xad Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait.Jitt...0c0) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....0x98 Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait.Unti...0c0) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....0x4d Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: created by k8s.io/kubernetes/vendor/k8s.io/client-go/transport.....Run Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....x205 Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: goroutine 814 [select]: Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait.Wait...0x0) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....x11d Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait.Poll...0x0) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....0xc5 Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait.Poll...0x0) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....0xb3 Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: created by k8s.io/kubernetes/vendor/k8s.io/client-go/transport.....Run Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....x273 Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: goroutine 815 [select]: Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait.cont...200) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....0xbd Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: created by k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/uti...nnel Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....0x8c Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: goroutine 816 [select]: Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait.poll...8a0) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....x17b Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: created by k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/uti...unc1 Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....0x8c Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: goroutine 818 [chan receive]: Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: k8s.io/kubernetes/vendor/k8s.io/client-go/util/workqueue.(*Type...860) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....0xac Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: created by k8s.io/kubernetes/vendor/k8s.io/client-go/util/workq...ueue Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....x135 Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: goroutine 819 [select]: Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: k8s.io/kubernetes/vendor/k8s.io/client-go/util/workqueue.(*dela...980) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....x405 Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: created by k8s.io/kubernetes/vendor/k8s.io/client-go/util/workq...ueue Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....x185 Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: goroutine 820 [chan receive]: Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: k8s.io/kubernetes/vendor/k8s.io/client-go/transport.(*dynamicCl...0c0) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....x28d Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: created by k8s.io/kubernetes/vendor/k8s.io/client-go/transport.....get Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....x527 Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: goroutine 817 [sync.Cond.Wait]: Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: runtime.goparkunlock(...) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /usr/local/go/src/runtime/proc.go:312 Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: sync.runtime_notifyListWait(0xc001a94190, 0xc000000000) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /usr/local/go/src/runtime/sema.go:513 +0xf8 Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: sync.(*Cond).Wait(0xc001a94180) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /usr/local/go/src/sync/cond.go:56 +0x9d Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: k8s.io/kubernetes/vendor/k8s.io/client-go/util/workqueue.(*Type...600) Nov 06 21:13:55 aistudio-prod-node8 kubelet[10668]: /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s....0x89 Hint: Some lines were ellipsized, use -l to show in full. 这个日志有报错信息和注意的点吗
最新发布
11-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值