golang实时监控与检测Kubernetes集群崩溃插件库kwatch的使用
Golang 实时监控与检测 Kubernetes 集群崩溃插件库 kwatch 的使用

kwatch 是一个帮助您监控 Kubernetes (K8s) 集群中所有变化,实时检测运行中应用程序崩溃,并即时向您的通信渠道(如 Slack、Discord 等)发布通知的工具。
⚡️ 快速入门
安装
使用 Helm
helm repo add kwatch https://kwatch.dev/charts
helm install [RELEASE_NAME] kwatch/kwatch --namespace kwatch --create-namespace --version 0.10.2
使用 kubectl
- 获取配置模板并添加您的配置:
curl -L https://raw.githubusercontent.com/abahmed/kwatch/v0.10.2/deploy/config.yaml -o config.yaml
- 编辑
config.yaml
文件并应用您的配置:
kubectl apply -f config.yaml
- 部署 kwatch:
kubectl apply -f https://raw.githubusercontent.com/abahmed/kwatch/v0.10.2/deploy/deploy.yaml
高级架构

配置
通用配置
参数 | 描述 |
---|---|
maxRecentLogLines |
可选的消息中最大日志行数,如果不提供将获取所有日志行 |
namespaces |
可选的要监视或禁止的命名空间列表,如果不提供将监视所有命名空间 |
reasons |
可选的要监视或禁止的原因列表,如果不提供将监视所有原因 |
ignoreFailedGracefulShutdown |
如果设置为 true,在关闭期间被强制终止的容器不会作为错误报告 |
ignoreContainerNames |
可选的要忽略的容器名称列表 |
ignorePodNames |
可选的要忽略的 Pod 名称正则表达式模式列表 |
IgnoreLogPatterns |
可选的要忽略的日志正则表达式模式列表 |
应用配置
参数 | 描述 |
---|---|
app.proxyURL |
用于除 Kubernetes 集群请求之外的传出 http(s) 请求 |
app.clusterName |
用于在通知中指示哪个集群有问题 |
app.disableStartupMessage |
如果设置为 true,欢迎消息将不会发送到通知渠道 |
app.logFormatter |
用于设置应用程序打印日志时的自定义格式化程序:text、json(默认:text) |
通知配置示例(Slack)
alert:
slack:
webhook: "https://hooks.slack.com/services/YOUR/WEBHOOK/PATH"
channel: "#alerts"
title: "Kubernetes Alert"
text: "Pod {{ .ObjectMeta.Name }} in namespace {{ .ObjectMeta.Namespace }} crashed!"
清理
kubectl delete -f https://raw.githubusercontent.com/abahmed/kwatch/v0.10.2/deploy/config.yaml
kubectl delete -f https://raw.githubusercontent.com/abahmed/kwatch/v0.10.2/deploy/deploy.yaml
Golang 示例代码
以下是一个使用 kwatch 库的简单 Go 示例:
package main
import (
"log"
"github.com/abahmed/kwatch"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
)
func main() {
// 创建 Kubernetes 客户端
config, err := rest.InClusterConfig()
if err != nil {
log.Fatalf("Error creating in-cluster config: %v", err)
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
log.Fatalf("Error creating clientset: %v", err)
}
// 创建 kwatch 配置
kwatchConfig := &kwatch.Config{
App: kwatch.AppConfig{
ClusterName: "my-cluster",
},
Alert: kwatch.AlertConfig{
Slack: kwatch.SlackConfig{
Webhook: "https://hooks.slack.com/services/YOUR/WEBHOOK/PATH",
Title: "Kubernetes Alert",
Text: "Pod {{ .ObjectMeta.Name }} in namespace {{ .ObjectMeta.Namespace }} crashed!",
},
},
}
// 初始化 kwatch
k, err := kwatch.New(clientset, kwatchConfig)
if err != nil {
log.Fatalf("Error creating kwatch instance: %v", err)
}
// 启动监控
if err := k.Start(); err != nil {
log.Fatalf("Error starting kwatch: %v", err)
}
// 阻塞主线程
select {}
}
通知示例图片



