关于云计算:KubeSphere-开源-KubeEyeKubernetes-集群自动巡检工具

45次阅读

共计 8121 个字符,预计需要花费 21 分钟才能阅读完成。

为什么开源 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 公布!

正文完
 0