Beyla 网络指标快速入门
Beyla 可以在任何环境(物理主机、虚拟主机或容器)中生成网络指标。建议使用 Kubernetes 环境,因为 Beyla 能够使用源和目标 Kubernetes 实体的元数据来修饰每个指标。
注意
本教程介绍了如何在 Kubernetes 中从零开始部署 Beyla。要使用 Helm,请参考 使用 Helm 在 Kubernetes 中部署 Beyla 文档。
部署 Beyla 并启用网络指标
要启用网络指标,请在 Beyla 配置中设置以下选项
network:
enable: true
或者导出以下环境变量
export BEYLA_NETWORK_METRICS=true
网络指标需要使用 Kubernetes 元数据进行修饰。要启用此功能,请在 Beyla 配置中设置以下选项
attributes:
kubernetes:
enable : true
或者导出以下环境变量
export BEYLA_KUBE_METADATA_ENABLE=true
最后,网络指标需要具有以下功能的管理 sudo
权限
- Kubernetes 需要完全特权访问,即
root
、sudo
或privileged: true
- 以下能力:
BPF
,PERFMON
,NET_ADMIN
,SYS_RESOURCE
要了解有关 Beyla 配置的更多信息,请参阅 Beyla 配置文档。
配置示例
以下 YAML 配置提供了用于网络指标的简单 Beyla 部署
apiVersion: v1
kind: ServiceAccount
metadata:
name: beyla
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: beyla
rules:
- apiGroups: [ "apps" ]
resources: [ "replicasets" ]
verbs: [ "list", "watch" ]
- apiGroups: [ "" ]
resources: [ "pods", "services", "nodes" ]
verbs: [ "list", "watch" ]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: beyla
subjects:
- kind: ServiceAccount
name: beyla
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: beyla
---
apiVersion: v1
kind: ConfigMap
metadata:
name: beyla-config
data:
beyla-config.yml: |
attributes:
kubernetes:
enable: true
network:
enable: true
print_flows: true
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: beyla
spec:
selector:
matchLabels:
instrumentation: beyla
template:
metadata:
labels:
instrumentation: beyla
spec:
serviceAccountName: beyla
hostNetwork: true
volumes:
- name: beyla-config
configMap:
name: beyla-config
containers:
- name: beyla
image: grafana/beyla:main
securityContext:
privileged: true
volumeMounts:
- mountPath: /config
name: beyla-config
env:
- name: BEYLA_CONFIG_PATH
value: "/config/beyla-config.yml"
请注意此部署配置的以下要求
- 容器镜像使用最新的开发中镜像
grafana/beyla:main
。 - Beyla 需要以 DaemonSet 方式运行,因为它每个节点只需要一个 Beyla 实例
- 为了监听主机上的网络数据包,Beyla 需要
hostNetwork: true
权限 - 为了用 Kubernetes 元数据修饰网络指标,请创建一个具有 ReplicaSets、Pods、Services 和 Nodes 的
list
和watch
权限的ClusterRole
和ClusterRoleBinding
该配置未设置用于导出指标的端点。相反,trace_printer: text
选项将捕获的网络流输出到标准输出。
使用 kubectl logs
查看网络流条目,例如
network_flow: beyla.ip=172.18.0.2 iface= direction=255 src.address=10.244.0.4 dst.address=10.96.0.1
src.name=local-path-provisioner-7577fdbbfb-g6b7d dst.name=kubernetes
k8s.src.node.name=kind-control-plane k8s.dst.namespace=default k8s.dst.name=kubernetes
k8s.dst.owner.type=Service k8s.src.namespace=local-path-storage
k8s.src.name=local-path-provisioner-7577fdbbfb-g6b7d k8s.src.type=Pod
k8s.src.owner.name=local-path-provisioner k8s.src.owner.type=Deployment
k8s.dst.type=Service k8s.dst.owner.name=kubernetes
有关所用属性的更多信息,请参阅网络指标文档。
导出 OpenTelemetry 指标
在确认网络指标正在收集后,将 Beyla 配置为将指标以 OpenTelemetry 格式导出到 OpenTelemetry 端点。
注意
目前不支持将网络指标导出到 Prometheus。
Beyla 适用于任何 OpenTelemetry 端点。本快速入门使用 Grafana Cloud 中的 OpenTelemetry 端点。您可以在 Grafana 网站上获取免费的 Grafana Cloud 账户。
要获取您技术栈的 OpenTelemetry 端点,请登录 Grafana Cloud Portal,然后在 OpenTelemetry 部分下点击 Configure。
在 Password / API token 下,点击 Generate now 并按照说明创建一个 API token。
Environment Variables 部分填充了一组标准 OpenTelemetry 环境变量,这些变量为 Beyla 提供了连接端点和凭据信息。
复制 OTEL_EXPORTER_OTLP_HEADERS
环境变量的值,并将其作为 Kubernetes secret 粘贴(并部署)。
apiVersion: v1
kind: Secret
metadata:
name: grafana-secret
type: Opaque
stringData:
otlp-headers: "Authorization=Basic MzQ3NTp....."
现在添加 OTEL_EXPORTER_OTLP_HEADERS
并将此 secret 引用为变量值。
同时将 OTEL_EXPORTER_OTLP_ENDPOINT
及其值作为环境变量添加到 Kubernetes manifest 中 Beyla 容器的 env 部分。本文档开头 manifest 中 beyla
容器的 env
部分应如下所示:
env:
- name: BEYLA_CONFIG_PATH
value: "/config/beyla-config.yml"
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "https://otlp-gateway-prod-eu-west-0.grafana.net/otlp"
- name: OTEL_EXPORTER_OTLP_HEADERS
valueFrom:
secretKeyRef:
key: otlp-headers
name: grafana-secret
选择指标属性以减少基数
默认情况下,Beyla 在 beyla.network.flow.bytes
指标中包含以下属性
k8s.src.owner.name
k8s.src.namespace
k8s.dst.owner.name
k8s.dst.namespace
k8s.cluster.name
Beyla 只包含可用属性的一个子集,以避免导致指标存储中出现基数爆炸,尤其当某些属性(如 src.address
或 dst.address
)捕获了外部流量的 IP 地址时。
attributes.select.<metric-name>.include
YAML 子节可以用于选择要报告的属性
network:
enable: true
attributes:
kubernetes:
enable: true
select:
beyla.network.flow.bytes:
include:
- k8s.src.owner.name
- k8s.src.namespace
- k8s.dst.owner.name
- k8s.dst.namespace
上面的示例将按源和目标 Kubernetes 所有者(Deployment、DaemonSet、StatefulSet、ReplicaSet)聚合 beyla.network.flow.bytes
的值,从而避免了更细粒度的属性,例如 Pod 名称或 IP 地址。
按 CIDR 对 IP 地址分组
报告包含 IP 地址(src.address
和 dst.address
)的指标属性可能导致基数爆炸,但它可能是获取有关网络和子网如何通信的更清晰视图的有用网络级信息。
network
中的 cidrs
YAML 子节(或 BEYLA_NETWORK_CIDRS
环境变量)接受 CIDR 表示法的子网列表,支持 IPv4 和 IPv6 格式。
cidrs
部分的存在会保留 src.address
和 dst.address
字段不变,并添加 src.cidr
和 dst.cidr
属性。请不要忘记将它们添加到 attributes.select
部分
network:
enable: true
cidrs:
- 10.10.0.0/24
- 10.0.0.0/8
- 10.30.0.0/16
attributes:
kubernetes:
enable: true
select:
beyla_network_flow_bytes:
include:
- k8s.src.owner.name
- k8s.src.namespace
- k8s.dst.owner.name
- k8s.dst.namespace
- src.cidr
- dst.cidr