共用方式為


使用 ConfigMap 設定容器日誌收集

Kubernetes 叢集會產生大量由 Azure 監視器收集的資料。 由於您需支付此資料的擷取和保留費用,因此您可以篩選出您不需要的資料,以大幅降低監視成本。 本文說明如何使用 ConfigMap 來設定和篩選叢集中的容器記錄和環境變數集合。 您也可以使用 ConfigMap 來啟用從系統 Kubernetes 命名空間收集平台日誌,並為工作負載啟用註釋型篩選。

小提示

在實作本文所述的任何篩選選項之前,請確定您選取符合您需求的 記錄收集設定檔 。 使用本文中的資訊來進一步精簡叢集的資料收集設定。

先決條件

  • 支援從容器工作負載收集 stdout、stderr 和環境變數的最低代理程式版本是 ciprod06142019 或更新版本。

設定及部署 ConfigMap

使用下列程序,設定 ConfigMap 組態檔並將其部署至叢集:

  1. 下載代理程式組態 ConfigMap 範本 https://aka.ms/container-azm-ms-agentconfig ,並在編輯器中開啟它。

  2. 以您的自訂來編輯 ConfigMap YAML 檔案。 此範本包含具有描述的所有有效設定。 若要啟用設定,請移除註解字元 (#) 並設定其值。

  3. 執行下列 kubectl 命令來建立 ConfigMap:

    kubectl config set-context <cluster-name>
    kubectl apply -f <configmap_yaml_file.yaml>
    
    # Example: 
    kubectl config set-context my-cluster
    kubectl apply -f container-azm-ms-agentconfig.yaml
    

    可能需要幾分鐘的時間才能完成設定變更並生效。 然後,叢集中的所有 Azure 監視器代理程式 Pod 都將重新啟動。 重新啟動會將所有 Azure 監視器代理程式 Pod 輪流啟動,因此其不會全部同時重新啟動。 重新啟動完成時,您會收到類似以下結果的訊息:

    configmap "container-azm-ms-agentconfig" created`.
    

驗證組態

若要驗證設定已成功套用至叢集,請使用下列命令來檢閱代理程式 Pod 的記錄。

kubectl logs ama-logs-fdf58 -n kube-system -c ama-logs

若 Azure 監視器代理程式 Pod 傳回設定錯誤,則輸出會顯示類似下列的錯誤:

***************Start Config Processing******************** 
config::unsupported/missing config schema version - 'v21' , using defaults

使用下列選項進一步執行設定變更的疑難排解:

  • 從代理程式 Pod,使用相同的 kubectl logs 命令。

  • 檢閱即時記錄中是否有類似以下的錯誤:

    config::error::Exception while parsing config map for log collection/env variable settings: \nparse error on value \"$\" ($end), using defaults, please check config map for errors
    

資料會每小時傳送至 Log Analytics 工作區中的 KubeMonAgentEvents 資料表,並出現組態錯誤的錯誤嚴重性。 如果沒有錯誤,資料表中的項目會包含嚴重性為「資訊」的資料,其不會回報任何錯誤。 Tags 資料行包含發生錯誤的 Pod 和容器識別碼,還有過去一小時內第一次發生、最後一次發生和計數的詳細資訊。

驗證結構描述版本

支援的設定結構描述版本會在 Azure 監視器代理程式 Pod 上以 Pod 註釋 (結構描述版本) 的形式提供。 您可以使用下列 kubectl 命令來加以查看。

kubectl describe pod ama-logs-fdf58 -n=kube-system.

篩選容器記錄

容器記錄是 Kubernetes 叢集中容器所產生的 stderr 和 stdout 記錄。 這些記錄會儲存在Log Analytics工作區的 ContainerLogV2 資料表 中。 根據預設,會收集所有容器記錄,但您可以從特定命名空間篩選出記錄,或完全停用容器記錄的收集。

編輯 ConfigMap 的 log_collection_settings 區段,以分別配置叢集中的 stderrstdout 記錄收集設定。 下列範例顯示 ConfigMap 設定,以收集不包括 kube-systemgatekeeper-system 命名空間的 stdout 和 stderr。

[log_collection_settings]
    [log_collection_settings.stdout]
        enabled = true
        exclude_namespaces = ["kube-system","gatekeeper-system"]

    [log_collection_settings.stderr]
        enabled = true
        exclude_namespaces = ["kube-system","gatekeeper-system"]

    [log_collection_settings.enrich_container_logs]
        enabled = true

備註

您也可以在 叢集的記錄設定檔中設定命名空間篩選,但這不適用於傳送至 ContainerLogV2 的資料。 這類資料只能使用 ConfigMap 來篩選。

平台記錄篩選 (系統 Kubernetes 命名空間)

根據預設,會從集合中排除來自系統命名空間的容器記錄,以將 Log Analytics 成本降到最低。 不過,在特定疑難排解案例中,系統容器的容器記錄可能很重要。 此功能僅限於下列系統命名空間:

  • kube-system
  • gatekeeper-system
  • calico-system
  • azure-arc
  • kube-public
  • kube-node-lease

編輯 collect_system_pod_logs ConfigMap 區段中的 log_collection_settings 設定、以啟用叢集的平台記錄。 您也必須確定系統命名空間不在 exclude_namespaces 設定中。

下列範例會顯示 ConfigMap 設定,以在 coredns 命名空間中收集 kube-system 容器的 stdout 和 stderr 記錄。

[log_collection_settings]
    [log_collection_settings.stdout]
        enabled = true
        exclude_namespaces = ["gatekeeper-system"]
        collect_system_pod_logs = ["kube-system:coredns"]

    [log_collection_settings.stderr]
        enabled = true
        exclude_namespaces = ["kube-system","gatekeeper-system"]
        collect_system_pod_logs = ["kube-system:coredns"]

工作負載的註釋型篩選

註釋型篩選可讓您藉由註釋 Pod 來排除特定 Pod 和容器的記錄集合。 這可大幅降低記錄擷取成本,並讓您專注於相關資訊,而不需篩選雜訊。

編輯 filter_using_annotations ConfigMap 區段中的 log_collection_settings 設定,以啟用註解型篩選。

[log_collection_settings.filter_using_annotations]
   enabled = true

您也必須在工作負載 Pod 規格上新增所需的註釋。下表會醒目提示不同的可能 Pod 註釋。

Annotation Description
fluentbit.io/exclude: "true" 排除 Pod 中所有容器上的 stdout 和 stderr 資料流
fluentbit.io/exclude_stdout: "true" 只排除 Pod 中所有容器上的 stdout 資料流
fluentbit.io/exclude_stderr: "true" 只排除 Pod 中所有容器上的 stderr 資料流
fluentbit.io/exclude_container1: "true" 只針對 Pod 中的 container1 排除 stdout 和 stderr 資料流
fluentbit.io/exclude_stdout_container1: "true" 只針對 Pod 中的 container1 排除 stdout

備註

這些註釋是 Fluent Bit 型的註釋。 如果您使用自己的 Fluent-Bit 型記錄收集解決方案搭配 Kubernetes 外掛程式篩選和註釋型排除,則其會停止從容器深入解析和您的解決方案中收集記錄。

以下是 Pod 規格中的 fluentbit.io/exclude: "true" 註釋的範例:

apiVersion: v1 
kind: Pod 
metadata: 
 name: apache-logs 
 labels: 
  app: apache-logs 
 annotations: 
  fluentbit.io/exclude: "true" 
spec: 
 containers: 
 - name: apache 
  image: edsiper/apache_logs 

篩選環境變數

編輯 log_collection_settings.env_var ConfigMap 區段中的 log_collection_settings 設定,以啟用跨所有 Pod 和節點收集環境變數。

[log_collection_settings.env_var]
    enabled = true

如果全域啟用了環境變數集合,您可以通過在 Dockerfile 設定中將環境變數AZMON_COLLECT_ENV設置為False,或在區段下的env:中將其設置為False來停用特定容器的環境變數收集。 如果全域已停用環境變數集合,您無法針對特定容器啟用集合。 唯一可以在容器層級套用的覆寫,就是在全域啟用集合時加以停用。

ConfigMap 設定

下表說明您可以設定的設定,以使用代理程式組態 ConfigMap 來控制資料收集。

Setting 數據類型 價值觀 Description
schema-version 字串 (區分大小寫) v1 剖析此 ConfigMap 時,由代理程式使用。 目前支援的結構描述版本為 v1。 不支援修改此值,且此值會在評估 ConfigMap 時遭到拒絕。
config-version 繩子 允許您在原始檔控制系統/存放庫中追蹤此組態檔的版本。 允許的最大字元為 10,而所有其他字元都會被截斷。
[log_collection_settings]
[stdout]
enabled
布林值 true
false
控制是否已啟用 stdout 容器記錄收集。 當設定為 true 且沒有任何命名空間從 stdout 記錄收集中排除時,則會從叢集中所有 Pod 和節點的所有容器收集 stdout 記錄。 如果未在 ConfigMap 中指定,預設值為 true
[stdout]
exclude_namespaces
繩子 逗號分隔的陣列 不會收集 stdout 記錄的 Kubernetes 命名空間陣列。 此設定只有在 enabled 設定為 true 時有效。 如果未在 ConfigMap 中指定,預設值為
["kube-system","gatekeeper-system"]
[stderr]
enabled
布林值 true
false
控制是否已啟用 stderr 容器記錄收集。 當設定為 true 且沒有任何命名空間從 stderr 記錄收集中排除時,則會從叢集中所有 Pod 和節點的所有容器收集 stderr 記錄。 如果未在 ConfigMap 中指定,預設值為 true
[stderr]
exclude_namespaces
繩子 逗號分隔的陣列 不會收集 stderr 記錄的 Kubernetes 命名空間陣列。 此設定只有在 enabled 設定為 true 時有效。 如果未在 ConfigMap 中指定,預設值為
["kube-system","gatekeeper-system"]
[env_var]
enabled
布林值 true
false
控制叢集中所有 Pod 和節點的環境變數收集。 如果未在 ConfigMap 中指定,預設值為 true
[enrich_container_logs]
enabled
布林值 true
false
控制容器記錄擴充,為寫入至叢集中所有容器記錄的 Name 資料表的每項記錄檔記錄,填入 Image 屬性值。 如果未在 ConfigMap 中指定,預設值為 false
[collect_all_kube_events]
enabled
布林值 true
false
控制是否收集所有類型的 Kube 事件。 根據預設,不會收集類型為 Normal 的 Kube 事件。 當此設定為 true 時,不會再篩選 Normal 事件,而且會收集所有事件。 如果未在 ConfigMap 中指定,預設值為 false
[schema]
containerlog_schema_version
字串 (區分大小寫) v2
v1
設定記錄擷取格式。 如果為 v2,則會使用 ContainerLogV2 資料表。 如果為 v1,則會使用 ContainerLog 資料表 (此資料表已被取代)。 針對使用 Azure CLI 2.54.0 版或更新版本的叢集啟用容器深入解析,預設值為 v2。 如需詳細資訊,請參閱容器深入解析記錄結構描述
[enable_multiline_logs]
enabled
布林值 true
false
控制是否啟用多行容器記錄。 如需詳細資料,請參閱容器深入解析中的多行記錄。 如果未在 ConfigMap 中指定,預設值為 false。 這需要 schema 設定成為 v2
[metadata_collection]
enabled
布林值 true
false
控制是否在 KubernetesMetadata 資料表的 ContainerLogV2 資料行中收集中繼資料。
[metadata_collection]
include_fields
繩子 逗號分隔的陣列 要包含的中繼資料欄位清單。 如果未使用設定,則會收集所有欄位。 有效的值為 ["podLabels","podAnnotations","podUid","image","imageID","imageRepo","imageTag"]
[log_collection_settings.multi_tenancy]
enabled
布林值 true
false
控制是否啟用多租戶功能。 如需詳細資料,請參閱 多租用戶受管理記錄 。 如果未在 ConfigMap 中指定,預設值為 false
[metric_collection_settings]
[collect_kube_system_pv_metrics]
enabled
布林值 true
false
允許在 kube-system 命名空間中收集永續性磁碟區 (PV) 使用計量。 根據預設,不會收集 kube-system 命名空間中具有永續性磁碟區宣告的永續性磁碟區使用計量。 當此設定設為 true,會收集所有命名空間的 PV 使用計量。 如果未在 ConfigMap 中指定,預設值為 false
[agent_settings]
[proxy_config]
ignore_proxy_settings
布林值 true
false
若為 true,會忽略 Proxy 設定。 在 AKS 和已啟用 Arc 的 Kubernetes 環境中,如果您的叢集設定為正向 Proxy,則會自動套用 Proxy 設定,並用於代理程式。 針對某些設定,例如使用 AMPLS + Proxy,您可能想要忽略 Proxy 設定。 如果未在 ConfigMap 中指定,預設值為 false
[agent_settings.fbit_config]
enable_internal_metrics 布林值 true
false
控制是否啟用內部指標的收集。 如果未在 ConfigMap 中指定,預設值為 false

對視覺效果和警示的影響

如果您有任何使用容器深入解析資料的自訂警示或活頁簿,則修改資料集合設定可能會降低這些體驗。 如果您排除命名空間或降低資料收集頻率,請檢閱使用此資料的現有警示、儀表板和活頁簿。

若要掃描參考這些資料表的警示,請執行下列 Azure Resource Graph 查詢:

resources
| where type in~ ('microsoft.insights/scheduledqueryrules') and ['kind'] !in~ ('LogToMetric')
| extend severity = strcat("Sev", properties["severity"])
| extend enabled = tobool(properties["enabled"])
| where enabled in~ ('true')
| where tolower(properties["targetResourceTypes"]) matches regex 'microsoft.operationalinsights/workspaces($|/.*)?' or tolower(properties["targetResourceType"]) matches regex 'microsoft.operationalinsights/workspaces($|/.*)?' or tolower(properties["scopes"]) matches regex 'providers/microsoft.operationalinsights/workspaces($|/.*)?'
| where properties contains "Perf" or properties  contains "InsightsMetrics" or properties  contains "ContainerInventory" or properties  contains "ContainerNodeInventory" or properties  contains "KubeNodeInventory" or properties  contains"KubePodInventory" or properties  contains "KubePVInventory" or properties  contains "KubeServices" or properties  contains "KubeEvents" 
| project id,name,type,properties,enabled,severity,subscriptionId
| order by tolower(name) asc

後續步驟