许可证
kwatch 使用 MIT 许可证
更多关于golang实时监控与检测Kubernetes集群崩溃插件库kwatch的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang实时监控与检测Kubernetes集群崩溃插件库kwatch的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用kwatch实时监控与检测Kubernetes集群崩溃
kwatch是一个开源的Kubernetes监控工具,专门用于实时检测和警报集群中的崩溃事件。它能够监控Pods、Deployments、StatefulSets等资源的状态变化,并在出现问题时立即通知管理员。
kwatch核心功能
- 实时监控Kubernetes资源状态
- 检测崩溃、OOMKilled、CrashLoopBackOff等事件
- 支持多种通知渠道(Slack、Email、Webhook等)
- 可自定义监控规则和警报阈值
安装kwatch
使用Helm安装
helm repo add kwatch https://kwatch.github.io/kwatch
helm install kwatch kwatch/kwatch -n kwatch --create-namespace
使用kubectl安装
kubectl apply -f https://raw.githubusercontent.com/kwatch/kwatch/main/deploy/kwatch.yaml
基本配置示例
下面是一个基本的kwatch配置示例,监控所有命名空间并发送Slack通知:
# kwatch-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: kwatch-config
namespace: kwatch
data:
config.yaml: |
# 监控所有命名空间
monitorAllNamespaces: true
# 通知配置
alert:
slack:
webhook: "https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK"
channel: "#k8s-alerts"
title: "🚨 K8s Crash Detected"
text: "**Cluster:** {{ .ClusterName }}\n**Namespace:** {{ .Namespace }}\n**Pod:** {{ .Pod }}\n**Container:** {{ .Container }}\n**Reason:** {{ .Reason }}\n**Events:**\n```\n{{ .Events }}\n```\n**Logs:**\n```\n{{ .Logs }}\n```"
应用配置:
kubectl apply -f kwatch-config.yaml
Golang集成示例
如果你想在自己的Golang应用中集成kwatch的功能,可以使用Kubernetes client-go库来监听事件。以下是一个简单的实现示例:
package main
import (
"context"
"log"
"time"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/cache"
"k8s.io/client-go/util/workqueue"
)
func main() {
// 创建Kubernetes客户端
config, err := rest.InClusterConfig()
if err != nil {
log.Fatalf("Error creating in-cluster config: %v", err)
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
log.Fatalf("Error creating clientset: %v", err)
}
// 创建工作队列
queue := workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter())
// 创建Pod事件监听器
podListWatcher := cache.NewFilteredListWatchFromClient(
clientset.CoreV1().RESTClient(),
"pods",
metav1.NamespaceAll,
func(options *metav1.ListOptions) {
// 可以在这里添加过滤条件
},
)
// 创建Informer
_, controller := cache.NewInformer(
podListWatcher,
&corev1.Pod{},
time.Second*30,
cache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) {
key, err := cache.MetaNamespaceKeyFunc(obj)
if err == nil {
queue.Add(key)
}
},
UpdateFunc: func(old, new interface{}) {
key, err := cache.MetaNamespaceKeyFunc(new)
if err == nil {
queue.Add(key)
}
},
DeleteFunc: func(obj interface{}) {
key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj)
if err == nil {
queue.Add(key)
}
},
},
)
// 启动控制器
stop := make(chan struct{})
defer close(stop)
go controller.Run(stop)
// 处理队列中的项目
for {
key, quit := queue.Get()
if quit {
break
}
// 处理事件
processPodEvent(clientset, key.(string))
queue.Done(key)
}
}
func processPodEvent(clientset *kubernetes.Clientset, key string) {
namespace, name, err := cache.SplitMetaNamespaceKey(key)
if err != nil {
log.Printf("Error splitting key: %v", err)
return
}
pod, err := clientset.CoreV1().Pods(namespace).Get(context.TODO(), name, metav1.GetOptions{})
if err != nil {
log.Printf("Error getting pod: %v", err)
return
}
// 检查Pod状态
for _, containerStatus := range pod.Status.ContainerStatuses {
if containerStatus.State.Waiting != nil {
reason := containerStatus.State.Waiting.Reason
if reason == "CrashLoopBackOff" || reason == "ErrImagePull" || reason == "ImagePullBackOff" {
log.Printf("Detected problematic pod: %s/%s, reason: %s", namespace, name, reason)
// 在这里可以添加通知逻辑
// sendAlert(namespace, name, reason)
}
}
}
}
高级配置
kwatch支持更复杂的配置,例如:
- 过滤特定命名空间:
monitorNamespaces:
- default
- production
- 忽略特定Pod:
ignorePods:
- name: ".*-debug-.*"
- namespace: "kube-system"
- 自定义警报规则:
rules:
- name: "high-cpu-usage"
condition: "cpu_usage > 90"
duration: "5m"
severity: "critical"
- 多通知渠道:
alert:
slack:
webhook: "slack-webhook-url"
email:
from: "alerts@example.com"
to: "admin@example.com"
smtpHost: "smtp.example.com"
smtpPort: 587
username: "user"
password: "pass"
最佳实践
- 合理设置警报阈值:避免警报疲劳,只对关键问题发出警报
- 分类处理警报:根据严重程度使用不同的通知渠道
- 定期检查配置:随着集群规模变化调整监控范围
- 结合日志收集:将kwatch与ELK或Loki等日志系统结合使用
- 测试警报系统:定期测试确保警报系统正常工作
kwatch为Kubernetes集群提供了轻量级但功能强大的监控解决方案,特别适合需要快速响应崩溃事件的场景。通过合理的配置和定制,可以显著提高集群的可靠性和运维效率。