KubeSphere 開源 KubeEye:Kubernetes 集羣自動巡檢工具

爲什麼開源 KubeEye

Kubernetes 作爲容器編排的事實標準,雖然架構優雅功能也非常強大,但是 Kubernetes 在日常運行過程中總會有一些疑難雜症和隱性的問題讓集羣管理員和 Yaml 工程師們非常頭疼,例如:

  • 硬件問題:如 CPU,內存或磁盤異常;
  • 內核問題:內核死鎖,文件系統損壞;
  • 容器運行時問題:運行時守護進程無響應;
  • ETCD 健康狀況異常
  • 應用容器配置 request、limit 的黑盒
  • Pod 各種疑難問題起不來
  • 證書即將過期
  • Docker 服務異常
  • OutOfMemory 存儲空間不足
  • ···

這樣的問題還有很多,並且這些隱性的集羣異常問題對集羣的控制面來說是不可見的,因此 Kubernetes 將繼續將 Pod 調度到異常的節點,進而造成集羣和運行的應用帶來非常大的安全與穩定性的風險

KubeSphere 團隊積累了來自社區用戶和商業客戶三年多的 Kubernetes 集羣生產環境運維經驗,精通集羣組件運行與排查原理,從而開發了一款集羣自動巡檢工具幫助用戶解決集羣日常運維的痛點。

KubeEye 是什麼

KubeEye 是一款開源的 Kubernetes 集羣自動巡檢工具,旨在自動檢測發現 Kubernetes 上的各種問題,比如應用配置錯誤、集羣組件不健康和節點問題,幫助集羣管理員更好地管理集羣降低風險。KubeEye 使用 Go 語言基於開源的 Polaris 和 Node-Problem-Detector 開發,內置了一系列異常檢測規則。並且,除了預定義的規則,KubeEye 還支持開發者自定義規則。

KubeEye 能做什麼

  • 發現與檢測 Kubernetes 集羣控制平面的問題,包括 kube-apiserver/kube-controller-manager/etcd 等;
  • 幫助你檢測 Kubernetes 的各種節點問題,包括內存/CPU/磁盤壓力,意外的內核錯誤日誌等;
  • 根據行業最佳實踐驗證你的工作負載 yaml 規範,幫助你使你的集羣穩定。

KubeEye 架構

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

  • 克隆 KubeEye 倉庫,然後安裝 KubeEye:

git clone https://github.com/kubesphere/kubeeye.gitcd kubeeye make install
    還可以從 GitHub Releases 中下載預構建的可執行文件,release 地址參見文末,或者從源代碼構建。
  • [可選] 安裝 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 refused
NAMESPACE 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.29

NAMESPACE 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 文檔鏈接來進一步優化您的 Kubernetes集羣。

添加自定義檢查規則

除了上述預置的巡檢項目與規則,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/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

  • 支持更細粒度的巡檢項,例如 Kubernetes 集羣響應速度慢
  • 支持對 KubeSphere 自身組件如 DevOps、微服務治理
  • 對集羣 網絡、存儲等組件的狀態檢測

你還希望 KubeEye 提供什麼樣的特性呢?歡迎來 Github 提交建議或需求,我們歡迎任何形式的 PR、Issue、Star 和 Fork!

👩‍💻 GitHub 地址https://github.com/kubesphere/kubeeye

KubeEye 開源社羣邀您加入:

參考鏈接

  • KubeEye Releasehttps://github.com/kubesphere/kubeeye/releases

  • KubeEye FAQ 文檔https://github.com/kubesphere/kubeeye/blob/main/docs/FAQ.md

  • Node-Problem-Detector:

    https://github.com/kubernetes/node-problem-detector

 KubeSphere

KubeSphere (https://kubesphere.io)是在 Kubernetes 之上構建的開源容器混合雲,提供全棧的 IT 自動化運維的能力,簡化企業的 DevOps 工作流。

KubeSphere 已被 Aqara 、紫金保險、中通、中國人保壽險、中國太平保險、中移金科、Radore、ZaloPay 等海內外數千家企業採用。KubeSphere 提供了開發者友嚮導式操作界面和豐富的企業級功能,包括Kubernetes DevOps (CI/CD) (Service Mesh)、審計事件、GPU support 等功能,幫助企業快速構建一個強大和功能豐富的容器雲平臺。

✨ GitHub :https://github.com/kubesphere
💻 官網(中國站) :https://kubesphere.com.cn
👨‍💻‍  微信羣:請搜索添加羣助手微信號  kubesphere

本文分享自微信公衆號 - KubeSphere(gh_4660e44db839)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章