golang基于eBPF实现低开销Kubernetes监控插件alaz的使用

Golang基于eBPF实现低开销Kubernetes监控插件Alaz的使用

Alaz - Anteon eBPF Agent for Kubernetes Monitoring

Anteon Kubernetes Monitoring Service Map

Anteon (formerly Ddosify) automatically generates Service Map of your K8s cluster without code instrumentation or sidecars with eBPF Agent Alaz. So you can easily find the bottlenecks in your system. Red lines indicate the high latency between services.

什么是Alaz?

Alaz是一个开源的Anteon eBPF代理,可以在不需要代码检测、sidecars或服务重启的情况下检查和收集Kubernetes(K8s)服务流量。这得益于其使用的eBPF技术。

Alaz可以创建一个服务地图,帮助识别黄金信号和问题,如:

  • K8s服务之间的高延迟
  • 检测5xx HTTP状态码
  • 检测空闲/僵尸服务
  • 检测慢SQL查询

此外,Anteon跟踪并显示集群实例CPU、内存、磁盘和网络使用情况的实时数据。所有仪表板都是开箱即用的,您可以基于这些指标值创建警报。

Anteon Kubernetes Monitoring Metrics

Anteon tracks and displays live data on your cluster instances CPU, memory, disk, and network usage.

特性

低开销 无需代码检测、sidecars或服务重启即可检查和收集K8s服务流量。

轻松 Anteon将创建服务地图和指标仪表板,帮助识别黄金信号和问题,如高延迟、5xx错误、僵尸服务。

Prometheus兼容 通过Prometheus节点导出器收集系统信息和资源,该导出器在代理上随时可用。

云或本地 将指标导出到Anteon Cloud,或在您的基础设施中安装Anteon Self-Hosted,并根据您的需求管理一切。

测试和观察 Anteon性能测试和Alaz可以协同工作。您可以启动负载测试并同时监控您的系统。这将帮助您立即发现性能问题。

异常警报 如果您的Kubernetes(K8s)集群中发生异常情况,如CPU使用率突然增加,Anteon会立即向您的Slack发送警报。

平台支持 支持Arm64和x86_64架构。

🚀 快速开始

要使用Alaz,您需要有一个Anteon Cloud账户或安装Anteon Self-Hosted

☁️ 对于Anteon Cloud

  1. 注册一个Anteon Cloud账户
  2. Observability页面上添加一个集群。您将收到一个监控ID和说明
  3. 使用您收到的说明在您的Kubernetes集群上运行代理。Kubernetes部署有两种选择:

使用kubectl

# 替换<MONITORING_ID>为从Anteon Cloud获取的监控ID。将XXXXX替换为您的监控ID。
MONITORING_ID=XXXXX
curl -sSL https://raw.githubusercontent.com/getanteon/alaz/master/resources/alaz.yaml -o alaz.yaml
sed -i"" -e "s/<MONITORING_ID>/$MONITORING_ID/g" alaz.yaml
kubectl create namespace anteon
kubectl apply -f alaz.yaml

使用Helm

# 替换<MONITORING_ID>为从Anteon Cloud获取的监控ID。将XXXXX替换为您的监控ID。
MONITORING_ID=XXXXX
helm repo add anteon https://getanteon.github.io/anteon-helm-charts/
helm repo update
kubectl create namespace anteon
helm upgrade --install --namespace anteon alaz anteon/alaz --set monitoringID=$MONITORING_ID

然后您可以在Anteon Observability仪表板上查看指标和Kubernetes服务地图。

🏠 对于Anteon自托管

  1. 安装Anteon Self-Hosted
  2. 在您自托管的前端的Observability页面上添加一个集群。您将收到一个监控ID和说明
  3. 使用您收到的说明在您的Kubernetes集群上运行代理

注意:安装Anteon Self-Hosted后,您将有一个Nginx反向代理的Anteon Self-Hosted端点。Anteon Self-Hosted端点的基础URL将流量转发到前端。带有/api后缀的Anteon Self-Hosted端点的基础URL将流量转发到后端。因此,您需要将后端主机变量设置为http://<your-anteon-self-hosted-endpoint>/api

Kubernetes部署有两种选择:

使用kubectl

