Kubernetes 환경에서 StdOut 로그 허용 목록 모범 사례¶
환경 준비¶
Kubernetes 환경(이하 K8s)이 이미 준비되어 있으며, 본 문서는 자체 구축 Kubernetes v1.23.1, Guance Datakit 버전 1.2.13, Nginx 1.17을 기반으로 합니다.
Datakit이 이미 배포되어 있으며, Datakit 설정 파일 container.conf는 ConfigMap 방식으로 관리됩니다.
참고: Alibaba Cloud Container Service for Kubernetes 또는 다른 클라우드 제공업체의 Kubernetes 구성 방식도 유사합니다.
전제 조건¶
Nginx 로그는 K8s 환경에서 파일 방식이 아닌 StdOut 방식으로 출력됩니다. Guance Datakit을 DaemonSet으로 배포하면 기본적으로 K8s 내부의 모든 StdOut 로그 출력을 수집합니다. 여기에는 클러스터 내부 구성 요소(예: CoreDNS, 로그 활성화 필요)의 StdOut 출력도 포함됩니다. 본 문서에서 다루는 로그는 모두 StdOut 방식으로 출력됩니다.
참고: StdOut은 개발자가 코드를 작성할 때 로그 콘솔 출력 방식을 선택하는 것을 의미합니다. 예시:
허용 목록 요구 사항¶
Datakit 배포 완료 후, 지정된 비즈니스 Pod 로그와 K8s 클러스터 구성 요소의 로그를 선택적으로 수집합니다. 이후 새로 추가된 비지정 비즈니스 Pod 로그는 수집하지 않으며, 동일한 Pod 내 여러 컨테이너의 로그 중 하나 또는 일부만 수집합니다.
본 문서에서는 Guance 수집기 Datakit의 다양한 로그 필터링 방법을 통해 이를 구현합니다. 로그에 Annotation(주석)을 추가하는 방법(Pod 내 다른 컨테이너 로그 필터링 포함)과 container.conf의 container_include_log = []를 조합하여 사용합니다.
더 자세한 로그 처리 원리는 <Datakit 로그 처리 개요>를 참조하세요.
구현 방식¶
방식 1 container_include_log = [] 사용¶
클러스터 구성 요소 coredns와 nginx 로그만 수집합니다. container_include_log는 정규 표현식 구문을 사용하여 이미지 이름을 지정합니다.
자세한 내용은 <컨테이너 이미지 기반 메트릭 및 로그 수집 구성>을 참조하세요.
[inputs.container]
docker_endpoint = "unix:///var/run/docker.sock"
containerd_address = "/var/run/containerd/containerd.sock"
enable_container_metric = true
enable_k8s_metric = true
enable_pod_metric = true
## Containers logs to include and exclude, default collect all containers. Globs accepted.
container_include_log = ["image:*coredns*","image:*nginx*"]
container_exclude_log = ["image:pubrepo.guance.com/datakit/logfwd*", "image:pubrepo.guance.com/datakit/datakit*"]
exclude_pause_container = true
## Removes ANSI escape codes from text strings
logging_remove_ansi_escape_codes = false
kubernetes_url = "https://kubernetes.default:443"
## Authorization level:
## bearer_token -> bearer_token_string -> TLS
## Use bearer token for authorization. ('bearer_token' takes priority)
## linux at: /run/secrets/kubernetes.io/serviceaccount/token
## windows at: C:\var\run\secrets\kubernetes.io\serviceaccount\token
bearer_token = "/run/secrets/kubernetes.io/serviceaccount/token"
# bearer_token_string = "<your-token-string>"
[inputs.container.tags]
# some_tag = "some_value"
# more_tag = "some_other_value"
구현 효과¶
이렇게 하면 지정된 이미지 이름의 Pod 로그를 선택적으로 수집합니다. 아래 그림 참조:
방식 2 container_include_log = []와 Annotation 마크 조합¶
클러스터 구성 요소 coredns와 nginx 로그만 수집하면서, 동시에 Annotation을 통해 nginx를 마크합니다. 물론 container_include_log에 허용 목록으로 등록되지 않은 다른 이미지(예: busybox)도 Annotation 방식으로 마크하면 수집할 수 있습니다. 이는 Annotation 마크 방식의 우선순위가 높기 때문입니다.
더 자세한 로그 처리 원리는 <Datakit 로그 처리 개요>를 참조하세요.
Nginx의 Annotation 마크
labels:
app: nginx-pod
annotations:
datakit/logs: |
[
{
"disable": false,
"source": "nginx-source",
"service": "nginx-source",
"pipeline": "",
"multiline_match": ""
}
]
spec:
[inputs.container]
docker_endpoint = "unix:///var/run/docker.sock"
containerd_address = "/var/run/containerd/containerd.sock"
## Containers metrics to include and exclude, default not collect. Globs accepted.
container_include_metric = []
container_exclude_metric = ["image:*"]
## Containers logs to include and exclude, default collect all containers. Globs accepted.
container_include_log = ["image:*coredns*","image:*nginx*"]
container_exclude_log = []
exclude_pause_container = true
## Removes ANSI escape codes from text strings
logging_remove_ansi_escape_codes = false
## Maximum length of logging, default 32766 bytes.
max_logging_length = 32766
kubernetes_url = "https://kubernetes.default:443"
## Authorization level:
## bearer_token -> bearer_token_string -> TLS
## Use bearer token for authorization. ('bearer_token' takes priority)
## linux at: /run/secrets/kubernetes.io/serviceaccount/token
## windows at: C:\var\run\secrets\kubernetes.io\serviceaccount\token
bearer_token = "/run/secrets/kubernetes.io/serviceaccount/token"
# bearer_token_string = "<your-token-string>"
[inputs.container.tags]
# some_tag = "some_value"
# more_tag = "some_other_value"
구현 효과¶
방식 3 Pod 내 특정 컨테이너 로그 필터링¶
클러스터 구성 요소 coredns와 nginx 로그만 수집하면서, 동시에 nginx Annotation 마크의 "only_images" 필드를 사용하여 필요한 컨테이너 이미지만 지정합니다. 즉, Pod 내부에도 허용 목록 정책을 적용합니다.
Pod 내 허용 목록 적용 전¶
아래 그림과 같이 nginx와 busybox 로그가 모두 수집됩니다.
Pod 내 허용 목록 적용¶
labels:
app: nginx-pod
annotations:
datakit/logs: |
[
{
"disable": false,
"source": "nginx-source",
"service": "nginx-source",
"pipeline": "",
"only_images": ["image:*nginx*"],
"multiline_match": ""
}
]
spec:
구현 효과¶
Pod 내 Nginx 로그만 유지됩니다.
요약¶
사실 허용 목록 정책을 활성화하는 것은 권장되지 않습니다. 허용 목록은 많은 문제를 야기할 수 있고 디버깅도 어렵습니다. 예상치 못한 결과가 발생할 수 있습니다. 예를 들어 개발자가 로그를 출력했지만 보이지 않는 경우, 실제로는 특정 태그가 추가되지 않았기 때문일 수 있습니다. 로그 소스를 필터링할 때 거부 목록이 실패하더라도 최악의 경우 데이터는 수집됩니다. 거부 목록 필터링은 예를 들어 Datakit 수집기 container.conf에서 다음과 같이 설정할 수 있습니다.
방식 1은 Annotation 마크 없이 수집기 container.conf에 내장된 필터링 방식을 사용하여 더 하위 레벨에서 구현합니다. 그러나 이 방식은 방식 2보다 좋지 않습니다. 마크 방식은 로그 소스에 더 나은 태그를 제공하여 향후 문제 분석 및 필터링에 유용하며, 더 유연합니다. 마크는 비즈니스 Pod에 적용되므로, 동일한 비즈니스 이미지 그룹 내에서도 정밀한 로그 필터링 및 제어가 가능합니다.
방식 3은 특정 비즈니스 시나리오에 따라 불필요한 Sidecar 등의 로그를 필터링하여 로그 수집의 노이즈를 줄일 수 있습니다.



