KubeSphere 开源 KubeEye:Kubernetes 集群自动巡检工具
转载自博客:https://cloud.tencent.com/developer/article/1791727?areaSource=102001.8&traceId=sGzoJqqFMrhSfsuKDFb2f
https://cloud.tencent.com/developer/article/1791727?areaSource=102001.8&traceId=sGzoJqqFMrhSfsuKDFb2f
为什么开源 KubeEye
Kubernetes 作为容器编排的事实标准,虽然架构优雅功能也非常强大,但是 Kubernetes 在日常运行过程中总会有一些疑难杂症和隐性的问题让集群管理员和 Yaml 工程师们非常头疼,例如:
- 硬件问题:如 CPU,内存或磁盘异常;
- 内核问题:内核死锁,文件系统损坏;
- 容器运行时问题:运行时守护进程无响应;
- ETCD 健康状况异常
- 应用容器配置 request、limit 的黑盒
- Pod 各种疑难问题起不来
- 证书即将过期
- Docker 服务异常
- OutOfMemory 存储空间不足
- ···
这样的问题还有很多,并且这些隐性的集群异常问题对集群的控制面来说是不可见的,因此 Kubernetes 将继续将 Pod 调度到异常的节点,进而造成集群和运行的应用带来非常大的安全与稳定性的风险。
KubeSphere 团队积累了来自社区用户和商业客户三年多的 Kubernetes 集群生产环境运维经验,精通集群组件运行与排查原理,从而开发了一款集群自动巡检工具帮助用户解决集群日常运维的痛点。
KubeEye 是什么
KubeEye 是一款开源的 Kubernetes 集群自动巡检工具,旨在自动检测发现 Kubernetes 上的各种问题,比如应用配置错误、集群组件不健康和节点问题,帮助集群管理员更好地管理集群降低风险。KubeEye 使用 Go 语言基于开源的 Polaris 和 Node-Problem-Detector 开发,内置了一系列异常检测规则。并且,除了预定义的规则,KubeEye 还支持开发者自定义规则。
KubeEye 能做什么
- 发现与检测 Kubernetes 集群控制平面的问题,包括 kube-apiserver/kube-controller-manager/etcd 等;
- 帮助你检测 Kubernetes 的各种节点问题,包括内存/CPU/磁盘压力,意外的内核错误日志等;
- 根据行业最佳实践验证你的工作负载 yaml 规范,帮助你使你的集群稳定。
KubeEye 架构
KubeEye 通过调用 Kubernetes API,通过常规匹配日志中的关键错误信息和容器语法的规则匹配来获取集群诊断数据,详见架构。
预置检查项
目前已内置支持以下巡检项,未标注的项目正在开发中。
是/否 |
检查项 |
描述 |
---|---|---|
✅ |
ETCDHealthStatus |
如果 etcd 启动并正常运行 |
✅ |
ControllerManagerHealthStatus |
如果 kubernetes kube-controller-manager 正常启动并运行 |
✅ |
SchedulerHealthStatus |
如果 kubernetes kube-schedule 正常启动并运行 |
✅ |
NodeMemory |
如果节点内存使用量超过阈值 |
✅ |
DockerHealthStatus |
如果 docker 正常运行 |
✅ |
NodeDisk |
如果节点磁盘使用量超过阈值 |
✅ |
KubeletHealthStatus |
如果 kubelet 激活状态且正常运行 |
✅ |
NodeCPU |
如果节点 CPU 使用量超过阈值 |
✅ |
NodeCorruptOverlay2 |
Overlay2 不可用 |
✅ |
NodeKernelNULLPointer |
node 显示 NotReady |
✅ |
NodeDeadlock |
死锁是指两个或两个以上的进程在争夺资源时互相等待的现象。 |
✅ |
NodeOOM |
监控那些消耗过多内存的进程,尤其是那些消耗大量内存非常快的进程,内核会杀掉它们,防止它们耗尽内存 |
✅ |
NodeExt4Error |
Ext4 挂载失败 |
✅ |
NodeTaskHung |
检查D状态下是否有超过 120s 的进程 |
✅ |
NodeUnregisterNetDevice |
检查对应网络 |
✅ |
NodeCorruptDockerImage |
检查 docker 镜像 |
✅ |
NodeAUFSUmountHung |
检查存储 |
✅ |
NodeDockerHung |
Docker hang住, 检查 docker 的日志 |
✅ |
PodSetLivenessProbe |
如果为pod中的每一个容器设置了 livenessProbe |
✅ |
PodSetTagNotSpecified |
镜像地址没有声明标签或标签是最新 |
✅ |
PodSetRunAsPrivileged |
以特权模式运行 Pod 意味着 Pod 可以访问主机的资源和内核功能 |
✅ |
PodSetImagePullBackOff |
Pod 无法正确拉出镜像,因此可以在相应节点上手动拉出镜像 |
✅ |
PodSetImageRegistry |
检查镜像形式是否在相应仓库 |
✅ |
PodSetCpuLimitsMissing |
未声明 CPU 资源限制 |
✅ |
PodNoSuchFileOrDirectory |
进入容器查看相应文件是否存在 |
✅ |
PodIOError |
这通常是由于文件 IO 性能瓶颈 |
✅ |
PodNoSuchDeviceOrAddress |
检查对应网络 |
✅ |
PodInvalidArgument |
检查对应存储 |
✅ |
PodDeviceOrResourceBusy |
检查对应的目录和 PID |
✅ |
PodFileExists |
检查现有文件 |
✅ |
PodTooManyOpenFiles |
程序打开的文件/套接字连接数超过系统设置值 |
✅ |
PodNoSpaceLeftOnDevice |
检查磁盘和索引节点的使用情况 |
✅ |
NodeApiServerExpiredPeriod |
将检查 ApiServer 证书的到期日期少于30天 |
✅ |
PodSetCpuRequestsMissing |
未声明 CPU 资源请求值 |
✅ |
PodSetHostIPCSet |
设置主机 IP |
✅ |
PodSetHostNetworkSet |
设置主机网络 |
✅ |
PodHostPIDSet |
设置主机 PID |
✅ |
PodMemoryRequestsMiss |
没有声明内存资源请求值 |
✅ |
PodSetHostPort |
设置主机端口 |
✅ |
PodSetMemoryLimitsMissing |
没有声明内存资源限制值 |
✅ |
PodNotReadOnlyRootFiles |
文件系统未设置为只读 |
✅ |
PodSetPullPolicyNotAlways |
镜像拉策略并非总是如此 |
✅ |
PodSetRunAsRootAllowed |
以 root 用户执行 |
✅ |
PodDangerousCapabilities |
您在 ALL / SYS_ADMIN / NET_ADMIN 等功能中有危险的选择 |
✅ |
PodlivenessProbeMissing |
未声明 ReadinessProbe |
✅ |
privilegeEscalationAllowed |
允许特权升级 |
NodeNotReadyAndUseOfClosedNetworkConnection |
http 2-max-streams-per-connection |
|
NodeNotReady |
无法启动 ContainerManager 无法设置属性 TasksAccounting 或未知属性 |
快速上手 KubeEye
- 克隆 KubeEye 仓库,然后安装 KubeEye:
-
快速上手 KubeEye
- 克隆 KubeEye 仓库,然后安装 KubeEye:
git clone https://github.com/kubesphere/kubeeye.git cd kubeeye make install
还可以从 GitHub Releases 中下载预构建的可执行文件,release 地址参见文末,或者从源代码构建。
[可选] 安装 Node-problem-Detector: 注意:这一行命令将在你的集群上安装 npd,只有当你想要详细的报告时才需要。
KubeEye 执行自动巡检:
root@node1:# ke diag NODENAME SEVERITY HEARTBEATTIME REASON MESSAGE node18 Fatal 2020-11-19T10:32:03+08:00 NodeStatusUnknown Kubelet stopped posting node status. node19 Fatal 2020-11-19T10:31:37+08:00 NodeStatusUnknown Kubelet stopped posting node status. node2 Fatal 2020-11-19T10:31:14+08:00 NodeStatusUnknown Kubelet stopped posting node status. node3 Fatal 2020-11-27T17:36:53+08:00 KubeletNotReady Container runtime not ready: RuntimeReady=false reason:DockerDaemonNotReady message:docker: failed to get docker version: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? NAME SEVERITY TIME MESSAGE scheduler Fatal 2020-11-27T17:09:59+08:00 Get http://127.0.0.1:10251/healthz: dial tcp 127.0.0.1:10251: connect: connection refused etcd-0 Fatal 2020-11-27T17:56:37+08:00 Get https://192.168.13.8:2379/health: dial tcp 192.168.13.8:2379: connect: connection refused NAMESPACE SEVERITY PODNAME EVENTTIME REASON MESSAGE default Warning node3.164b53d23ea79fc7 2020-11-27T17:37:34+08:00 ContainerGCFailed rpc error: code = Unknown desc = Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? default Warning node3.164b553ca5740aae 2020-11-27T18:03:31+08:00 FreeDiskSpaceFailed failed to garbage collect required amount of images. Wanted to free 5399374233 bytes, but freed 416077545 bytes default Warning nginx-b8ffcf679-q4n9v.16491643e6b68cd7 2020-11-27T17:09:24+08:00 Failed Error: ImagePullBackOff default Warning node3.164b5861e041a60e 2020-11-27T19:01:09+08:00 SystemOOM System OOM encountered, victim process: stress, pid: 16713 default Warning node3.164b58660f8d4590 2020-11-27T19:01:27+08:00 OOMKilling Out of memory: Kill process 16711 (stress) score 205 or sacrifice child Killed process 16711 (stress), UID 0