Kubernetes / Log Agent

쿠버네티스 환경에서 DataSaker Log agent 설치하기

Log agent는 다양한 환경에서 시스템 또는 애플리케이션에서 생성되는 로그 데이터를 거의 실시간으로 수집하고, 처리 및 전송하는 에이전트입니다. Log agent를 통해 여러 대의 서버에서 생성되는 로그 데이터를 중앙 집중적으로 관리하고 분석하기 위해 사용할 수 있습니다. 그에 따라 사용자는 시스템 또는 애플리케이션에서 발생하는 문제를 빠르게 감지하고 대응할 수 있습니다. 또한, 로그 데이터를 분석하여 보안, 성능, 비즈니스 분석 등 다양한 목적으로 활용할 수 있습니다. 고객의 요구사항에 맞게 에이전트 설정을 조정하여 최적의 결과를 제공해 드립니다.

DataSaker 선행 작업을 진행하였나요?

현재 Kubernetes 환경에 DataSaker의 선행 작업이 진행되지 않으셨다면 DataSaker 선행 작업을 먼저 진행하여 주시기 바랍니다. DataSaker 선행 작업

Log agent 설치하기

기본적으로, Log agent는 쿠버네티스 환경에서 기본적으로 데몬셋(daemonset)으로 배포됩니다. 따라서, 모든 노드에 Log agent가 설치됩니다. 만약, 특정 노드에만 Log agent를 설치하고 싶다면, 해당 노드에 affinity 또는 nodeSelector를 추가적으로 설정해주십시오.

1. Log agent 설정 값 등록

Log agent의 설정 값의 의미와 기본 설정값은 다음과 같습니다. 사용자마다 에이전트 설정에 대해 다른 요구사항이 있습니다. 따라서 에이전트 설정을 사용자 설정에 맞게 조정해야 합니다. 최적의 결과를 위해 에이전트 설정을 조정하세요. "~/datasaker/config.yaml"에서 해당 값을 추가하거나 수정하세요.

다음은 로그 에이전트 구성 파일에서 각각의 설정 항목에 대한 설명입니다.

logAgent:
  logs:
    - service:
      tag: []
      keyword: []
      multiline:
        format:
        pattern: []
      masking:
        - pattern:
          replace:
      collect:
        type:
        category:
        address:
        file:
          paths: []
          exclude_paths: []
        kubernetes:
          - namespace:
            pod:
            container:
