为什么开源 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 使用量超过阈值
NodeCorruptOverlay2Overlay2 不可用
NodeKernelNULLPointernode 显示 NotReady
NodeDeadlock死锁是指两个或两个以上的过程在抢夺资源时相互期待的景象。
NodeOOM监控那些耗费过多内存的过程,尤其是那些耗费大量内存十分快的过程,内核会杀掉它们,避免它们耗尽内存
NodeExt4ErrorExt4 挂载失败
NodeTaskHung查看D状态下是否有超过 120s 的过程
NodeUnregisterNetDevice查看对应网络
NodeCorruptDockerImage查看 docker 镜像
NodeAUFSUmountHung查看存储
NodeDockerHungDocker hang住, 查看 docker 的日志
PodSetLivenessProbe如果为pod中的每一个容器设置了 livenessProbe
PodSetTagNotSpecified镜像地址没有申明标签或标签是最新
PodSetRunAsPrivileged以特权模式运行 Pod 意味着 Pod 能够拜访主机的资源和内核性能
PodSetImagePullBackOffPod 无奈正确拉出镜像,因而能够在相应节点上手动拉出镜像
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容许特权降级
NodeNotReadyAndUseOfClosedNetworkConnectionhttp 2-max-streams-per-connection
NodeNotReady无奈启动 ContainerManager 无奈设置属性 TasksAccounting 或未知属性
注:未标注的我的项目正在开发中

怎么应用

  • 机器上装置 KubeEye

    • 从 Releases 中下载预构建的可执行文件。
    • 或者你也能够从源代码构建

      git clone https://github.com/kubesphere/kubeeye.gitcd kubeeye make install
  • [可选] 装置 Node-problem-Detector
    留神:这一行将在你的集群上装置 npd,只有当你想要具体的报告时才须要。
    ke install npd
  • KubeEye 执行主动巡检:
root@node1:# ke diagNODENAME        SEVERITY     HEARTBEATTIME               REASON              MESSAGEnode18          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                        MESSAGEscheduler       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 refusedetcd-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 refusedNAMESPACE       SEVERITY     PODNAME                                          EVENTTIME                   REASON                MESSAGEdefault         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 bytesdefault         Warning      nginx-b8ffcf679-q4n9v.16491643e6b68cd7           2020-11-27T17:09:24+08:00   Failed                Error: ImagePullBackOffdefault         Warning      node3.164b5861e041a60e                           2020-11-27T19:01:09+08:00   SystemOOM             System OOM encountered, victim process: stress, pid: 16713default         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:0kBinsights-agent  Warning      workloads-1606467120.164b519ca8c67416            2020-11-27T16:57:05+08:00   DeadlineExceeded      Job was active longer than specified deadlinekube-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.29kube-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.29kube-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.29NAMESPACE       SEVERITY     NAME                      KIND         TIME                        MESSAGEkube-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: warningcustomChecks:  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/configNAMESPACE     SEVERITY    NAME                      KIND         TIME                        MESSAGEdefault       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 公布!