部署
# 添加repo
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
# 下载
helm pull grafana/alloy
tar -zxvf alloy-1.10.0.tgz
# 创建命名空间
kubectl create namespace monitoring
# values.yaml
image:
registry: harbor.xxx.com/public
alloy:
extraPorts:
- name: oltp-grpc
port: 4317
targetPort: 4317
protocol: TCP
- name: oltp-http
port: 4318
targetPort: 4318
protocol: TCP
configMap:
create: true
content: |
discovery.kubernetes "pods" {
role = "pod"
namespaces {
names = ["n1", "n2", "n3"]
}
}
discovery.relabel "pod_logs" {
targets = discovery.kubernetes.pods.targets
rule {
source_labels = ["__meta_kubernetes_pod_label_item_name"]
target_label = "item_name"
}
rule {
source_labels = ["__meta_kubernetes_pod_label_env_type"]
target_label = "env_type"
}
rule {
source_labels = ["__meta_kubernetes_pod_label_app_name"]
target_label = "app_name"
}
rule {
source_labels = ["__meta_kubernetes_pod_node_name"]
target_label = "node_name"
}
rule {
source_labels = ["__meta_kubernetes_pod_name"]
target_label = "pod_name"
}
rule {
source_labels = ["__meta_kubernetes_namespace"]
target_label = "pod_namespace"
}
rule {
source_labels = ["__meta_kubernetes_pod_container_name"]
target_label = "container_name"
}
}
loki.source.kubernetes "pod_logs" {
targets = discovery.relabel.pod_logs.output
forward_to = [loki.process.pod_logs.receiver]
}
loki.process "pod_logs" {
stage.cri {}
stage.json {
expressions = {
level = "level",
message = "message",
logger = "logger",
thread = "thread",
trace_id = "trace_id",
span_id = "span_id",
stackTrace = "stack_trace",
}
}
stage.template {
source = "message"
template = "{{ if .trace_id }}trace_id={{ .trace_id }} {{ end }}{{ .Value }}"
}
stage.labels {
values = {
level = "",
item_name = "item_name",
env_type = "env_type",
app_name = "app_name",
pod_name = "pod_name",
pod_namespace = "pod_namespace",
node_name = "node_name",
}
}
forward_to = [loki.write.default.receiver]
}
loki.write "default" {
endpoint {
name = "default"
url = "http://loki-gateway/loki/api/v1/push"
headers = {
"X-Scope-OrgID" = "tenant1",
}
}
external_labels = {
cluster = "kubernetes",
}
}
otelcol.receiver.otlp "default" {
grpc {
endpoint = "0.0.0.0:4317"
}
http {
endpoint = "0.0.0.0:4318"
}
output {
traces = [otelcol.processor.batch.default.input]
}
}
otelcol.processor.batch "default" {
timeout = "1s"
send_batch_size = 8192
send_batch_max_size = 8192
output {
traces = [otelcol.exporter.otlp.tempo.input]
}
}
otelcol.exporter.otlp "tempo" {
client {
endpoint = "http://tempo-distributed-distributor.monitoring.svc.cluster.local:4317"
tls {
insecure = true
}
}
timeout = "10s"
}
# 测试
helm install alloy ./alloy \
-f ./values.yaml \
--create-namespace \
--namespace=monitoring \
--dry-run=server > test.log
# 安装
helm install alloy ./alloy \
-f ./values.yaml \
--create-namespace \
--namespace=monitoring
镜像
docker.io/grafana/alloy:v1.17.0
quay.io/prometheus-operator/prometheus-config-reloader:v0.91.0
资源对象
ServiceAccount
alloy
ConfigMap
alloy
ClusterRole
alloy
ClusterRoleBinding
alloy
Service
alloy
DaemonSet
alloy
验证
app.kubernetes.io/instance: alloy
kubectl get pods --namespace <NAMESPACE>
kubectl exec -it deploy/kube-prometheus-stack-grafana -c grafana -n monitoring -- sh
wget -qO- --header='X-Scope-OrgID: tenant1' 'http://loki-gateway/loki/api/v1/labels'
wget -qO- --header='X-Scope-OrgID: tenant1' 'http://loki-gateway/loki/api/v1/label/item_name/values'
wget -qO- --header='X-Scope-OrgID: tenant1' 'http://loki-gateway/loki/api/v1/label/env_type/values'
wget -qO- --header='X-Scope-OrgID: tenant1' 'http://loki-gateway/loki/api/v1/label/app_name/values'
wget -qO- --header='X-Scope-OrgID: tenant1' 'http://loki-gateway/loki/api/v1/label/node_name/values'