Settings Description Default
logs 로그 수집 대상 정보
service 로그 수집 대상의 서비스 이름 default
tag 로그 수집 대상의 태그
keyword 로그 수집 키워드 (키워드가 포함된 로그만 수집)
multiline 멀티라인 로그 수집 설정
format 멀티라인 로그 포맷 (예 : go, java, python)
pattern 멀티라인 로그 패턴 (예 : ^\d{4}-\d{2}-\d{2}) - 사용자 커스텀 정규식 패턴 사용 가능
masking 민감 정보 로그 마스킹 설정
pattern 마스킹할 로그 패턴 (예 : ^\d{4}-\d{2}-\d{2}) - 사용자 커스텀 정규식 패턴 사용 가능
replace 마스킹 패턴이 대체될 문자열 (예 : ******)
collect 로그 수집 대상 설정
type 로그 수집 방법 (file, driver, kubernetes 중 하나의 값을 작성) file
category 서비스 분류 (app, database, syslog, etc 중 하나의 값을 작성) etc
address 데이터베이스 host 및 port 정보 (서비스 분류가 database인 경우 설정)
file 로그 수집 방법이 file 인 경우 설정
paths 로그 수집 대상 경로 (예 : /var/log/sample/*.log) /var/log/*.log
exclude_paths 로그 수집 제외 대상 경로
kubernetes 로그 수집 방법이 kubernetes 인 경우 설정
namespace 로그 수집 대상 네임스페이스 *
pod 로그 수집 대상 파드 이름 *
container 로그 수집 대상 컨테이너 이름 *

쿠버네티스 환경에서 로그 에이전트는 2가지 방법으로 로그를 수집할 수 있습니다.

  • kubernetes : 로그를 수집할 워크로드의 정보를 통해 로그를 수집합니다. 수집할 워크로드의 네임스페이스, 파드 이름, 컨테이너 이름을 설정합니다. (로그 에이전트를 Daemonset으로 배포할 경우, 해당 방법을 사용하세요.)
  • file : 로그 파일을 직접 수집합니다. 수집할 로그를 로그 에이전트에 직접 마운트하고 수집 로그 파일 상대 경로를 설정합니다. (로그 에이전트를 Sidecar패턴으로 배포할 경우, 해당 방법을 사용하세요.)

예를 들어, 쿠버네티스 워크로드 정보를 통해 로그를 수집하는 경우 다음과 같이 구성 파일을 작성할 수 있습니다.

만약 다음과 같은 manifest 파일로 구성된 워크로드가 있다면,

apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx-deployment
 labels:
   app: nginx
spec:
 replicas: 3
 selector:
   matchLabels:
     app: nginx
 template:
   metadata:
     labels:
       app: nginx
   spec:
     containers:
     - name: nginx
       image: nginx:1.14.2
       ports:
       - containerPort: 80

다음과 같이 로그 에이전트 YAML 구성 파일을 작성할 수 있습니다.

cat << EOF >> ~/datasaker/config.yaml
logAgent:
  enabled: true
  logs:
    - collect:
        type: kubernetes
        kubernetes:
          - namespace: default
            pod: nginx-deployment
            container: nginx
EOF

특정 namespace/pod/container 이름의 워크로드에 대해 모든 로그 파일을 수집하고 싶은 경우, 공통된 키워드만 작성하여 해당 키워드가 포함된 모든 워크로드의 로그를 수집할 수 있습니다.

만약, 모든 namespace에 nginx라는 이름이 포함된 pod에 대해 모든 컨테이너의 로그를 수집하고 싶다면, 다음과 같이 구성 파일을 작성할 수 있습니다.
(주의 : namespace/pod/container에 어떠한 값도 작성하지 않으면, 모든 namespace/pod/container에 대해 모든 컨테이너의 로그를 수집합니다.)

cat << EOF >> ~/datasaker/config.yaml
logAgent:
  enabled: true
  logs:
    - collect:
        type: kubernetes
        kubernetes:
          - pod: nginx
EOF

로그 파일을 직접 수집하는 경우는 다음과 같이 구성 파일을 작성할 수 있습니다.

cat << EOF >> ~/datasaker/config.yaml
logAgent:
  enabled: true
  logs:
    - collect:
        type: file
        file:
          paths:
           - /var/log/containers/nginx-deployment*default*nginx*.log
EOF

2. Log agent 설치

helm upgrade datasaker datasaker/agent-helm -n datasaker -f ~/datasaker/config.yaml

Log agent 로그 수집 설정하기

Log agent는 에이전트 구성 YAML 파일을 통해 다중 라인 로그 수집 및 로그 마스킹 설정을 지원합니다.

1. 다중 라인 로그 수집 설정

로그 에이전트 구성 YAML 파일에서 다중 라인 로그 수집 설정을 2가지 방법으로 지원합니다.

  • format : 다중 라인 로그의 포맷을 설정합니다. 현재, go, java, python의 3가지 포맷을 지원합니다.
  • pattern : 다중 라인 로그의 패턴을 설정합니다. 사용자 커스텀 정규식 패턴을 사용할 수 있습니다.
logs:
  - multiline:
      format:
      pattern: []

예를 들어, 다음과 같은 다중 라인 로그가 있다면,

Dec 14 06:41:08 Exception in thread "main" java.lang.RuntimeException: Something has gone wrong, aborting!
    at com.myproject.module.MyProject.badMethod(MyProject.java:22)
    at com.myproject.module.MyProject.oneMoreMethod(MyProject.java:18)
    at com.myproject.module.MyProject.anotherMethod(MyProject.java:14)
    at com.myproject.module.MyProject.someMethod(MyProject.java:10)
    at com.myproject.module.MyProject.main(MyProject.java:6)

format 설정을 통해 다음과 같이 다중 라인 로그를 수집할 수 있습니다.

logs:
  - multiline:
      format: 'java'

[주의] format을 통한 다중 라인 로그를 수집 방법이 모든 패턴의 다중 라인 로그를 수집할 수는 없습니다. 정확한 다중 라인 로그 수집을 위해서는 pattern을 통한 다중 라인 로그 수집 설정을 권장합니다.

다른 방법인 pattern을 통해 다중 라인 로그를 수집할 경우에는 다음과 같이 작성할 수 있습니다.

logs:
  - multiline:
      pattern: 
        - '^\w*\s\d{1,2}\s\d{1,2}\:\d{1,2}\:\d{1,2}'

다중 라인 로그에 대해 로그 시작 부분의 패턴을 작성하면, 해당 패턴으로 시작하는 로그를 기준으로 다중 라인 로그를 수집합니다.

[주의] 로그 에이전트는 다중 라인 로그 수집에서 두 번째 라인부터는 공백으로 시작하는 것으로 판단합니다.

2. 민감 정보 로그 마스킹 설정

로그 에이전트 구성 YAML 파일에서 민감 정보 로그 마스킹 설정을 지원합니다.

  • pattern : 마스킹할 로그 패턴을 설정합니다. 사용자 커스텀 정규식 패턴을 사용할 수 있습니다.
  • replace : 마스킹 패턴이 대체될 문자열을 설정합니다.
logs:
  - masking:
      - pattern:
        replace:

예를 들어, 다음과 같은 로그가 있고,

2023-08-18 06:35:38.993 GMT [739243] LOG:  statement:
            SELECT * 
            FROM address 
            WHERE id = '1234567890';

해당 로그에서 statement: 뒤에 오는 쿼리문을 PRIVATE_QUERY 문자열로 마스킹하고 싶다면, pattern에 다음과 같이 정규식 패턴을 작성하여 마스킹할 수 있습니다.

logs:
  - masking:
      - pattern: 'statement: .*'
        replace: 'statement: PRIVATE_QUERY'