为什么开源 KubeEye
Kubernetes 作为容器编排的事实标准,尽管架构优雅性能也十分弱小,然而 Kubernetes 在日常运行过程中总会有一些疑难杂症和隐性的问题让集群管理员和 Yaml 工程师们十分头疼,
- 基础设施守护过程问题:ntp 服务中断;
- 硬件问题:如 CPU,内存或磁盘异样;
- 内核问题:内核死锁,文件系统损坏;
- 容器运行时问题:运行时守护过程无响应;
- ···
这样的问题还有很多,并且这些隐性的异样问题对集群的管制面来说是不可见的,因而 Kubernetes 将持续将 Pod 调度到异样的节点,进而造成集群和运行的利用带来十分大的平安与稳定性的危险。
什么是 KubeEye
KubeEye 是一款 开源的集群主动巡检工具,旨在发现 Kubernetes 上的各种问题,比方利用配置谬误、集群组件不衰弱和节点问题。KubeEye 应用 Go 语言基于 Polaris 和 Node-Problem-Detector 开发,内置了一系列异样检测规定。除了预约义的规定,它还反对自定义规定。
KubeEye 能做什么
- 发现与检测 Kubernetes 集群管制立体的问题,包含 kube-apiserver/kube-controller-manager/etcd 等;
- 帮忙你检测 Kubernetes 的各种节点问题,包含内存 /CPU/ 磁盘压力,意外的内核谬误日志等;
- 依据行业最佳实际验证你的工作负载 yaml 标准,帮忙你使你的集群稳固。
架构图
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
- 从 Releases 中下载预构建的可执行文件。
-
或者你也能够从源代码构建
git clone https://github.com/kubesphere/kubeeye.git cd kubeeye make install
- [可选] 装置 Node-problem-Detector
留神:这一行将在你的集群上装置 npd,只有当你想要具体的报告时才须要。ke install 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, total-vm:826516kB, anon-rss:819296kB, file-rss:0kB, shmem-rss:0kB
insights-agent Warning workloads-1606467120.164b519ca8c67416 2020-11-27T16:57:05+08:00 DeadlineExceeded Job was active longer than specified deadline
kube-system Warning calico-node-zvl9t.164b3dc50580845d 2020-11-27T17:09:35+08:00 DNSConfigForming Nameserver limits were exceeded, some nameservers have been omitted, the applied nameserver line is: 100.64.11.3 114.114.114.114 119.29.29.29
kube-system Warning kube-proxy-4bnn7.164b3dc4f4c4125d 2020-11-27T17:09:09+08:00 DNSConfigForming Nameserver limits were exceeded, some nameservers have been omitted, the applied nameserver line is: 100.64.11.3 114.114.114.114 119.29.29.29
kube-system Warning nodelocaldns-2zbhh.164b3dc4f42d358b 2020-11-27T17:09:14+08:00 DNSConfigForming Nameserver limits were exceeded, some nameservers have been omitted, the applied nameserver line is: 100.64.11.3 114.114.114.114 119.29.29.29
NAMESPACE SEVERITY NAME KIND TIME MESSAGE
kube-system Warning node-problem-detector DaemonSet 2020-11-27T17:09:59+08:00 [livenessProbeMissing runAsPrivileged]
kube-system Warning calico-node DaemonSet 2020-11-27T17:09:59+08:00 [runAsPrivileged cpuLimitsMissing]
kube-system Warning nodelocaldns DaemonSet 2020-11-27T17:09:59+08:00 [cpuLimitsMissing runAsPrivileged]
default Warning nginx Deployment 2020-11-27T17:09:59+08:00 [cpuLimitsMissing livenessProbeMissing tagNotSpecified]
insights-agent Warning workloads CronJob 2020-11-27T17:09:59+08:00 [livenessProbeMissing]
insights-agent Warning cronjob-executor Job 2020-11-27T17:09:59+08:00 [livenessProbeMissing]
kube-system Warning calico-kube-controllers Deployment 2020-11-27T17:09:59+08:00 [cpuLimitsMissing livenessProbeMissing]
kube-system Warning coredns Deployment 2020-11-27T17:09:59+08:00 [cpuLimitsMissing]
可参考常见 FAQ 内容来优化您的集群。
增加自定义查看规定
除了上述预置的巡检我的项目与规定,KubeEye 还反对自定义查看规定,来看个例子:
增加 npd 自定义查看规定
- 装置 NPD 指令
ke install npd
- 由 kubectl 编辑 configmap kube-system/node-problem-detector-config,
kubectl edit cm -n kube-system node-problem-detector-config
- 在 configMap 的规定下增加异样日志信息,规定遵循正则表达式。
自定义最佳实际规定
- 筹备一个规定 yaml,例如,上面的规定将验证你的 Pod 标准,以确保镜像只来自受权的注册处。
checks:
imageFromUnauthorizedRegistry: warning
customChecks:
imageFromUnauthorizedRegistry:
promptMessage: When the corresponding rule does not match. Show that image from an unauthorized registry.
category: Images
target: Container
schema:
'$schema': http://json-schema.org/draft-07/schema
type: object
properties:
image:
type: string
not:
pattern: ^quay.io
- 将上述规定保留为 yaml,例如
rule.yaml
。 - 用
rule.yaml
运行 KubeEye。
root:# ke diag -f rule.yaml --kubeconfig ~/.kube/config
NAMESPACE SEVERITY NAME KIND TIME MESSAGE
default Warning nginx Deployment 2020-11-27T17:18:31+08:00 [imageFromUnauthorizedRegistry]
kube-system Warning node-problem-detector DaemonSet 2020-11-27T17:18:31+08:00 [livenessProbeMissing runAsPrivileged]
kube-system Warning calico-node DaemonSet 2020-11-27T17:18:31+08:00 [cpuLimitsMissing runAsPrivileged]
kube-system Warning calico-kube-controllers Deployment 2020-11-27T17:18:31+08:00 [cpuLimitsMissing livenessProbeMissing]
kube-system Warning nodelocaldns DaemonSet 2020-11-27T17:18:31+08:00 [runAsPrivileged cpuLimitsMissing]
default Warning nginx Deployment 2020-11-27T17:18:31+08:00 [livenessProbeMissing cpuLimitsMissing]
kube-system Warning coredns Deployment 2020-11-27T17:18:31+08:00 [cpuLimitsMissing]
Roadmap
- 反对更细粒度的巡检项,例如集群响应速度慢
- 反对对巡检后果生成集群巡检报告
- 反对集群巡检报告导出为 CSV 格局或 HTML 文件
你还心愿 KubeEye 提供什么样的个性呢?欢送来 Github 提交倡议或需要~
GitHub 地址:https://github.com/kubesphere…
参考链接
KubeEye Release:https://github.com/kubesphere…
KubeEye FAQ 文档:https://github.com/kubesphere…
Node-Problem-Detector:https://github.com/kubernetes…
对于 KubeSphere
KubeSphere 是在 Kubernetes 之上构建的容器混合云,提供全栈的 IT 自动化运维的能力,简化企业的 DevOps 工作流。
KubeSphere 已被 Aqara 智能家居、原本生存、新浪、中国人保寿险、华夏银行、浦发硅谷银行、四川航空、国药团体、微众银行、紫金保险、Radore、ZaloPay 等海内外数千家企业采纳。KubeSphere 提供了运维敌对的向导式操作界面和丰盛的企业级性能,包含多云与多集群治理、Kubernetes 资源管理、DevOps (CI/CD)、利用生命周期治理、微服务治理 (Service Mesh)、多租户治理、监控日志、告警告诉、存储与网络管理、GPU support 等性能,帮忙企业疾速构建一个弱小和功能丰富的容器云平台。
KubeSphere 官网:https://kubesphere.io/
KubeSphere GitHub:https://github.com/kubesphere…
本文由博客一文多发平台 OpenWrite 公布!