Container Insights에서 로그 수집 필터링

이 문서에서는 컨테이너 인사이트에서 사용할 수 있는 다양한 필터링 옵션에 대해 설명합니다. Kubernetes 클러스터는 컨테이너 인사이트에서 수집된 대량의 데이터를 생성합니다. 데이터의 수집과 보존에 대한 요금이 부과되므로, 필요 없는 데이터를 필터링하여 모니터링 비용을 크게 줄일 수 있습니다.

Important

이 문서에서는 모니터링되는 클러스터에 대한 DCR 또는 ConfigMap을 수정해야 하는 다양한 필터링 옵션에 대해 설명합니다. 이 구성을 수행하는 방법에 대한 자세한 내용은 컨테이너 인사이트에서 로그 컬렉션 구성을 참조하세요.

컨테이너 로그 필터링

컨테이너 로그는 Kubernetes 클러스터의 컨테이너에서 생성된 stderr 및 stdout 로그입니다. 이러한 로그는 Log Analytics 작업 영역의 ContainerLogV2 테이블에 저장됩니다. 기본적으로 모든 컨테이너 로그가 수집되지만 특정 네임스페이스의 로그를 필터링하거나 컨테이너 로그 컬렉션을 완전히 사용하지 않도록 설정할 수 있습니다.

DCR(데이터 수집 규칙)을 사용하면 stdout 및 stderr 로그를 사용하거나 사용하지 않도록 설정하고 각각의 특정 네임스페이스를 필터링할 수 있습니다. 컨테이너 로그 및 네임스페이스 필터링에 대한 설정은 Azure Portal에서 구성된 비용 사전 설정에 포함되며, 다른 DCR 구성 방법을 사용하여 이러한 값을 개별적으로 설정할 수 있습니다.

ConfigMap을 사용하면 클러스터에 대해 stderrstdout 로그 컬렉션을 별도로 구성할 수 있으므로 하나만 사용하고 다른 하나는 사용하지 않도록 선택할 수 있습니다.

다음 예에서는 kube-systemgatekeeper-system 네임스페이스를 제외하고 stdout 및 stderr을 수집하기 위한 ConfigMap 설정을 보여 줍니다.

[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

플랫폼 로그 필터링(시스템 Kubernetes 네임스페이스)

기본적으로 시스템 네임스페이스의 컨테이너 로그는 Log Analytics 비용을 최소화하기 위해 컬렉션에서 제외됩니다. 특정 문제 해결 시나리오에서는 시스템 컨테이너의 컨테이너 로그가 중요할 수 있습니다. 이 기능은 다음 시스템 네임스페이스로 제한됩니다. kube-system, gatekeeper-system, calico-system, azure-arc, kube-publickube-node-lease.

collect_system_pod_logs 설정과 함께 ConfigMap을 사용하여 플랫폼 로그를 사용하도록 설정합니다. 또한 시스템 네임스페이스가 exclude_namespaces 설정에 없는지 확인해야 합니다.

다음 예는 kube-system 네임스페이스의 coredns 컨테이너에 대한 stdout 및 stderr 로그를 수집하기 위한 ConfigMap 설정을 보여 줍니다.

[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와 컨테이너에 대한 로그 컬렉션을 제외할 수 있습니다. 이를 통해 로그 수집 비용을 크게 줄일 수 있으며 불필요한 정보를 걸러내지 않고도 관련 정보에 집중할 수 있습니다.

다음 설정으로 ConfigMap을 사용하여 주석 기반 필터링을 사용하도록 설정합니다.

[log_collection_settings.filter_using_annotations]
   enabled = true

또한 워크로드 Pod 사양에 필요한 주석을 추가해야 합니다. 다음 표는 다양한 가능한 Pod 주석을 강조 표시하여 보여 줍니다.

주석 설명
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 기반입니다. Kubernetes 플러그 인 필터 및 주석 기반 제외와 함께 고유한 Fluent-BIT 기반 로그 컬렉션 솔루션을 사용하는 경우 컨테이너 인사이트와 솔루션 모두에서 로그 컬렉션이 중지됩니다.

다음은 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 

환경 변수 필터링

다음 설정으로 ConfigMap을 사용하여 클러스터의 모든 Pod와 노드에서 환경 변수 컬렉션을 사용하도록 설정합니다.

[log_collection_settings.env_var]
    enabled = true

환경 변수 컬렉션을 전역적으로 사용하도록 설정한 경우 Dockerfile 설정을 사용하거나 env: 섹션 아래의 Pod용 구성 파일에서 환경 변수 AZMON_COLLECT_ENVFalse로 설정하여 특정 컨테이너에 대해 사용하지 않도록 설정할 수 있습니다. 환경 변수 컬렉션이 전역적으로 사용하지 않도록 설정된 경우 특정 컨테이너에 대한 컬렉션을 사용할 수 없습니다. 컨테이너 수준에서 적용할 수 있는 유일한 재정의는 컬렉션이 이미 전역적으로 사용하도록 설정된 경우 컬렉션을 사용하지 않도록 설정하는 것입니다.

시각화 및 경고에 미치는 영향

컨테이너 인사이트 데이터를 사용하는 사용자 지정 경고나 통합 문서가 있는 경우 데이터 수집 설정을 수정하면 해당 환경이 저하될 수 있습니다. 네임스페이스를 제외하거나 데이터 수집 빈도를 줄이는 경우 이 데이터를 사용하여 기존 경고, 대시보드 및 통합 문서를 검토하세요.

이러한 테이블을 참조하는 경고를 검사하려면 다음 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

다음 단계