English | 中文
KubeEye 旨在发现 Kubernetes 上的各种问题,比如应用配置错误(使用 OPA )、集群组件不健康和节点问题(使用Node-Problem-Detector)。除了预定义的规则,它还支持自定义规则。
KubeEye 通过调用Kubernetes API,通过匹配资源中的关键字和容器语法的规则匹配来获取集群诊断数据,详见架构图。
-
机器上安装 KubeEye
-
从 Releases 中下载预构建的可执行文件。
-
或者你也可以从源代码构建
提示:构建完成后将会在 /usr/local/bin/ 目录下生成 kubeeye 文件。
git clone https://github.com/kubesphere/kubeeye.git cd kubeeye make install
-
-
[可选] 安装 Node-problem-Detector 注意:这一行将在你的集群上安装 npd,只有当你想要详细的报告时才需要。
kubeeye install -e npd
-
KubeEye 执行
root@node1:# kubeeye audit
NAMESPACE NAME KIND MESSAGE
default nginx Deployment [nginx CPU limits should be set. nginx CPU requests should be set. nginx image tag not specified, do not use 'latest'. nginx livenessProbe should be set. nginx memory limits should be set. nginx memory requests should be set. nginx priorityClassName can be set. nginx root file system should be set read only. nginx readinessProbe should be set. nginx runAsNonRoot can be set.]
default testcronjob CronJob [testcronjob CPU limits should be set. testcronjob CPU requests should be set. testcronjob allowPrivilegeEscalation should be set false. testcronjob have HighRisk capabilities. testcronjob hostIPC should not be set. testcronjob hostNetwork should not be set. testcronjob hostPID should not be set. testcronjob hostPort should not be set. testcronjob imagePullPolicy should be set 'Always'. testcronjob image tag not specified, do not use 'latest'. testcronjob have insecure capabilities. testcronjob livenessProbe should be set. testcronjob memory limits should be set. testcronjob memory requests should be set. testcronjob priorityClassName can be set. testcronjob privileged should be set false. testcronjob root file system should be set read only. testcronjob readinessProbe should be set.]
kube-system testrole Role [testrole can impersonate user. testrole can delete resources. testrole can modify workloads.]
testclusterrole ClusterRole [testclusterrole can impersonate user. testclusterrole can delete resource. testclusterrole can modify workloads.]
NAMESPACE SEVERITY PODNAME EVENTTIME REASON MESSAGE
kube-system Warning vpnkit-controller.16acd7f7536c62e8 2021-10-11T15:55:08+08:00 BackOff Back-off restarting failed container
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
您可以参考常见FAQ内容来优化您的集群。
- KubeEye 根据行业最佳实践审查你的工作负载 yaml 规范,帮助你使你的集群稳定。
- KubeEye 可以发现你的集群控制平面的问题,包括 kube-apiserver/kube-controller-manager/etcd 等。
- KubeEye 可以帮助你检测各种节点问题,包括内存/CPU/磁盘压力,意外的内核错误日志等。
是/否 | 检查项 | 描述 |
---|---|---|
✅ | PrivilegeEscalationAllowed | 允许特权升级 |
✅ | CanImpersonateUser | role/clusterrole 有伪装成其他用户权限 |
✅ | CanDeleteResources | role/clusterrole 有删除 kubernetes 资源权限 |
✅ | CanModifyWorkloads | role/clusterrole 有修改 kubernetes 资源权限 |
✅ | NoCPULimits | 资源没有设置 CPU 使用限制 |
✅ | NoCPURequests | 资源没有设置预留 CPU |
✅ | HighRiskCapabilities | 开启了高危功能,例如 ALL/SYS_ADMIN/NET_ADMIN |
✅ | HostIPCAllowed | 开启了主机 IPC |
✅ | HostNetworkAllowed | 开启了主机网络 |
✅ | HostPIDAllowed | 开启了主机PID |
✅ | HostPortAllowed | 开启了主机端口 |
✅ | ImagePullPolicyNotAlways | 镜像拉取策略不是 always |
✅ | ImageTagIsLatest | 镜像标签是 latest |
✅ | ImageTagMiss | 镜像没有标签 |
✅ | InsecureCapabilities | 开启了不安全的功能,例如 KILL/SYS_CHROOT/CHOWN |
✅ | NoLivenessProbe | 没有设置存活状态检查 |
✅ | NoMemoryLimits | 资源没有设置内存使用限制 |
✅ | NoMemoryRequests | 资源没有设置预留内存 |
✅ | NoPriorityClassName | 没有设置资源调度优先级 |
✅ | PrivilegedAllowed | 以特权模式运行资源 |
✅ | NoReadinessProbe | 没有设置就绪状态检查 |
✅ | NotReadOnlyRootFilesystem | 没有设置 root 文件系统为只读 |
✅ | NotRunAsNonRoot | 没有设置禁止以 root 用户启动进程 |
ETCDHealthStatus | etcd 是否正常运行,请检查 etcd 状态 | |
ControllerManagerHealthStatus | kube-controller-manager 是否正常运行,请检查 kube-controller-manager 状态 | |
SchedulerHealthStatus | kube-scheduler 是否正常运行,请检查 kube-scheduler 状态 | |
✅ | NodeMemory | 节点内存使用是否超过阀值,请检查节点内存使用情况 |
✅ | DockerHealthStatus | docker 是否正常运行,请检查 docker 状态 |
✅ | NodeDisk | 节点磁盘使用是否超过阀值,请检查节点磁盘使用情况 |
✅ | KubeletHealthStatus | kubelet 是否正常运行,请检查 kubelet 状态 |
✅ | NodeCPU | 节点 CPU 使用是否超过阀值,请检查节点 CPU 使用情况 |
✅ | NodeCorruptOverlay2 | Overlay2 不可用 |
✅ | NodeKernelNULLPointer | 节点未准备就绪 |
✅ | NodeDeadlock | 死锁是指两个或两个以上的进程在争夺资源时互相等待的现象 |
✅ | NodeOOM | 监控那些消耗过多内存的进程,尤其是那些消耗大量内存非常快的进程,内核会杀掉它们,防止它们耗尽内存 |
✅ | NodeExt4Error | Ext4 挂载失败 |
✅ | NodeTaskHung | 检查是否有持续超过120s的 D 状态进程 |
✅ | NodeUnregisterNetDevice | 检查节点网络 |
✅ | NodeCorruptDockerImage | 检查 docker 镜像 |
✅ | NodeAUFSUmountHung | 检查存储 |
✅ | NodeDockerHung | Docker hang 住, 请检查 docker 的日志 |
✅ | PodSetImagePullBackOff | Pod 无法正确拉出镜像,因此可以在相应节点上手动拉出镜像 |
✅ | PodNoSuchFileOrDirectory | 进入容器查看相应文件是否存在 |
✅ | PodIOError | 这通常是由于文件 IO 性能瓶颈 |
✅ | PodNoSuchDeviceOrAddress | 检查网络 |
✅ | PodInvalidArgument | 检查存储 |
✅ | PodDeviceOrResourceBusy | 检查对应的目录和 PID |
✅ | PodFileExists | 检查文件 |
✅ | PodTooManyOpenFiles | 程序打开的文件/套接字连接数超过系统设置值 |
✅ | PodNoSpaceLeftOnDevice | 检查磁盘和索引节点的使用情况 |
✅ | NodeApiServerExpiredPeriod | 将检查 ApiServer 证书的到期日期少于30天 |
NodeNotReadyAndUseOfClosedNetworkConnection | 节点网络连接异常 | |
NodeNotReady | 无法启动 ContainerManager 无法设置属性 TasksAccounting 或未知属性 |
未标注的项目正在开发中
嵌入式规则,将规则打包至kubeeye中,方便使用.
Function 检查规则,提供更加定制化的规则检查,如使用shell,调用第三方接口,都可以封入Function,按照约定的格式返回输出,即可在报表中统一展示。
命令和规则分离式管理,指定外部OPA规则目录,kubeeye加载目录中的规则并且和默认规则进行合并。
- 添加OPA规则文件
opa package Note: 包名必须是下面中的一个
type | package |
---|---|
RBAC | kubeeye_RBAC_rego |
workloads | kubeeye_workloads_rego |
nodes | kubeeye_nodes_rego |
events | kubeeye_events_rego |
- 创建 OPA 规则存放目录
mkdir opa
- 添加自定义 OPA 规则文件
注意:为检查工作负载设置的 OPA 规则 package 名称必须是 kubeeye_workloads_rego, 为检查 RBAC 设置的 OPA 规则 package 名称必须是 kubeeye_RBAC_rego,为检查节点设置的 OPA 规则 package 名称必须是 kubeeye_nodes_rego
- 以下为检查镜像仓库地址规则,保存以下规则到规则文件 imageRegistryRule.rego
package kubeeye_workloads_rego
deny[msg] {
resource := input
type := resource.Object.kind
resourcename := resource.Object.metadata.name
resourcenamespace := resource.Object.metadata.namespace
workloadsType := {"Deployment","ReplicaSet","DaemonSet","StatefulSet","Job"}
workloadsType[type]
not workloadsImageRegistryRule(resource)
msg := {
"Name": sprintf("%v", [resourcename]),
"Namespace": sprintf("%v", [resourcenamespace]),
"Type": sprintf("%v", [type]),
"Message": "ImageRegistryNotmyregistry"
}
}
workloadsImageRegistryRule(resource) {
regex.match("^myregistry.public.kubesphere/basic/.+", resource.Object.spec.template.spec.containers[_].image)
}
root:# kubeeye audit -p ./opa -f ~/.kube/config
NAMESPACE NAME KIND MESSAGE
default nginx1 Deployment [ImageRegistryNotmyregistry NotReadOnlyRootFilesystem NotRunAsNonRoot]
default nginx11 Deployment [ImageRegistryNotmyregistry PrivilegeEscalationAllowed HighRiskCapabilities HostIPCAllowed HostPortAllowed ImagePullPolicyNotAlways ImageTagIsLatest InsecureCapabilities NoPriorityClassName PrivilegedAllowed NotReadOnlyRootFilesystem NotRunAsNonRoot]
default nginx111 Deployment [ImageRegistryNotmyregistry NoCPULimits NoCPURequests ImageTagMiss NoLivenessProbe NoMemoryLimits NoMemoryRequests NoPriorityClassName NotReadOnlyRootFilesystem NoReadinessProbe NotRunAsNonRoot]