昨天(Day 22)我們理解了 OpenTelemetry Collector 的雙重感知系統架構。今天,讓我們深入探討 Collector 的「感知觸手」——各種 Receivers。就像人體的感官系統一樣,不同的 Receiver 負責收集不同類型的數據,讓我們的監控系統能夠全方位感知 Kubernetes 集群的健康狀態。
✅ 深入理解 Kubernetes 專用的 Receivers 組件
✅ 掌握 Kubeletstats、K8sattributes、K8sevents 等核心組件
✅ 實際配置和部署這些 Receivers
✅ 理解不同 Receivers 的協作關係
🎭 三大核心 Receivers
Kubernetes 環境中有三個最重要的 Receivers:
Receiver | 主要功能 | 收集數據類型 | 部署位置 |
---|---|---|---|
📊 Kubeletstats | Node 和 容器指標收集 | CPU、記憶體、網路、儲存 | Agent 模式 |
🏷️ K8sattributes | MetaData 豐富化 | Pod、Node、Namespace 標籤 | 處理器組件 |
📝 K8sevents | 集群事件收集 | 部署、擴縮容、錯誤事件 | Gateway 模式 |
Kubeletstats Receiver 是 Kubernetes 監控的「神經中樞」,直接從每個節點的 kubelet API 收集詳細的資源使用情況 。
# OpenTelemetry Collector - Agent 模式配置
# 專注於 Kubeletstats Receiver 的詳細配置
receivers:
# Kubeletstats Receiver - 核心節點指標收集器
kubeletstats:
# 收集間隔 - 平衡數據新鮮度與系統負載
collection_interval: 20s
# 認證方式 - 使用 ServiceAccount 進行安全認證
auth_type: "serviceAccount"
# Kubelet 端點 - 使用環境變數動態獲取節點名稱
endpoint: "https://${env:K8S_NODE_NAME}:10250"
# 跳過 TLS 驗證 - 內部集群通訊方式
insecure_skip_verify: true
# 指標組別 - 精確控制收集的數據範圍
metric_groups:
- node # 節點級別指標:CPU、記憶體、網路、儲存
- pod # Pod 級別指標:容器資源使用情況
- container # 容器級別指標:詳細的容器統計
- volume # 儲存卷指標:PV/PVC 使用情況
# 進階配置 - 精細化控制
extra_metadata_labels:
- container.id
- k8s.volume.type
# 指標配置 - 自訂指標收集行為
metrics:
# 容器 CPU 使用率
k8s.container.cpu_limit_utilization:
enabled: true
# 容器記憶體使用率
k8s.container.memory_limit_utilization:
enabled: true
# 節點檔案系統使用率
k8s.node.filesystem.usage:
enabled: true
# Pod 網路 I/O
k8s.pod.network.io:
enabled: true
Kubeletstats Receiver 提供以下核心指標類型 :
🖥️ 節點級別指標
🚀 Pod 級別指標
📦 容器級別指標
當 Kubeletstats Receiver 正常運行時,你會看到類似以下的指標數據 :
{
"resourceMetrics": [
{
"resource": {
"attributes": [
{"key": "k8s.node.name", "value": {"stringValue": "kind-control-plane"}},
{"key": "k8s.namespace.name", "value": {"stringValue": "ecommerce"}},
{"key": "k8s.pod.name", "value": {"stringValue": "user-service-7d4b8c6f9-x8k2m"}},
{"key": "k8s.container.name", "value": {"stringValue": "user-service"}}
]
},
"scopeMetrics": [
{
"metrics": [
{
"name": "k8s.container.cpu.usage",
"unit": "ns",
"gauge": {
"dataPoints": [
{
"timeUnixNano": "1694123456000000000",
"asDouble": 0.025,
"attributes": [
{"key": "container.name", "value": {"stringValue": "user-service"}}
]
}
]
}
},
{
"name": "k8s.container.memory.usage",
"unit": "By",
"gauge": {
"dataPoints": [
{
"timeUnixNano": "1694123456000000000",
"asInt": "134217728",
"attributes": [
{"key": "container.name", "value": {"stringValue": "user-service"}}
]
}
]
}
}
]
}
]
}
]
}
K8sattributes Processor 不是 Receiver,而是一個 Processor,但它在 Kubernetes 監控中扮演著至關重要的角色,負責將 Kubernetes metadata 附加到遙測數據上 。
processors:
# K8sattributes Processor - Kubernetes 元數據豐富化處理器
k8sattributes:
# 認證配置 - 使用 ServiceAccount 存取 K8s API
auth_type: "serviceAccount"
# 直通模式 - false 表示會修改現有屬性
passthrough: false
# 提取配置 - 定義要從 Kubernetes API 提取的元數據
extract:
# 基本metadata提取
metadata:
# Namespace 相關
- k8s.namespace.name
- k8s.namespace.uid
# workload 相關
- k8s.deployment.name
- k8s.deployment.uid
- k8s.replicaset.name
- k8s.replicaset.uid
- k8s.statefulset.name
- k8s.statefulset.uid
- k8s.daemonset.name
- k8s.daemonset.uid
- k8s.job.name
- k8s.job.uid
- k8s.cronjob.name
# Pod 相關
- k8s.pod.name
- k8s.pod.uid
- k8s.pod.start_time
- k8s.pod.qos_class
# Node 相關
- k8s.node.name
- k8s.node.uid
# label 提取 - 將 K8s 標籤轉換為遙測屬性
labels:
# 應用程式標籤
- tag_name: app.name
key: app.kubernetes.io/name
from: pod
- tag_name: app.version
key: app.kubernetes.io/version
from: pod
- tag_name: app.component
key: app.kubernetes.io/component
from: pod
- tag_name: app.part-of
key: app.kubernetes.io/part-of
from: pod
- tag_name: app.managed-by
key: app.kubernetes.io/managed-by
from: pod
# 自訂業務標籤
- tag_name: business.team
key: business.team
from: namespace
- tag_name: business.environment
key: environment
from: namespace
- tag_name: business.cost-center
key: cost-center
from: namespace
# 技術標籤
- tag_name: tech.framework
key: tech.framework
from: pod
- tag_name: tech.language
key: tech.language
from: pod
# 註解提取 - 將重要的註解轉換為屬性
annotations:
- tag_name: deployment.revision
key: deployment.kubernetes.io/revision
from: pod
- tag_name: config.hash
key: config.hash
from: pod
# Pod 關聯規則 - 定義如何將遙測數據與 Pod 關聯
pod_association:
# 方法 1:通過 Pod IP 關聯
- sources:
- from: resource_attribute
name: k8s.pod.ip
# 方法 2:通過 Pod UID 關聯
- sources:
- from: resource_attribute
name: k8s.pod.uid
# 方法 3:通過網路連接關聯
- sources:
- from: connection
# 過濾器 - 控制哪些 Pod 需要處理
filter:
node_from_env_var: K8S_NODE_NAME
# 命名空間過濾
namespace: "ecommerce"
# 標籤選擇器
labels:
- key: app.kubernetes.io/name
value: user-service
op: equals
- key: app.kubernetes.io/name
value: order-service
op: equals
# 快取配置 - 優化 API 呼叫效能
owner_lookup_enabled: true
# 排除配置 - 排除不需要的 Pod
exclude:
pods:
- name_regex: "kube-.*"
- name_regex: "coredns-.*"
K8sattributes Processor 的核心價值在於將技術指標與業務上下文連結
✨ 豐富化效果對比
處理前 | 處理後 |
---|---|
cpu.usage: 0.8 |
cpu.usage: 0.8 k8s.namespace.name: ecommerce k8s.deployment.name: user-service app.name: user-service app.version: v1.2.3 business.team: backend-team |
K8sevents Receiver 專門收集 Kubernetes 集群中的事件,這些事件對於理解集群狀態變化和故障排除至關重要 。
receivers:
# K8sevents Receiver - Kubernetes 事件收集器
k8sevents:
# 認證配置
auth_type: "serviceAccount"
# 命名空間過濾 - 只收集特定命名空間的事件
namespaces:
- ecommerce
- kube-system
- default
# 事件類型過濾
event_types:
- Normal # 正常事件:部署成功、Pod 啟動等
- Warning # 警告事件:資源不足、image 拉取失敗等
# 開始時間 - 從何時開始收集事件
start_time: "2024-01-01T00:00:00Z"
# 處理前
metric_name: http_requests_total
value: 1500
attributes:
method: GET
status_code: 200
# 處理後
metric_name: http_requests_total
value: 1500
attributes:
method: GET
status_code: 200
# 新增的 Kubernetes metadata
k8s.namespace.name: ecommerce
k8s.deployment.name: user-service
k8s.pod.name: user-service-7d4b8c6f9-x8k2m
k8s.node.name: kind-control-plane
app.name: user-service
app.version: v1.2.3
business.team: backend-team
business.environment: production
根據實際部署經驗,K8sevents Receiver 會收集以下類型的事件:
✅ 正常事件 (Normal)
⚠️ 警告事件 (Warning)
K8sevents Receiver 收集的事件會以 log 形式呈現:
{
"timestamp": "2024-09-07T12:34:56.789Z",
"severityText": "INFO",
"severityNumber": 9,
"body": "Successfully assigned ecommerce/user-service-7d4b8c6f9-x8k2m to kind-control-plane",
"attributes": {
"k8s.event.type": "Normal",
"k8s.event.reason": "Scheduled",
"k8s.namespace.name": "ecommerce",
"k8s.pod.name": "user-service-7d4b8c6f9-x8k2m",
"k8s.node.name": "kind-control-plane",
"event.category": "deployment"
}
}
🧠 架構思維提升
我們不再只看應用程式指標,而是結合基礎設施和業務上下文
理解監控數據的層次性:技術指標
→ 業務指標
→ 決策支援
從被動收集到主動關聯
透過 K8sattributes
將技術指標與業務上下文連結
建立從基礎設施到應用層的完整tracing
故障排除思維
透過多層次的監控數據快速定位問題根因
建立從事件
→ 指標
→ tracing
的完整故障排除流程