iT邦幫忙

2025 iThome 鐵人賽

DAY 23
3
DevOps

賢者大叔的容器修煉手札系列 第 23

OpenTelemetry Collector 的「感知觸手」:Kubernetes Receivers 🔍📡

  • 分享至 

  • xImage
  •  

賢者大叔的容器修煉手札 第 23 篇

OpenTelemetry Collector 的「感知觸手」:Kubernetes Receivers 🔍📡

昨天(Day 22)我們理解了 OpenTelemetry Collector 的雙重感知系統架構。今天,讓我們深入探討 Collector 的「感知觸手」——各種 Receivers。就像人體的感官系統一樣,不同的 Receiver 負責收集不同類型的數據,讓我們的監控系統能夠全方位感知 Kubernetes 集群的健康狀態。

🎯 今日學習目標

✅ 深入理解 Kubernetes 專用的 Receivers 組件

✅ 掌握 Kubeletstats、K8sattributes、K8sevents 等核心組件

✅ 實際配置和部署這些 Receivers

✅ 理解不同 Receivers 的協作關係

🧩 Kubernetes Receivers 生態系統

🎭 三大核心 Receivers
Kubernetes 環境中有三個最重要的 Receivers:

Receiver 主要功能 收集數據類型 部署位置
📊 Kubeletstats Node 和 容器指標收集 CPU、記憶體、網路、儲存 Agent 模式
🏷️ K8sattributes MetaData 豐富化 Pod、Node、Namespace 標籤 處理器組件
📝 K8sevents 集群事件收集 部署、擴縮容、錯誤事件 Gateway 模式

📊 Kubeletstats Receiver:節點感知的核心

Kubeletstats Receiver 是 Kubernetes 監控的「神經中樞」,直接從每個節點的 kubelet API 收集詳細的資源使用情況 。

🎛️ Kubeletstats 配置範例

# 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 收集的關鍵指標

Kubeletstats Receiver 提供以下核心指標類型 :

🖥️ 節點級別指標

  • CPU 指標:k8s.node.cpu.usage, k8s.node.cpu.time
  • 記憶體指標:k8s.node.memory.usage, k8s.node.memory.available
  • 網路指標:k8s.node.network.io, k8s.node.network.errors
  • 儲存指標:k8s.node.filesystem.usage, k8s.node.filesystem.capacity

🚀 Pod 級別指標

  • 資源使用:k8s.pod.cpu.usage, k8s.pod.memory.usage
  • 網路流量:k8s.pod.network.io
  • 儲存使用:k8s.pod.volume.available

📦 容器級別指標

  • 資源限制:k8s.container.cpu_limit_utilization
  • 重啟次數:k8s.container.restarts
  • 狀態資訊:k8s.container.ready

📊 Kubeletstats 收集的指標範例

當 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:MetaData 豐富化大師

K8sattributes Processor 不是 Receiver,而是一個 Processor,但它在 Kubernetes 監控中扮演著至關重要的角色,負責將 Kubernetes metadata 附加到遙測數據上 。

🎛️ K8sattributes 配置範例

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 的核心價值

K8sattributes Processor 的核心價值在於將技術指標與業務上下文連結

✨ 豐富化效果對比

處理前 處理後
cpu.usage: 0.8 cpu.usage: 0.8k8s.namespace.name: ecommercek8s.deployment.name: user-serviceapp.name: user-serviceapp.version: v1.2.3business.team: backend-team

📝 K8sevents Receiver:集群事件的記錄者

K8sevents Receiver 專門收集 Kubernetes 集群中的事件,這些事件對於理解集群狀態變化和故障排除至關重要 。

🎛️ K8sevents 配置範例

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"

🏷️ K8sattributes 豐富化效果

# 處理前
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 收集的事件類型

根據實際部署經驗,K8sevents Receiver 會收集以下類型的事件:

正常事件 (Normal)

  • 部署事件:Scheduled, Pulled, Created, Started
  • 擴縮容事件:ScalingReplicaSet, SuccessfulCreate
  • 網路事件:AddedInterface, RegisteredNode

⚠️ 警告事件 (Warning)

  • 資源事件:FailedScheduling, OutOfMemory, DiskPressure
  • 映像事件:Failed, BackOff, ErrImagePull
  • 網路事件:NetworkNotReady, DNSConfigForming

📝 K8sevents 收集的事件範例

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的完整故障排除流程

https://ithelp.ithome.com.tw/upload/images/20250907/20104930YRv35YSAjT.png


上一篇
讓系統「開了眼界」的 OpenTelemetry Collector 👁️‍🗨️
下一篇
日誌收集的第一步:Fluent Bit Sidecar 模式實戰 📝🚀
系列文
賢者大叔的容器修煉手札24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言