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

  1. 获取配置模板并添加您的配置:
curl -L https://raw.githubusercontent.com/abahmed/kwatch/v0.10.2/deploy/config.yaml -o config.yaml
  1. 编辑 config.yaml 文件并应用您的配置:
kubectl apply -f config.yaml
  1. 部署 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核心功能

  1. 实时监控Kubernetes资源状态
  2. 检测崩溃、OOMKilled、CrashLoopBackOff等事件
  3. 支持多种通知渠道(Slack、Email、Webhook等)
  4. 可自定义监控规则和警报阈值

安装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支持更复杂的配置,例如:

  1. 过滤特定命名空间:
monitorNamespaces:
  - default
  - production
  1. 忽略特定Pod:
ignorePods:
  - name: ".*-debug-.*"
  - namespace: "kube-system"
  1. 自定义警报规则:
rules:
  - name: "high-cpu-usage"
    condition: "cpu_usage > 90"
    duration: "5m"
    severity: "critical"
  1. 多通知渠道:
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"

最佳实践

  1. 合理设置警报阈值:避免警报疲劳,只对关键问题发出警报
  2. 分类处理警报:根据严重程度使用不同的通知渠道
  3. 定期检查配置:随着集群规模变化调整监控范围
  4. 结合日志收集:将kwatch与ELK或Loki等日志系统结合使用
  5. 测试警报系统:定期测试确保警报系统正常工作

kwatch为Kubernetes集群提供了轻量级但功能强大的监控解决方案,特别适合需要快速响应崩溃事件的场景。通过合理的配置和定制,可以显著提高集群的可靠性和运维效率。

回到顶部