本文說明如何使用 Kubernetes 叢集中的容器記錄資料實作資料轉換。 Azure 監視器中的轉換可讓您在資料擷取到 Log Analytics 工作區之前修改或篩選資料。 這可讓您執行的動作包含篩選從叢集收集的資料來節省成本,或處理傳入資料以協助資料查詢。
- 根據具體的條件篩選資料列
- 刪除或重新命名欄位
- 遮罩敏感場
- 新增計算欄位
小提示
雖然轉換是一項強大且可靠的功能,但應在使用其他 Kubernetes 日誌過濾方法後才使用。 轉換更複雜,且會增加網路使用率,因為資料在過濾前就從叢集傳送。 請參閱 Kubernetes 叢集的資料收集篩選與自訂 ,以了解不同配置的說明
資料收集規則
轉換會在資料收集規則 (DCR) 中實作,此規則用來在 Azure 監視器中設定資料收集。 當您在 Azure 監視器中啟用 Kubernetes 叢集的監視 Prometheus 計量和容器記錄時,會針對每種類型的資料建立個別的 DCR。 轉換可以新增至收集容器記錄的 DCR。
附註
請參閱 DCR 及相關資源 ,詳細列出為 Kubernetes 叢集建立的 DCR。
若要建立轉換,請執行下列其中一個動作:
- 新增叢集。 使用現有的 ARM 範本,將 AKS 叢集加入至容器深入解析。 使用所需的配置修改該範本中的 DCR,包括參照下列範例之一進行類似的轉換。
- 現有的 DCR。 在叢集上線至容器深入解析和資料收集設定之後,請編輯其 DCR,以使用編輯資料收集規則中的任何方法包含轉換。
附註
目前編輯 DCR 只有最少的 UI,這是新增轉換的必要項目。 在大多數情況下,您需要手動編輯 DCR。 本文說明要實作的 DCR 結構。 如需如何實作該結構的指引,請參閱建立和編輯 Azure 監視器中的資料收集規則 (DCR) (英文)。
資料來源
DCR 的 [數據源] 區段會定義 DCR 將處理的不同傳入資料類型。 針對容器深入解析,這是容器深入解析延伸模組,其中包含一個或多個以 streams 開頭的預先定義 。
DCR 中的容器深入解析串流清單取決於您為叢集選取的成本預設值。 如果您收集所有資料表,則 DCR 會使用 Microsoft-ContainerInsights-Group-Default 串流,這是一個群組串流,其中包含串流值中列出的所有串流。 如果您要使用轉換,您必須將此變更為個別串流。 任何其他成本預設設定都會使用個別串流。
下列範例顯示 Microsoft-ContainerInsights-Group-Default 串流。 請參閱以下章節,以展示使用各個流的範例。
"dataSources": {
"extensions": [
{
"streams": [
"Microsoft-ContainerInsights-Group-Default"
],
"name": "ContainerInsightsExtension",
"extensionName": "ContainerInsights",
"extensionSettings": {
"dataCollectionSettings": {
"interval": "1m",
"namespaceFilteringMode": "Off",
"namespaces": null,
"enableContainerLogV2": true
}
}
}
]
}
資料流程
DCR 的 [數據流] 區段會比對數據流與 DCR 區段中定義的destinations目的地。 如果要將資料傳送至預設資料表,則不必針對已知的串流指定資料表名稱。 不需要轉換的串流可以在只包含工作區目的地的單一項目中群組在一起。 每個都會傳送至其預設資料表。
針對需要轉換的串流建立個別條目。 這應該包含工作區目的地和 transformKql 屬性。 如果您要將資料傳送至替代資料表,則必須包含指定目的地資料表名稱的 outputStream 屬性。
下列範例針對具有轉換的單一串流顯示 dataFlows 區段。 請參考下方範例,了解單一 DCR 中的多重資料流。
"dataFlows": [
{
"streams": [
"Microsoft-ContainerLogV2"
],
"destinations": [
"ciworkspace"
],
"transformKql": "source | where PodNamespace == 'kube-system'"
}
]
篩選資料
以下範例根據LogLevel 欄位過濾ContainerLogV2中的資料。 只會收集具有 LogLevel 或 errorcritical 的記錄,因為這些記錄是您可能用於警示及識別叢集中問題的項目。 收集及儲存其他層級 (例如 info 和 debug) 會產生成本,卻不會產生顯著價值。
您可以使用下列記錄查詢來擷取這些記錄。
ContainerLogV2 | where LogLevel in ('error', 'critical')
下圖中顯示此邏輯。
在轉換中,表格名稱 source 是用來表示傳入資料。 以下是要在轉換中使用的修改查詢。
source | where LogLevel in ('error', 'critical')
下列範例顯示此轉換已新增至容器深入解析 DCR。 請注意,會針對 Microsoft-ContainerLogV2 使用個別資料流程,因為這是應該套用轉換的唯一傳入串流。 針對其他串流,會使用不同的資料流。
{
"properties": {
"location": "eastus2",
"kind": "Linux",
"dataSources": {
"syslog": [],
"extensions": [
{
"streams": [
"Microsoft-ContainerLogV2",
"Microsoft-KubeEvents",
"Microsoft-KubePodInventory"
],
"extensionName": "ContainerInsights",
"extensionSettings": {
"dataCollectionSettings": {
"interval": "1m",
"namespaceFilteringMode": "Off",
"enableContainerLogV2": true
}
},
"name": "ContainerInsightsExtension"
}
]
},
"destinations": {
"logAnalytics": [
{
"workspaceResourceId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/my-resource-group/providers/microsoft.operationalinsights/workspaces/my-workspace",
"workspaceId": "00000000-0000-0000-0000-000000000000",
"name": "ciworkspace"
}
]
},
"dataFlows": [
{
"streams": [
"Microsoft-KubeEvents",
"Microsoft-KubePodInventory"
],
"destinations": [
"ciworkspace"
],
},
{
"streams": [
"Microsoft-ContainerLogV2"
],
"destinations": [
"ciworkspace"
],
"transformKql": "source | where LogLevel in ('error', 'critical')"
}
],
},
}
將資料傳送至不同的資料表
在上述範例中,只會收集具有 LogLevel、error 或 critical 的記錄。 替代策略是設定基本記錄的 ContainerLogV2,並將這些記錄傳送至替代資料表,而非完全不收集這些記錄。
針對此策略,需要兩個轉換。 第一個轉換會將 具有 LogLevel 或 error 的critical記錄傳送至名為 的ContainerLogV2_CL自定義數據表。 第二個轉換會將其他記錄傳送至標準 ContainerLogV2。 每個查詢如下所示,使用 source 表示傳入的資料,如上一個範例中所述。
# Return error and critical logs
source | where LogLevel in ('error', 'critical')
# Return logs that aren't error or critical
source | where LogLevel !in ('error', 'critical')
下圖中顯示此邏輯。
下列範例顯示此轉換已新增至容器深入解析 DCR。 此 DCR 中有兩個 Microsoft-ContainerLogV2 的資料流,每個轉換各有一個。 第一個會傳送至您不必指定表格名稱的預設資料表。 第二個則要求 outputStream 屬性指定目的地資料表。
{
"properties": {
"location": "eastus2",
"kind": "Linux",
"dataSources": {
"syslog": [],
"extensions": [
{
"streams": [
"Microsoft-ContainerLogV2",
"Microsoft-KubeEvents",
"Microsoft-KubePodInventory"
],
"extensionName": "ContainerInsights",
"extensionSettings": {
"dataCollectionSettings": {
"interval": "1m",
"namespaceFilteringMode": "Off",
"enableContainerLogV2": true
}
},
"name": "ContainerInsightsExtension"
}
]
},
"destinations": {
"logAnalytics": [
{
"workspaceResourceId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/my-resource-group/providers/microsoft.operationalinsights/workspaces/my-workspace",
"workspaceId": "00000000-0000-0000-0000-000000000000",
"name": "ciworkspace"
}
]
},
"dataFlows": [
{
"streams": [
"Microsoft-KubeEvents",
"Microsoft-KubePodInventory"
],
"destinations": [
"ciworkspace"
],
},
{
"streams": [
"Microsoft-ContainerLogV2"
],
"destinations": [
"ciworkspace"
],
"transformKql": "source | where LogLevel !in ('error', 'critical')"
},
{
"streams": [
"Microsoft-ContainerLogV2"
],
"destinations": [
"ciworkspace"
],
"transformKql": "source | where LogLevel in ('error','critical')",
"outputStream": "Custom-ContainerLogV2_CL"
}
],
},
}