Go to file
Forest-L 21ad1c48d1 update readme
Signed-off-by: Forest-L <lilin@yunify.com>
2020-12-05 20:06:14 +08:00
checks add custom configuration 2020-11-25 20:45:05 +08:00
cmd update flags 2020-11-28 16:43:33 +08:00
config add kubeye 2020-11-08 02:43:58 +08:00
docs add check content 2020-11-11 14:22:10 +08:00
examples add custom configuration 2020-11-25 20:45:05 +08:00
pkg add custom configuration 2020-11-27 17:20:00 +08:00
.gitignore Add gitignore and delete ke 2020-11-10 10:49:25 +08:00
LICENSE add kubeye 2020-11-08 02:43:58 +08:00
Makefile add custom configuration 2020-11-27 17:20:00 +08:00
README.md update readme 2020-12-05 20:06:14 +08:00
go.mod add npd 2020-11-25 10:20:55 +08:00
go.sum add npd 2020-11-25 10:20:55 +08:00
main.go update flags 2020-11-28 16:43:33 +08:00

README.md

Kubeye

Kubeye is a tool for inspecting Kubernetes clusters. It runs a variety of checks to ensure that Kubernetes pods are configured using best practices, helping you avoid problems in the future. Quickly get cluster core component status and cluster size information and abnormal Pods information and tons of node problems. Developed by the GO language. Support for user-defined best practice configuration rules and the addition of cluster fault scouts, which can refer to the Node-Problem-Detector project。

Usage

1、Get the Installer Excutable File

  • Binary downloads of the kubeye can be found on the Releases page. Unpack the binary and you are good to go!

  • Build Binary from Source Code

git clone https://github.com/kubesphere/kubeye.git
cd kubeye 
make ke-linux

2、Perform operation

./ke audit --kubeconfig /home/ubuntu/.kube/config

3、(Optional) Install Node-problem-Detector in the inspection cluster

Note: The NPD module does not need to be installed When more detailed node information does not need to be probed.

./ke install npd --kubeconfig /home/ubuntu/.kube/config

What kubeye can do

  1. Core component detection in the cluster, including controller-manager, scheduler and ETCD exception detection.
  2. Node detection in the cluster, including Kubelet abnormalities, insufficient machine MEMORY/CPU/DISk resources, docker service exceptions.
  3. Pod detection int the cluster, including pod best practices, pod exceptions information.

Features

YES/NO CHECK ITEM Description
ETCDHealthStatus If ETCD is abnormal, displays dial tcp 192.168.13.8:2379: connect: connection refused
Controller-ManagerHealthStatus If Controller-Manager is abnormal, displays dial tcp 127.0.0.1:10252: connect: connection refused
ScheduleHealthStatus If Schedule is abnormal, displays dial tcp 127.0.0.1:10251: connect: connection refused
NodeMemory If the node is full of Memory, the node displays NotReady
DockerHealthStatus If docker is abnormal, displays cannot connect to the Docker daemon at unix:///var/run/docker.sock
NodeDisk If the node is full of Disk, displays FreeDiskSpaceFailed
KubeletHealthStatus If kubelet not work, the node displays NotReady
NodeCPU If the node CPU is always full, the node displays NotReady
NodeCorruptOverlay2 Overlay2 is not available
NodeKernelNULLPointer the node displays NotReady
NodeDeadlock A deadlock is a phenomenon in which two or more processes are waiting for each other as they compete for resources
NodeOOM Monitor processes that consume too much memory, especially those that consume a lot of memory very quickly, and the kernel kill them to prevent them from running out of memory
NodeExt4Error Ext4 mount error
NodeTaskHung Check to see if there is a process in state D for more than 120s
NodeUnregisterNetDevice Check corresponding net
NodeCorruptDockerImage Check docker image
NodeAUFSUmountHung Check storage
NodeDockerHung Docker hung, you can check docker log
PodSetLiveNessProbe No livenessProbe was declared
PodSetTagNotSpecified The mirror address does not declare tag or tag is latest
PodSetRunAsPrivileged Running a pod in a privileged mode means that the pod can access the hosts resources and kernel capabilities
PodSetImagePullBackOff Pod can't pull the image properly, so it can be pulled manually on the corresponding node
PodSetImageRegistry Checks if the image form is at the beginning of the corresponding harbor
PodSetCpuLimitsMissing No CPU Resource limit was declared
PodNoSuchFileOrDirectory Go into the container to see if the corresponding file exists
PodIOError This is usually due to file IO performance bottlenecks
PodNoSuchDeviceOrAddress Check corresponding net
PodInvalidArgument Check the storage
PodDeviceOrResourceBusy Check corresponding dirctory and PID
PodFileExists Check for existing files
PodTooManyOpenFiles The number of file /socket connections opened by the program exceeds the system set value
PodNoSpaceLeftOnDevice Check for disk and inode usage
NodeTokenExpired Token certificate expired
NodeApiServerExpired kube-apiserver certificate expired
NodeKubeletExpired Kubelet certificate expired
PodSetCpuRequestsMissing The CPU Resource Request value was not declared
PodSetHostIPCSet Set the hostIP
PodSetHostNetworkSet Set the hostNetwork
PodHostPIDSet Set the hostPID
PodMemoryRequestsMiss No memory Resource Request value is declared
PodSetHostPort Set the hostPort
PodSetMemoryLimitsMissing No memory Resource limit value is declared
PodNotReadOnlyRootFiles The file system is not set to read-only
PodSetPullPolicyNotAlways The mirror pull strategy is not always
PodSetRunAsRootAllowed Executed as a root account
PodDangerousCapabilities You have the dangerous option in capabilities such as ALL/SYS_ADMIN/NET_ADMIN
PodlivenessProbeMissing ReadinessProbe was not declared
privilegeEscalationAllowed Privilege escalation is allowed

