여러 로그 파일을 하나의 디렉터리에 집계

여러 로그 파일을 하나의 디렉터리에 집계

컴퓨터에서 k3s 단일 노드 클러스터를 실행하고 있습니다. 아직 로깅 인프라가 설정되어 있지 않으며 지금은 향후 학습 경험으로 남겨두겠습니다.

해당 k3s에서는 각 작업에 대한 로그를 별도의 파일로 생성하는 일부 크론 작업을 실행합니다. /var/log/containers/cron-job-*호스트 컴퓨터에서 이를 관찰할 수 있습니다 . 이러한 로그는 일정 시간(successfulJobsHistoryLimit: 3)이 지나면 사라집니다. 새 작업 인스턴스는 새 로그 파일을 생성합니다.

가급적이면 파일 이름 패턴을 사용하여 해당 로그 디렉터리를 관찰하고, 생성 중인 새 파일을 포함하여 작은 작업 로그를 단일 로그 파일로 스트리밍/조인할 수 있는 간단한 도구를 찾을 수 없습니다. 파일 이름이 없어져도 상관 없습니다. 로그 줄이 모든 작업 실행의 아카이브 역할을 하는 하나의 파일로 끝나기를 원합니다.

내가 고려한 것은 무엇입니까?

해당 파일을 분류하고 간격을 두고 대상 파일에 추가하는 스크립트를 추가할 수 있지만 작업이 동기화되지 않거나 크론 간격이 변경되는 경우에 이미 삽입된 파일을 추적해야 합니다. 또한 "장기 실행"되는 포드에 대해 이 기능을 확장하고 싶을 수도 있으며 이 경우 로그에서 업데이트된 행을 추적하기 시작해야 합니다.

내가 찾은 모든 예제는 화면의 실시간 테일링을 다루고 있는데 이는 나에게 필요한 것이 아닙니다. 대상 로그 파일에 대한 멀티 테일링이 필요합니다.

어떤 아이디어가 있나요? (일종의 간단한 Kubernetes 로깅 후크 예제도 허용합니다)

답변1

나는 이제 내가 선택한 하나의 솔루션을 제안합니다. 내가 찾던 답은 아니지만, 흐름에 따라 항해하는 것 같은 답이다. 이것이 일반적인 Unix 명령으로 처리될 수 있는지 여전히 궁금합니다.

어쨌든, 내가 한 일은 다음과 같습니다.

일반적인 방법은 다음과 같은 도구를 사용하는 것 같습니다.유창함를 사용하면 다양한 소스에서 로그를 수집하여 적합하다고 판단되는 곳으로 전송할 수 있습니다. 이는 일종의 로그용 ETL입니다.

이미 실행 중인 syslog 서버가 있으므로 로그를 syslog 서버로 보내기로 선택했지만 여기에서 출력 플러그인 중 하나를 선택할 수 있습니다.출력 플러그인. 또한 다음과 같은 다양한 추가 플러그인 세트도 있습니다.모든 플러그인

1 단계

Remote_syslog 플러그인이 설치된 Fluentd 설정을 가져옵니다. 공식 도커 이미지에는 제공되지 않지만 직접 설정할 수 있습니다.

FROM fluent/fluentd:v1.14.0-1.0
USER root

# https://github.com/fluent-plugins-nursery/fluent-plugin-remote_syslog
RUN fluent-gem install fluent-plugin-remote_syslog

USER fluent

이미지를 빌드하고 레지스트리에 푸시합니다.

2 단계

다음으로 포드 로그에 액세스하기 위한 읽기 전용 볼륨 클레임이 포함된 Fluentd 배포 매니페스트를 설정합니다. 실제 파일은 /var/log/pods/*에 있으며 /var/log/containers에는 실제로 심볼릭 링크가 포함되어 있습니다. 실제 파일이 필요합니다. 해당 로그는 호스트 시스템의 루트가 소유하며 일반 유창한 사용자는 이를 읽을 수 있는 액세스 권한이 없습니다. 몇 가지 보안 컨텍스트를 설정해야 합니다. 작업을 수행하기 위해 fsGroup에 루트 그룹을 사용했습니다. 이 보안 측면에서 가장 최적의 솔루션을 더 깊이 파고들어 찾아보고 의견을 제시해 보세요.

apiVersion: apps/v1
kind: Deployment
...
spec:
  ...
    spec:
      securityContext:
        fsGroup: 0
      volumes:
        - name: varlogpods-pv
          persistentVolumeClaim:
            claimName: pvc-var-log-pods
            ...
      containers:
        - name: fluentd
          image: your/fluentd-image

이 요점에서 내 전체 매니페스트를 참조하세요.유창한 배포

3단계

배포하기 전에 거기에서 몇 가지 규칙을 설정 fluent.conf하고 설명해야 합니다.

광산은 다음과 같은 로그 줄과 일치하도록 설정되어 있습니다.

2022-04-26T20:05:00.847016854+03:00 stderr F time="2022-04-26 17:05:00" level=info msg="processing 3 records ..."

tail 플러그인에 대해 더 자세히 알아보려면:꼬리

    <source>
      @type tail
      @id in_tail_container_logs
      path "/var/log/pods/default_cron-*/*/*.log"
      pos_file "/tmp/cron_.log.pos"
      read_from_head true
      tag cron
      <parse>
        @type regexp
        expression /^(?<logtime>[^ ]*) .* level=(?<level>[^ ]*) msg="(?<message>[^"]*)"$/ 
        time_key logtime
        time_format %FT%T.%N%:z
      </parse>
    </source>
    
    <match cron>
     @type remote_syslog
     host 172.16.3.10
     port 514
     protocol udp
     severity info
     program "fluentd"
     hostname "k3sserver"
     
     <buffer>
     </buffer>
     
     <format>
      @type single_value
      message_key message
     </format>
    </match>

여기서 중요한 구성 속성 중 하나는 read_from_head true로그 파일을 위에서부터 읽는 것입니다. 이 시나리오에서는 포드 로그가 순환하기 때문에 Fluentd가 결국 몇 줄의 업데이트 줄이 아닌 전체 포드 로그를 읽기를 원하기 때문에 필요합니다. 짧은 크론 작업의 경우 로그 파일만 나타나고 tail은 로그 파일의 초기 행을 보고하지 않습니다.

4단계

구성을 조정하고 다시 시도해 보세요. configMap에서 구성을 업데이트한 후 배포를 다시 시작하는 것을 잊지 마세요.

검색 기록의 일부 내용:

관련 정보