# 替换<MONITORING_ID>为从Anteon Cloud获取的监控ID。将XXXXX替换为您的监控ID。
MONITORING_ID=XXXXX
# 设置BACKEND_HOST为您的Anteon自托管端点。如果您的Anteon自托管端点是http://localhost:8014,则BACKEND_HOST=localhost:8014
BACKEND_HOST=XXXXX
curl -sSL https://raw.githubusercontent.com/getanteon/alaz/master/resources/alaz.yaml -o alaz.yaml
sed -i"" -e "s/<MONITORING_ID>/$MONITORING_ID/g" alaz.yaml
sed -i"" -e "s/https:\/\/api-alaz.getanteon.com:443/http:\\/\\/$BACKEND_HOST\\/api/g" alaz.yaml
kubectl create namespace anteon
kubectl apply -f alaz.yaml

使用Helm

# 替换<MONITORING_ID>为从Anteon Cloud获取的监控ID。将XXXXX替换为您的监控ID。
MONITORING_ID=XXXXX
# 设置BACKEND_HOST为您的Anteon自托管端点。如果您的Anteon自托管端点是http://localhost:8014,则BACKEND_HOST=http://localhost:8014/api
BACKEND_HOST=XXXXX
helm repo add anteon https://getanteon.github.io/anteon-helm-charts/
helm repo update
kubectl create namespace anteon
helm upgrade --install --namespace anteon alaz anteon/alaz --set monitoringID=$MONITORING_ID --set backendHost=$BACKEND_HOST

然后您可以在Anteon Self-Hosted Observability仪表板上查看指标和Kubernetes服务地图。

🧹 清理

要从您的Kubernetes集群中移除Alaz,请运行以下命令:

  • 对于Kubectl:
kubectl delete -f https://raw.githubusercontent.com/getanteon/alaz/master/resources/alaz.yaml
  • 对于Helm:
helm delete alaz --namespace anteon

支持的协议

Alaz支持以下协议:

  • HTTP
  • HTTPS (OpenSSL和Go TLS)
  • HTTP2
  • Postgres
  • RabbitMQ
  • gRPC
  • Redis (RESP)
  • Kafka
  • MySQL
  • MongoDB

其他协议将很快得到支持。如果您有希望支持的特定协议,请提交问题

限制

Alaz运行在Linux Kubernetes集群上。不支持Windows或MacOS。未来,我们计划支持Docker容器。

Alaz是一个使用CO-RE的eBPF应用程序。大多数最新的Linux发行版都支持CO-RE。为了使CO-RE工作,内核必须构建有BTF(bpf类型格式)信息。

您可以使用uname -r命令检查您的内核版本,并在btfhub上查看是否默认启用了btf。

加密库

这些是alaz用于捕获加密流量的库。

  • crypto/tls: 为了使Alaz捕获您的Go应用程序中的tls请求,您的go版本必须为1.17+,并且您的可执行文件必须包含调试信息。

  • OpenSSL: 支持动态链接到您的可执行文件中的OpenSSL共享对象。 支持的版本:1.0.21.1.13.*

贡献

欢迎对Alaz做出贡献!要贡献,请遵循以下步骤:

  1. Fork仓库
  2. 创建一个新分支:git checkout -b my-branch
  3. 进行更改并提交:git commit -am "Add some feature"
  4. 推送到分支:git push origin my-branch
  5. 提交pull request

交流

您可以加入我们的Discord服务器讨论问题、功能请求、反馈或其他任何内容。

许可证

Alaz根据AGPLv3许可


更多关于golang基于eBPF实现低开销Kubernetes监控插件alaz的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang基于eBPF实现低开销Kubernetes监控插件alaz的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


基于eBPF的Kubernetes低开销监控插件alaz实现

什么是alaz

alaz是一个基于eBPF技术实现的Kubernetes监控插件,它通过eBPF的内核级追踪能力,实现了对Kubernetes集群的低开销、高性能监控。相比传统基于cAdvisor或kubelet的监控方案,alaz提供了更细粒度的指标采集能力,同时保持了极低的开销。