Results Example

root@node1:/home/ubuntu/go/src/kubeye# ./ke audit --kubeconfig /home/ubuntu/config
NODENAME   SEVERITY   HEARTBEATTIME               REASON              MESSAGE
node18     danger     2020-11-19T10:32:03+08:00   NodeStatusUnknown   Kubelet stopped posting node status.
node19     danger     2020-11-19T10:31:37+08:00   NodeStatusUnknown   Kubelet stopped posting node status.
node2      danger     2020-11-19T10:31:14+08:00   NodeStatusUnknown   Kubelet stopped posting node status.
node3      danger     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   danger     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      danger     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        NODENAME                                EVENTTIME                   REASON                MESSAGE
default          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          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          nginx-b8ffcf679-q4n9v.16491643e6b68cd7  2020-11-27T17:09:24+08:00   Failed                Error: ImagePullBackOff
default          node3.164b5861e041a60e                  2020-11-27T19:01:09+08:00   SystemOOM             System OOM encountered, victim process: stress, pid: 16713
default          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   workloads-1606467120.164b519ca8c67416   2020-11-27T16:57:05+08:00   DeadlineExceeded      Job was active longer than specified deadline
kube-system      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      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      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        NAME                      KIND         TIME                        MESSAGE
kube-system      node-problem-detector     DaemonSet    2020-11-27T17:09:59+08:00   [livenessProbeMissing runAsPrivileged]
kube-system      calico-node               DaemonSet    2020-11-27T17:09:59+08:00   [runAsPrivileged cpuLimitsMissing]
kube-system      nodelocaldns              DaemonSet    2020-11-27T17:09:59+08:00   [cpuLimitsMissing runAsPrivileged]
default          nginx                     Deployment   2020-11-27T17:09:59+08:00   [cpuLimitsMissing livenessProbeMissing tagNotSpecified]
insights-agent   workloads                 CronJob      2020-11-27T17:09:59+08:00   [livenessProbeMissing]
insights-agent   cronjob-executor          Job          2020-11-27T17:09:59+08:00   [livenessProbeMissing]
kube-system      calico-kube-controllers   Deployment   2020-11-27T17:09:59+08:00   [cpuLimitsMissing livenessProbeMissing]
kube-system      coredns                   Deployment   2020-11-27T17:09:59+08:00   [cpuLimitsMissing]   

Custom check

  • Add custom npd rule methods
1. Deploy npd, ./ke add npd --kubeconfig /home/ubuntu/.kube/config
2. Ddit node-problem-detector-config configMap, such as: kubectl edit cm -n kube-system node-problem-detector-config
3. Add exception log information under the rule of configMap, rules follow regular expressions.
  • Add custom best practice configuration
1. Use the -f parameter and file name config.yaml.
./ke audit -f /home/ubuntu/go/src/kubeye/examples/tmp/config.yaml --kubeconfig /home/ubuntu/.kube/config
2. config.yaml example, follow the JSON syntax.
ubuntu@node1:~/go/src/kubeye/examples/tmp$ cat config.yaml
checks:
  imageRegistry: warning

customChecks:
  imageRegistry:
    successMessage: Image comes from allowed registries
    failureMessage: Image should not be from disallowed registry
    category: Images
    target: Container
    schema:
      '$schema': http://json-schema.org/draft-07/schema
      type: object
      properties:
        image:
          type: string
          not:
            pattern: ^quay.io

ubuntu@node1:~/go/src/kubeye/examples/tmp$./ke audit -f /home/ubuntu/go/src/kubeye/examples/tmp/config.yaml
NAMESPACE     NAME                      KIND         TIME                        MESSAGE
default       nginx                     Deployment   2020-11-27T17:18:31+08:00   [imageRegistry]
kube-system   node-problem-detector     DaemonSet    2020-11-27T17:18:31+08:00   [livenessProbeMissing runAsPrivileged]
kube-system   calico-node               DaemonSet    2020-11-27T17:18:31+08:00   [cpuLimitsMissing runAsPrivileged]
kube-system   calico-kube-controllers   Deployment   2020-11-27T17:18:31+08:00   [cpuLimitsMissing livenessProbeMissing]
kube-system   nodelocaldns              DaemonSet    2020-11-27T17:18:31+08:00   [runAsPrivileged cpuLimitsMissing]
default       nginx                     Deployment   2020-11-27T17:18:31+08:00   [livenessProbeMissing cpuLimitsMissing]
kube-system   coredns                   Deployment   2020-11-27T17:18:31+08:00   [cpuLimitsMissing]