k8s教程:13.初步认识kubernetes的健康检查

有时候大家对于使用容器编排工具kubernetes的好处是什么会有一定的疑惑,强大的kubernetes究竟可以在日常的运维和系统部署中帮我们减轻什么样子的工作呢?
其实大家都忽略了kubernetes的一个强大功能,那就是他的健康检查和自愈能力。
在我们日常的运维过程中,不可避免会出现新拉取的镜像不能启动,容器因为各种问题而导致意外进程结束等,这时候我们就必须人工手动重启拉取旧的镜像或者是将容器重新启动。这部分人工过程实在是太耗费资源了,毕竟你是不知道它什么时候会发生,让运维同学提心吊胆啊。
但是得益于kubernetes强大的自愈能力,它能够默认将非正常退出的容器自动重启的操作,这就大大提高了我们实现零停机部署,不间断提供服务的能力。
kubernetes的健康检查分为默认、Liveness 和 Readiness。今天我们先从简单的默认方式入手。
在yaml文件的spec中有一个属性是restartPolicy ,他的设置是用于告诉kubernetes当容器非正常退出时,是否进行重启的操作,一般情况下是默认always。
下面我们来简单的实现一下容器非正常退出再经历自动重启的过程:
1.首先我们先创建一个名为healthcheck的yaml文件
2.在容器启动的时候执行脚本命令,让容器在十秒钟之后非正常退出
在这里插入图片描述
3.apply yaml文件,然后观察pod的详细情况
在这里插入图片描述
从图中可以看到,当容器非正常退出之后,kubernetes会根据restartPolicy属性的值进行重启的操作。

大家有问题或者想和我交流的也可以关注我的微信公众号:
在这里插入图片描述