alaz的核心优势

  1. 低开销:eBPF在内核执行,避免了上下文切换和数据拷贝
  2. 细粒度监控:可以追踪系统调用、网络流量、文件操作等
  3. 无侵入性:不需要修改应用代码或重启容器
  4. 实时性:能够提供近乎实时的监控数据

alaz的实现原理

alaz主要由以下几个组件构成:

  1. eBPF探针:负责在内核收集各类事件数据
  2. 用户空间收集器:将eBPF收集的数据聚合处理
  3. 指标暴露接口:提供Prometheus格式的指标

核心代码实现

以下是alaz核心功能的简化实现:

package main

import (
	"log"
	"net/http"

	"github.com/cilium/ebpf"
	"github.com/cilium/ebpf/link"
	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/promhttp"
)

// 定义eBPF map和程序
type bpfObjects struct {
	Counts *ebpf.Map `ebpf:"counts"`
	Prog   *ebpf.Program `ebpf:"prog"`
}

// 定义Prometheus指标
var (
	syscallCount = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Name: "alaz_syscall_count",
			Help: "Count of system calls",
		},
		[]string{"syscall", "pod", "namespace"},
	)
)

func init() {
	prometheus.MustRegister(syscallCount)
}

func main() {
	// 加载预编译的eBPF程序
	objs := bpfObjects{}
	if err := loadBpfObjects(&objs, nil); err != nil {
		log.Fatalf("loading objects: %v", err)
	}
	defer objs.Close()

	// 附加eBPF程序到tracepoint
	tp, err := link.Tracepoint("syscalls", "sys_enter_execve", objs.Prog, nil)
	if err != nil {
		log.Fatalf("opening tracepoint: %v", err)
	}
	defer tp.Close()

	// 启动goroutine从eBPF map读取数据
	go func() {
		var key uint32
		var value uint64
		iter := objs.Counts.Iterate()
		for iter.Next(&key, &value) {
			// 这里简化处理,实际应从map中获取更多上下文信息
			syscallCount.WithLabelValues("execve", "unknown", "unknown").Add(float64(value))
		}
	}()

	// 暴露Prometheus指标
	http.Handle("/metrics", promhttp.Handler())
	log.Fatal(http.ListenAndServe(":2112", nil))
}

eBPF程序示例

以下是配套的eBPF程序示例(用C编写):

#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>

struct {
	__uint(type, BPF_MAP_TYPE_HASH);
	__type(key, u32);
	__type(value, u64);
	__uint(max_entries, 1024);
} counts SEC(".maps");

SEC("tracepoint/syscalls/sys_enter_execve")
int tracepoint__syscalls__sys_enter_execve(struct trace_event_raw_sys_enter* ctx) {
	u32 key = 0; // 实际应用中这里应该使用更复杂的key
	u64 *val, zero = 0;
	
	val = bpf_map_lookup_or_try_init(&counts, &key, &zero);
	if (val) {
		(*val)++;
	}
	return 0;
}

char _license[] SEC("license") = "GPL";

部署到Kubernetes

alaz通常以DaemonSet形式部署到Kubernetes集群中,每个节点运行一个实例:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: alaz
spec:
  selector:
    matchLabels:
      app: alaz
  template:
    metadata:
      labels:
        app: alaz
    spec:
      hostPID: true
      containers:
      - name: alaz
        image: alaz:latest
        securityContext:
          privileged: true
          capabilities:
            add:
              - BPF
              - NET_ADMIN
              - SYS_ADMIN
        ports:
        - containerPort: 2112
          name: metrics

监控指标示例

alaz可以收集的指标类型包括:

  1. 系统调用统计
  2. 网络连接和流量
  3. 文件系统操作
  4. 进程创建/退出
  5. Kubernetes资源使用情况

性能优化技巧

  1. 采样率控制:对高频事件进行采样
  2. 过滤规则:只收集关键事件
  3. 聚合处理:在eBPF层进行初步聚合
  4. 批处理:减少用户空间和内核空间的上下文切换

总结

alaz通过eBPF技术实现了Kubernetes集群的低开销监控,相比传统方案具有明显优势。开发者可以根据实际需求扩展其功能,添加更多类型的监控指标。eBPF的强大能力使得我们可以在不影响应用性能的情况下,获取丰富的系统运行时信息。

回到顶部