DataKit Operator 注入 Flameshot¶
Flameshot 是 DataKit-Operator 引入的性能分析工具,用于替代原有的 Profiler(async-profiler、py-spy 等)。
sequenceDiagram
autonumber
box User pod
participant container as 业务容器
participant flameshot as Flameshot sidecar
end
participant opr as DataKit Operator
participant dk as DataKit
opr ->> flameshot: 注入 Flameshot
alt 目标容器资源阈值超限
flameshot ->> container: 立即采集容器 profiling
else
flameshot ->> container: 定期采集容器 profiling
end
flameshot ->> dk: 上报 Profiling
前置条件¶
- 集群已安装 DataKit。
- 开启 profile 采集器。
- (可选)如需使用 Prometheus Annotations 自动注入功能,需要开启 DataKit 的 KubernetesPrometheus 采集器,并配置
EnableDiscoveryOfPrometheusPodAnnotations = true启用 Pod Annotations 自动发现功能。
使用说明¶
- 在目标 Kubernetes 集群,下载和安装 DataKit-Operator
- 在 DataKit Operator 配置中设置
flameshots数组,配置namespace_selectors/label_selectors匹配规则和processes字段指定要监控的进程。 - (可选)在 Deployment 添加指定 Annotation
admission.datakit/flameshot.enabled: "true",允许注入 Flameshot(如果设置为"false"则会禁用注入)。
Flameshot 配置示例:
{
"admission_inject_v2": {
"flameshots": [
{
"namespace_selectors": [],
"label_selectors": [],
"image": "pubrepo.guance.com/datakit/flameshot:",
"envs": {
"FLAMESHOT_DATAKIT_ADDR": "http://datakit-service.datakit:9529/profiling/v1/input",
"FLAMESHOT_MONITOR_INTERVAL": "10s",
"FLAMESHOT_LOG_LEVEL": "info",
"FLAMESHOT_PROFILING_PATH": "/flameshot-data",
"FLAMESHOT_LOG_PATH": "/var/log/flameshot.log",
"FLAMESHOT_HTTP_LOCAL_IP": "{fieldRef:status.podIP}",
"FLAMESHOT_HTTP_LOCAL_PORT": "8089",
"FLAMESHOT_SERVICE": "{fieldRef:metadata.labels['app']}",
"FLAMESHOT_TAGS": "pod_name:$(POD_NAME),pod_namespace:$(POD_NAMESPACE),host:$(NODE_NAME)"
},
"resources": {
"requests": {
"cpu": "100m",
"memory": "128Mi"
},
"limits": {
"cpu": "200m",
"memory": "256Mi"
}
},
"processes": "",
"enable_prometheus_annotations": true
}
]
}
}
配置字段说明:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
namespace_selectors |
array | 否 | 命名空间选择器数组,支持正则表达式匹配 |
label_selectors |
array | 否 | 标签选择器数组,使用 Kubernetes Label Selector 语法 |
image |
string | 是 | Flameshot 容器镜像地址 |
envs |
object | 否 | 环境变量配置,支持 Downward API |
resources |
object | 否 | 资源限制配置(requests 和 limits) |
processes |
string | 是 | 进程监控配置(JSON 字符串),会作为 FLAMESHOT_PROCESSES 环境变量注入到 Flameshot 容器中。格式请参考 Flameshot 相关文档 |
enable_prometheus_annotations |
boolean | 否 | 是否自动添加 Prometheus 相关 Annotations。在默认配置模板中为 true,如果用户自定义配置且不设置该字段,则默认为 false。如果 Pod 已存在任意 prometheus.io/ 开头的 Annotation,则不会注入 |
Important
重要说明:processes 字段是一个 JSON 字符串,该值会直接作为 FLAMESHOT_PROCESSES 环境变量注入到 Flameshot 容器中。processes 字段的格式和含义请参考 Flameshot 相关文档。如果 processes 为空,Flameshot 注入将被跳过。
环境变量¶
| 环境变量名 | 说明 |
|---|---|
FLAMESHOT_DATAKIT_ADDR |
DataKit profiling 接收地址,例如 http://datakit-service.datakit:9529/profiling/v1/input |
FLAMESHOT_MONITOR_INTERVAL |
监控间隔,例如 10s |
FLAMESHOT_LOG_LEVEL |
日志级别,例如 info |
FLAMESHOT_PROFILING_PATH |
Profiling 数据存储路径,例如 /flameshot-data |
FLAMESHOT_LOG_PATH |
日志文件路径,例如 /var/log/flameshot.log |
FLAMESHOT_HTTP_LOCAL_IP |
HTTP 服务本地 IP,通常通过 Downward API 注入,例如 {fieldRef:status.podIP} |
FLAMESHOT_HTTP_LOCAL_PORT |
HTTP 服务端口,例如 8089 |
FLAMESHOT_PROCESSES |
进程监控配置(由 processes 字段自动注入),JSON 字符串格式 |
Flameshot 自身直播采集¶
当 enable_prometheus_annotations 设置为 true 时(在默认配置模板中为 true),DataKit-Operator 会自动为注入 Flameshot 的 Pod 添加以下 Prometheus 相关 Annotations,便于采集 Flameshot 的自身指标(通过 DataKit 的 KubernetesPrometheus 采集):
prometheus.io/scrape: "true":标识该 Pod 需要被采集prometheus.io/port: "<port>":指标暴露端口,取值来自环境变量FLAMESHOT_HTTP_LOCAL_PORT(例如"8089")prometheus.io/scheme: "http":指标采集协议prometheus.io/path: "/metrics":指标路径prometheus.io/param_measurement: "flameshot":指定 measurement 名称
Warning
- 如果 Pod 已存在任意一个
prometheus.io/开头的 Annotation,DataKit-Operator 将不会注入上述 Prometheus Annotations,避免覆盖已有的指标采集配置 - 要使用此功能,需要在 DataKit 中开启 KubernetesPrometheus 采集器,并配置
EnableDiscoveryOfPrometheusPodAnnotations = true启用 Pod Annotations 自动发现功能
用例¶
Warning
- 仅添加
admission.datakit/flameshot.enabled: "true"Annotation 不足以触发注入,还需要在 DataKit-Operator 配置中设置匹配的flameshots规则(包括namespace_selectors/label_selectors和processes字段) - 如果
processes字段为空,注入将被跳过。
下面是一个 Deployment 示例,给 Deployment 创建的所有 Pod 注入 Flameshot(前提是 DataKit-Operator 配置中已设置匹配的规则):
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
labels:
app: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
annotations:
admission.datakit/flameshot.enabled: "true"
spec:
containers:
- name: app
image: myapp:latest
ports:
- containerPort: 8080
使用 yaml 文件创建资源:
验证如下:
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
app-deployment-7bd8dd85f-fzmt2 2/2 Running 0 4s
$ kubectl get pod app-deployment-7bd8dd85f-fzmt2 -o=jsonpath={.spec.containers\[\*\].name}
app datakit-flameshot
稍等几分钟后即可在观测云控制台 应用性能检监测-Profiling 页面查看应用性能数据。