[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
<think>我们正在分析kubelet日志,重点关注报错信息和需要注意的点,包括goroutine状态等内容。 根据引用内容,我们可以提取以下关键信息: 1. 引用[1]提到kubelet可能因为cgroup驱动不一致而报错:kubelet使用"cgroupfs",而docker使用"systemd"。这会导致启动失败。 2. 引用[2]提到LogRotatePolicy,可能涉及日志轮转,但未直接给出报错。 3. 引用[3]详细描述了PLEG(Pod生命周期事件生成器)的工作机制,包括定期relist和状态同步。如果PLEG出现性能问题(如relist超时),可能会导致Pod状态更新延迟,这在日志中可能表现为"PLEG is not healthy"等警告。 4. 引用[4]展示了dockerd和containerd状态不一致的问题,由于事件流被取消导致。这虽然发生在dockerd,但类似问题也可能影响kubelet(如果使用docker作为容器运行时)。 5. 引用[5]提到kubelet重新安装新版本时报错,通过复制admin.conf为bootstrap-kubelet.conf解决。这表明证书或配置文件缺失可能导致kubelet启动失败。 因此,分析kubelet日志时,我们需要关注: - 启动失败的原因(如配置错误、驱动不一致) - PLEG健康状态 - 容器运行时(如docker、containerd)相关错误 - 证书或配置文件缺失 - goroutine相关的错误(如goroutine泄露、panic等) 具体步骤建议: 1. 查找ERROR级别的日志,这是最直接的报错。 2. 注意警告(WARNING)日志,可能指示潜在问题(如PLEG not healthy)。 3. 检查goroutine相关的堆栈跟踪(stack trace),尤其是在出现panic时。 4. 检查与容器运行时交互的日志,例如CRI(容器运行时接口)调用失败。 5. 检查证书和配置文件路径是否正确(如kubeconfig文件)。 常见报错示例及注意点: 1. cgroup驱动不一致(如引用[1]): 报错信息:`failed to run Kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"` 解决方法:修改kubelet或docker的cgroup驱动,使两者一致。 2. PLEG问题(如引用[3]): PLEG not healthy: 通常由于relist操作耗时过长(超过3分钟)导致。可能原因包括: - 节点资源不足(CPU、IO等) - 容器运行时响应慢 - 节点上Pod数量过多 日志中可能出现:`PLEG is not healthy: pleg was last seen active 3m0s ago; threshold is 3m0s` 3. 证书或配置问题(如引用[5]): 报错信息:`Unit kubelet.service entered failed state`,检查日志可能会发现证书缺失或kubeconfig文件未找到。 解决方法:确保配置文件(如bootstrap-kubelet.conf)存在且位置正确。 4. 容器运行时通信问题(类似引用[4]): 日志中可能出现:`failed to create containerd task: ...` 或 `connection error`等。 5. goroutine相关: 注意日志中出现的panic堆栈信息,例如: `panic: runtime error: ...` `goroutine [ID] [running]:` 这通常意味着程序遇到了未处理的异常,需要根据堆栈定位代码问题。 6. 其他常见错误: - 网络插件问题:`network plugin is not ready` - 镜像拉取失败:`Failed to pull image ...` 总结:分析kubelet日志时,应逐行扫描错误和警告,结合上下文(如时间戳、错误码)分析根本原因。对于goroutine状态,主要关注panic和死锁等严重错误。同时,注意节点资源使用情况(如内存、磁盘)可能间接反映在日志中(如OOM导致容器退出)。 </think>### Kubelet日志分析指南 分析kubelet日志时(通常位于 `/var/log/kubelet.log` 或 `/opt/kubernetes/logs/kubelet.*`),需重点关注以下报错信息和注意点: #### 核心报错类型及分析要点 1. **cgroup驱动不一致**(关键报错) - 日志特征:`failed to run Kubelet: misconfiguration: kubelet cgroup driver: "X" is different from docker cgroup driver: "Y"`[^1] - 注意点:需确保容器运行时(如Docker/containerd)与kubelet的cgroup驱动一致(通常改为systemd) - 修复方法: ```bash # 修改kubelet配置 sed -i 's/cgroupDriver:.*/cgroupDriver: systemd/' /var/lib/kubelet/config.yaml systemctl restart kubelet ``` 2. **PLEG异常**(Pod生命周期事件生成器) - 日志特征:`PLEG is not healthy` 或频繁出现 `relist` 超时[^3] - 注意点: - 检查容器运行时状态(如 `docker ps` 或 `crictl ps`) - 监控节点资源(CPU/IO)是否过载 - 默认relist间隔为1秒,超时阈值3分钟 - 风险:导致Pod状态同步延迟 3. **证书配置错误** - 日志特征:`x509: certificate signed by unknown authority` 或 `failed to load kubelet config file` - 解决方案(如引用[5]案例): ```bash cp /etc/kubernetes/admin.conf /etc/kubernetes/bootstrap-kubelet.conf systemctl restart kubelet ``` 4. **容器运行时连接异常** - 日志特征:`connection error` 或 `event stream canceled`[^4] - 注意点: - 检查 `dockerd` 或 `containerd` 服务状态 - 确认CRI(容器运行时接口)socket路径正确 - 日志示例: ``` "stopping event stream following graceful shutdown" error="<nil>"» ``` #### Goroutine状态分析要点 1. **goroutine泄露检测** - 在日志中搜索 `goroutine dump` 或 `goroutine profile` - 关注持续增长的goroutine数量(可能出现在高并发场景) 2. **协程阻塞警告** - 典型日志:`goroutine [ID] [chan receive/send]` - 常见阻塞点: - 同步等待容器运行时响应 - 锁竞争(如 `sync.Mutex` 相关日志) 3. **panic堆栈追踪** - 日志特征:`panic: runtime error:` + goroutine调用栈 - 关键信息: - panic发生的源码位置(如 `k8s.io/kubernetes/pkg/kubelet/...`) - goroutine ID和状态(如 `[running]`, `[sleep]`) #### 日志分析最佳实践 1. **时间关联分析** ```bash grep -E 'ERR|WARN|Exception' /var/log/kubelet.log | awk -F' ' '{print $1,$2,$3,$NF}' ``` 将报错时间与节点事件(`kubectl describe node`)关联 2. **核心模块监控** ```bash # 监控PLEG性能 grep 'relist duration' /var/log/kubelet.log | sort -k5 -n # 跟踪Pod同步状态 grep 'SyncLoop' /var/log/kubelet.log ``` 3. **日志级别调整** 临时增加日志粒度(需重启): ```bash vim /etc/systemd/system/kubelet.service.d/10-logging.conf # 添加:--v=4 # 0-4常规调试,5-9跟踪级 ``` #### 高风险日志总结 | 日志特征 | 风险等级 | 关联组件 | |-----------------------------------|----------|---------------| | `cgroup driver mismatch` | 致命 | 容器运行时 | | `PLEG is not healthy` | 严重 | Pod生命周期 | | `x509: certificate` | 严重 | 认证模块 | | `goroutine [ID] [chan receive]` | 中度 | 并发控制 | | `SyncLoop error` | 中度 | Pod同步循环 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hugo_Hoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值