36.5.3. fluentd


Fluentd는 노드 레이블 선택기에 따라 노드를 배포하는 DaemonSet으로 배포되며, 인벤토리 매개변수 openshift_logging_fluentd_nodeselector 로 지정할 수 있으며 기본값은 logging-infra-fluentd 입니다. OpenShift 클러스터 설치의 일부로 Fluentd 노드 선택기를 지속된 노드 레이블 목록에 추가하는 것이 좋습니다.

Fluentd는 시스템 로그 소스로 journald 를 사용합니다. 운영 체제, 컨테이너 런타임 및 OpenShift의 로그 메시지입니다.

사용 가능한 컨테이너 런타임은 로그 메시지의 소스를 식별하기 위한 최소한의 정보를 제공합니다. 로그 수집 및 로그 정규화는 Pod가 삭제되고 라벨 또는 주석과 같은 API 서버에서 추가 메타데이터를 검색할 수 없는 후에 발생할 수 있습니다.

로그 수집기가 로그를 완료하기 전에 지정된 이름과 네임스페이스가 있는 Pod를 삭제하면 로그 메시지를 유사한 이름의 Pod 및 네임스페이스와 구분할 수 없습니다. 이로 인해 로그를 인덱싱하고 포드를 배포한 사용자가 소유하지 않은 인덱스에 주석을 달 수 있습니다.

중요

사용 가능한 컨테이너 런타임은 로그 메시지의 소스를 식별할 수 있는 최소한의 정보를 제공하며, 고유한 개별 로그 메시지 또는 그러한 메시지의 소스 추적을 보장하지 않습니다.

OpenShift Container Platform 3.9 이상을 설치하면 json-file 을 기본 로그 드라이버로 사용하지만 OpenShift Container Platform 3.7에서 업그레이드된 환경에서는 기존 journald 로그 드라이버 구성이 유지됩니다. json-file 로그 드라이버를 사용하는 것이 좋습니다. 기존 로그 드라이버 구성을 json-file 로 변경하려면 집계된 로깅 드라이버 변경 에서 참조하십시오.

Fluentd 로그 보기

로그를 보는 방법은 LOGGING_FILE_PATH 설정에 따라 다릅니다.

  • LOGGING_FILE_PATH 가 파일을 가리키는 경우 logs 유틸리티를 사용하여 Fluentd 로그 파일의 콘텐츠를 출력합니다.

    oc exec <pod> -- logs 1
    1
    Fluentd Pod의 이름을 지정합니다. 로그 앞에 있는 공간을 확인합니다.

    예를 들면 다음과 같습니다.

    oc exec logging-fluentd-lmvms -- logs

    가장 오래된 로그부터 로그 파일의 내용이 출력됩니다. 로그에 기록되는 내용을 추적하려면 -f 옵션을 사용합니다.

  • LOGGING_FILE_PATH=console 을 사용하는 경우 Fluentd는 로그를 기본 위치인 /var/log/fluentd/fluentd.log 에 씁니다. oc logs -f <pod_name> 명령을 사용하여 로그를 검색할 수 있습니다.

    예를 들면 다음과 같습니다

    oc logs -f fluentd.log

Fluentd 로그 위치 구성

Fluentd는 기본적으로 /var/log/fluentd/fluentd.log 또는 LOGGING_FILE_PATH 환경 변수를 기반으로 지정된 파일에 로그를 작성합니다.

Fluentd 로그의 기본 출력 위치를 변경하려면 기본 인벤토리 파일에서 LOGGING_FILE_PATH 매개변수를 사용합니다. 특정 파일을 지정하거나 Fluentd 기본 위치를 사용할 수 있습니다.

LOGGING_FILE_PATH=console 1
LOGGING_FILE_PATH=<path-to-log/fluentd.log> 2
1
로그 출력을 Fluentd 기본 위치로 전송합니다. oc logs -f <pod_name> 명령을 사용하여 로그를 검색합니다.
2
로그 출력을 지정된 파일로 전송합니다. oc exec <pod_name> UTC-kube-logs 명령을 사용하여 로그를 검색합니다.

이러한 매개변수를 변경한 후 로깅 설치 프로그램 플레이북을 다시 실행합니다.

$ cd /usr/share/ansible/openshift-ansible
$ ansible-playbook [-i </path/to/inventory>] \
    playbooks/openshift-logging/config.yml

Fluentd 로그 순환 구성

현재 Fluentd 로그 파일이 지정된 크기에 도달하면 OpenShift Container Platform의 이름이 fluentd.log 로그 파일의 이름을 자동으로 변경하여 새 로깅 데이터를 수집할 수 있습니다. 로그 회전은 기본적으로 활성화되어 있습니다.

다음 예에서는 최대 로그 크기가 1Mb이고 로그 4개를 유지해야 하는 클러스터의 로그를 보여줍니다. fluentd.log 가 1Mb에 도달하면 OpenShift Container Platform은 현재 fluentd.log.4 를 삭제하고 각 Fluentd 로그의 이름을 차례로 변경하고 새 fluentd.log 를 생성합니다.

fluentd.log     0b
fluentd.log.1  1Mb
fluentd.log.2  1Mb
fluentd.log.3  1Mb
fluentd.log.4  1Mb

Fluentd 로그 파일의 크기와 환경 변수를 사용하여 OpenShift Container Platform이 유지되는 이름 변경 파일 수를 제어할 수 있습니다.

표 36.1. Fluentd 로그 회전 구성을 위한 매개변수
매개변수설명

LOGGING_FILE_SIZE

바이트에 있는 단일 Fluentd 로그 파일의 최대 크기입니다. flientd.log 파일의 크기가 이 값을 초과하면 OpenShift Container Platform에서 fluentd.log.* 파일의 이름을 변경하고 새 fluentd.log 를 생성합니다. 기본값은 1024000(1MB)입니다.

LOGGING_FILE_AGE

Fluentd가 삭제하기 전에 유지되는 로그 수입니다. 기본값은 10 입니다.

예를 들면 다음과 같습니다.

$ oc set env ds/logging-fluentd LOGGING_FILE_AGE=30 LOGGING_FILE_SIZE=1024000"

LOGGING_FILE_PATH=console 을 설정하여 로그 회전을 끕니다. 이로 인해 Fluentd는 Fluentd 기본 위치인 /var/log/fluentd/fluentd.log에 로그를 작성합니다. 여기에서 oc logs -f <pod_name> 명령을 사용하여 검색할 수 있습니다.

$ oc set env ds/fluentd LOGGING_FILE_PATH=console

MERGE_JSON_LOG를 사용하여 로그의 JSON 구문 분석 비활성화

기본적으로 Fluentd는 로그 메시지가 JSON 형식인지 확인하고 메시지를 Elasticsearch에 게시된 JSON 페이로드 문서에 병합합니다.

JSON 구문 분석을 사용할 때 다음과 같은 결과가 나타날 수 있습니다.

  • 일치하지 않는 유형 매핑으로 인해 Elasticsearch가 문서를 거부하여 로그 손실
  • 거부 메시지로 인한 버퍼 스토리지 누수
  • 동일한 이름의 필드의 데이터를 덮어씁니다.

이러한 문제 일부를 완화하는 방법에 대한 자세한 내용은 로그 수집기에서 로그를 정규화하는 방법을 참조하십시오.

이러한 문제를 방지하거나 로그에서 JSON을 구문 분석할 필요가 없는 경우 JSON 구문 분석을 비활성화할 수 있습니다.

JSON 구문 분석을 비활성화하려면 다음을 수행합니다.

  1. 다음 명령을 실행합니다.

    oc set env ds/logging-fluentd MERGE_JSON_LOG=false 1
    1
    이 기능을 비활성화하려면 이 값을 false 로 설정하거나 이 기능을 활성화하려면 true 로 설정합니다.

    Ansible을 실행할 때마다 이 설정이 적용되도록 하려면 Ansible 인벤토리에 openshift_logging_fluentd_merge_json_log="false" 를 추가합니다.

로그 수집기에서 로그를 정규화하는 방법 구성

클러스터 로깅은 데이터베이스 스키마와 같은 특정 데이터 모델을 사용하여 로그 레코드와 해당 메타데이터를 로깅 저장소에 저장합니다. 데이터에는 몇 가지 제한 사항이 있습니다.

  • 실제 로그 메시지를 포함하는 "message" 필드가 있어야 합니다.
  • RFC 3339 형식의 로그 레코드 타임스탬프가 포함된 "@timestamp" 필드가 있어야 합니다.
  • 로그 수준(예: err,info,unknown 등)이 있는 "level" 필드가 있어야 합니다.
참고

데이터 모델에 대한 자세한 내용은 Exported Fields를 참조하십시오.

이러한 요구 사항으로 인해 다양한 하위 시스템에서 수집된 로그 데이터로 충돌과 불일치가 발생할 수 있습니다.

예를 들어 MERGE_JSON_LOG 기능(MERGE_JSON_LOG=true) 기능을 사용하는 경우 애플리케이션이 JSON에 출력을 기록하고 Elasticsearch에서 데이터를 자동으로 구문 분석하여 인덱싱하도록 하는 것이 매우 유용할 수 있습니다. 그러나 이로 인해 다음과 같은 여러 문제가 발생합니다.

  • 필드 이름은 비워 둘 수 있거나 Elasticsearch에서 부적절한 문자를 포함할 수 있습니다.
  • 동일한 네임 스페이스의 다른 애플리케이션이 다른 값 데이터 유형의 동일한 필드 이름을 출력할 수 있습니다.
  • 애플리케이션은 너무 많은 필드를 발송할 수 있습니다.
  • 필드는 클러스터 로깅 기본 제공 필드와 충돌할 수 있습니다.

다음 표에서 Fluentd 로그 수집기 데몬 세트를 편집하고 환경 변수를 설정하여 클러스터 로깅이 서로 다른 소스에서 필드를 처리하는 방법을 구성할 수 있습니다.

  • 정의되지 않은 필드. ViaQ 데이터 모델을 알 수 없는 필드를 정의되지 않은 필드라고 합니다. 분산된 시스템의 로그 데이터에는 정의되지 않은 필드가 포함될 수 있습니다. 데이터 모델을 사용하려면 모든 최상위 필드를 정의하고 설명할 필요가 있습니다.

    매개 변수를 사용하여 OpenShift Container Platform이 잘 알려진 최상위 필드와 충돌하지 않도록 정의되지 않은 필드를 정의되지 않은 최상위 필드로 이동하는 방법을 구성합니다. 정의되지 않은 필드를 최상위 필드에 추가하고 다른 필드를 정의되지 않은 컨테이너로 이동할 수 있습니다.

    정의되지 않은 필드의 특수 문자를 교체하고 정의되지 않은 필드를 JSON 문자열 표현으로 변환할 수도 있습니다. JSON 문자열로 변환하면 나중에 값을 검색하고 맵 또는 배열로 변환할 수 있도록 값의 구조를 유지합니다.

    • 숫자 및 부울과 같은 간단한 스칼라 값은 따옴표가 지정된 문자열로 변경됩니다. 예를 들면 다음과 같습니다. 10"10" 이 됩니다. 3.1415"3.141" 가 되고, false"false" 가 됩니다.
    • 맵/사전 값 및 배열 값은 JSON 문자열 표현으로 변환됩니다. "mapfield":{"key":"value"}"mapfield":"{\"key\":\"value\"}""arrayfield":[1,2,"three"]"arrayfield":"[1,2,\"three\"]가 됩니다.
  • 정의된 필드. 정의된 필드는 로그의 최상위 수준에 표시됩니다. 정의된 필드를 구성할 수 있습니다.

    CDM_DEFAULT_KEEP_FIELDS 매개 변수를 통해 정의된 기본 최상위 필드는 CEE,time,@timestamp,aushape,ci_job,collectd,docker, fedora-ci,fedora-ci 입니다. file,foreman,geoip,hostname,ipaddr4,ipaddr6,kubernetes,level,message,namespace_name,namespace_uuid,offset, openstack,ovirt,pid,pipeline_metadata,service,systemd,태그,testcase,tlog,viaq_msg_id.

    ${CDM_DEFAULT_KEEP_FIELDS} 또는 ${CDM_EXTRA_KEEP_FIELDS} 에 포함되지 않은 필드는 CDM_USE_ UNDEFINED_NAME} (이)가 true 인 경우 ${CDM_UNDEFINED_ NAME} (으)로 이동합니다. 이러한 매개변수에 대한 자세한 내용은 아래 표를 참조하십시오.

    참고

    CDM_DEFAULT_KEEP_FIELDS 매개 변수는 고급 사용자 전용 또는 Red Hat 지원에 의해 지시된 경우입니다.

  • 빈 필드. 빈 필드에는 데이터가 없습니다. 로그에서 유지할 빈 필드를 결정할 수 있습니다.
표 36.2. 로그 정규화를 위한 환경 매개변수
매개 변수정의예제

CDM_EXTRA_KEEP_FIELDS

CDM_DEFAULT_KEEP_FIELDS 외에도 로그의 최상위 수준에서 유지할 정의된 추가 필드 세트를 지정합니다. 기본값은 ""입니다.

CDM_EXTRA_KEEP_FIELDS="broker"

CDM_KEEP_EMPTY_FIELDS

비어 있는 경우에도 CSV 형식으로 유지할 필드를 지정합니다. 정의되지 않은 빈 필드가 삭제됩니다. 기본값은 "message"입니다. 빈 메시지를 유지합니다.

CDM_KEEP_EMPTY_FIELDS="message"

CDM_USE_UNDEFINED

정의되지 않은 필드를 정의되지 않은 최상위 필드로 이동하려면 true 로 설정합니다. 기본값은 false입니다. true인 경우 CDM_DEFAULT_KEEP_FIELDSCDM_EXTRA_KEEP_FIELDS값이 정의되지 않은 값으로 이동되지 않습니다.

CDM_USE_UNDEFINED=true

CDM_UNDEFINED_NAME

CDM_USE_UNDEFINED 를 사용하는 경우 정의되지 않은 최상위 필드의 이름을 지정합니다. 기본값은 undefined'입니다. CDM_USE_UNDEFINEDtrue인 경우에만 활성화됩니다.

CDM_UNDEFINED_NAME="undef"

CDM_UNDEFINED_MAX_NUM_FIELDS

정의되지 않은 필드 수가 이 수보다 크면 모든 정의되지 않은 필드가 JSON 문자열 표현으로 변환되고 CDM_UNDEFINED_NAME 필드에 저장됩니다. 레코드에 정의되지 않은 필드 값이 이보다 많은 경우 이러한 필드에 추가 처리가 수행되지 않습니다. 대신 필드는 최상위 CDM_UNDEFINED_NAME 필드에 저장된 단일 문자열 JSON 값으로 변환됩니다. 기본값을 -1 로 유지하면 정의되지 않은 무제한 필드가 허용되므로 권장되지 않습니다.

알림: 이 매개변수는 CDM_USE_UNDEFINED 가 false인 경우에도 적용됩니다.

CDM_UNDEFINED_MAX_NUM_FIELDS=4

CDM_UNDEFINED_TO_STRING

정의되지 않은 모든 필드를 JSON 문자열 표시로 변환하려면 true 로 설정합니다. 기본값은 false입니다.

CDM_UNDEFINED_TO_STRING=true

CDM_UNDEFINED_DOT_REPLACE_CHAR

정의되지 않은 필드에서 점 문자 '.' 대신 사용할 문자를 지정합니다. MERGE_JSON_LOGtrue 여야 합니다. 기본값은 UNUSED 입니다. MERGE_JSON_LOG 매개변수를 true로 설정하면 아래 참고 사항을 참조하십시오.

CDM_UNDEFINED_DOT_REPLACE_CHAR="_"

참고

Fluentd 로그 수집기 데몬 세트 및 CDM _UNDEFINED_TO_STRING 환경 변수에서 MERGE_JSON_ LOG 매개변수를 true로 설정하면 Elasticsearch 400 오류가 표시될 수 있습니다. MERGE_JSON_LOG=true 인 경우 로그 수집기는 문자열 이외의 데이터 유형에 필드를 추가합니다. CDM_UNDEFINED_TO_STRING=true 를 설정하면 로그 수집기에서 해당 필드를 문자열 값으로 추가하려고 시도하여 Elasticsearch 400 오류가 발생합니다. 로그 수집기가 다음 날 로그의 인덱스를 롤오버할 때 오류가 지워집니다.

로그 수집기는 인덱스를 롤오버할 때 완전히 새 인덱스를 생성합니다. 필드 정의가 업데이트되고 400 오류가 발생하지 않습니다. 자세한 내용은 Setting MERGE_JSON_LOG 및 CDM_UNDEFINED_TO_STRING 을 참조하십시오.

정의되지 않은 빈 필드 처리를 구성하려면 logging-fluentd daemonset를 편집합니다.

  1. 필요에 따라 필드를 처리하는 방법을 구성합니다.

    1. CDM_EXTRA_KEEP_FIELDS 를 사용하여 이동할 필드를 지정합니다.
    2. CSV 형식의 CDM_KEEP_EMPTY_FIELDS 매개변수에 유지할 빈 필드를 지정합니다.
  2. 필요에 따라 정의되지 않은 필드를 처리하는 방법을 구성합니다.

    1. 정의되지 않은 필드를 최상위 수준의 정의되지 않은 필드로 이동하려면 CDM_USE_UNDEFINEDtrue설정합니다.
    2. CDM_UNDEFINED_NAME 매개 변수를 사용하여 정의되지 않은 필드의 이름을 지정합니다.
    3. CDM_UNDEFINED_MAX_NUM_FIELDS 를 기본값 -1 이외의 값으로 설정하여 단일 레코드에서 정의되지 않은 필드 수에 상한값을 설정합니다.
  3. 정의되지 않은 필드 이름의 문자를 다른 문자로 변경하려면 CDM_UNDEFINED_DOT_REPLACE_CHAR 을 지정합니다. 예를 들어 CDM_UNDEFINED_DOT_REPLACE_CHAR=@@@@@@ 인 경우, 필드 foo@@@bar@@baz 로 변환됩니다.
  4. 정의되지 않은 필드를 JSON 문자열 표현으로 변환하려면 UNDEFINED_TO_STRINGtrue 로 설정합니다.
참고

CDM_UNDEFINED_TO_STRING 또는 CDM_ UNDEFINED_MAX_NUM_FIELDS 매개변수를 구성하는 경우 CDM_UNDEFINED_NAME 을 사용하여 정의되지 않은 필드 이름을 변경합니다. CDM_UNDEFINED_TO_STRING 또는 CDM_ UNDEFINED_MAX_NUM_FIELDS 가 정의되지 않은 필드의 값 유형을 변경할 수 있기 때문에 이 필드가 필요합니다. CDM_UNDEFINED_TO_STRING 또는 CDM_UNDEFINED_MAX_NUM_FIELDS 가 true로 설정되어 로그에 정의되지 않은 필드가 더 많은 경우 값 유형은 문자열이 됩니다. Elasticsearch는 JSON에서 JSON 문자열로 값 유형이 변경되면 레코드 수락을 중지합니다.

예를 들어 CDM_UNDEFINED_TO_STRINGfalse 이거나 CDM_UNDEFINED_MAX_NUM_FIELDS 가 기본값인 경우 정의되지 않은 필드의 값 유형은 json 입니다. CDM_UNDEFINED_MAX_NUM_FIELDS 를 default 이외의 값으로 변경하고 로그에 정의되지 않은 필드가 더 많은 경우 값 유형은 문자열(JSON 문자열 )이 됩니다. 값 유형이 변경되면 Elasticsearch는 레코드 수락을 중지합니다.

MERGE_JSON_LOG 및 CDM_UNDEFINED_TO_STRING 설정

MERGE_JSON_LOG 및 CDM_ UNDEFINED_TO_STRING 환경 변수를 true로 설정하면 Elasticsearch 400 오류가 발생할 수 있습니다. MERGE_JSON_LOG=true 인 경우 로그 수집기는 문자열 이외의 데이터 유형에 필드를 추가합니다. CDM_UNDEFINED_TO_STRING=true 를 설정하면 Fluentd가 해당 필드를 문자열 값으로 추가하려고 시도하여 Elasticsearch 400 오류가 발생합니다. 다음 날 인덱스가 롤오버될 때 오류가 지워집니다.

Fluentd가 다음 날의 로그에 대한 인덱스를 롤오버하면 완전히 새 인덱스가 생성됩니다. 필드 정의가 업데이트되고 400 오류가 발생하지 않습니다.

스키마 위반, 손상된 데이터 등 하드 오류가 있는 레코드는 재시도할 수 없습니다. 로그 수집기는 오류 처리를 위해 레코드를 전송합니다. Fluentd 구성에 <label @ERROR> 섹션을 추가하는 경우 마지막 <label> 으로 필요에 따라 이러한 레코드를 처리할 수 있습니다.

예를 들면 다음과 같습니다.

data:
  fluent.conf:

....

    <label @ERROR>
      <match **>
        @type file
        path /var/log/fluent/dlq
        time_slice_format %Y%m%d
        time_slice_wait 10m
        time_format %Y%m%dT%H%M%S%z
        compress gzip
      </match>
    </label>

이 섹션에서는 Elasticsearch 배달 못 한 큐(DLQ) 파일에 오류 레코드를 작성합니다. 파일 출력에 대한 자세한 내용은 fluentd 문서를 참조하십시오.

그런 다음 파일을 편집하여 레코드를 수동으로 정리하고 Elasticsearch /_bulk 인덱스 API와 함께 사용하도록 파일을 편집하고 cURL을 사용하여 해당 레코드를 추가할 수 있습니다. Elasticsearch 대량 API에 대한 자세한 내용은 Elasticsearch 설명서를 참조하십시오.

여러 줄 Docker 로그에 참여

Docker 로그 부분 조각에서 전체 로그 레코드를 재구성하도록 Fluentd를 구성할 수 있습니다. 이 기능을 활성화하면 Fluentd는 여러 줄의 Docker 로그를 읽고 재구축하며 누락된 데이터가 없는 Elasticsearch에 로그를 하나의 레코드로 저장합니다.

그러나 이 기능을 사용하면 성능 저하가 발생할 수 있으므로 기능은 기본적으로 꺼져 수동으로 활성화해야 합니다.

다음 Fluentd 환경 변수는 여러 줄의 Docker 로그를 처리하도록 클러스터 로깅을 구성합니다.

매개변수설명

USE_MULTILINE_JSON

json-file 로그 드라이버를 사용할 때 다중 줄 Docker 로그를 처리하려면 true 로 설정합니다. 이 매개변수는 기본적으로 false 로 설정됩니다.

USE_MULTILINE_JOURNAL

the journald 로그 드라이버를 사용할 때 여러 줄 Docker 로그를 처리하려면 Fluentd를 true 로 설정합니다. Fluentd는 Docker 로그 부분 조각에서 전체 로그 레코드를 재구축합니다. 이 매개변수는 기본적으로 false 로 설정됩니다.

다음 명령을 사용하여 사용 중인 로그 드라이버를 확인할 수 있습니다.

$ docker info | grep -i log

다음 중 하나는 출력입니다.

Logging Driver: json-file
Logging Driver: journald

여러 줄의 Docker 로그 처리를 활성화하려면 다음을 수행합니다.

  1. 다음 명령을 사용하여 여러 줄의 Docker 로그를 활성화합니다.

    • json-file 로그 드라이버의 경우 다음을 수행합니다.

      oc set env daemonset/logging-fluentd USE_MULTILINE_JSON=true
    • the journald 로그 드라이버의 경우:

      oc set env daemonset/logging-fluentd USE_MULTILINE_JOURNAL=true

    클러스터 재시작의 Fluentd Pod입니다.

외부 로그 집계기로 로그를 보내도록 Fluentd 구성

secure-forward 플러그인을 사용하여 기본 Elasticsearch 외에도 로그 사본을 외부 로그 집계기로 전송하도록 Fluentd를 구성할 수 있습니다. 여기에서 로컬 호스팅 Fluentd가 처리한 후 로그 레코드를 추가로 처리할 수 있습니다.

중요

클라이언트 인증서로 secure_foward 플러그인을 구성할 수 없습니다. 인증은 SSL/TLS 프로토콜을 통해 실행할 수 있지만 shared_key 및 대상 Fluentdsecure_foward 입력 플러그인을 사용하여 구성해야 합니다.

로깅 배포는 외부 집계기를 구성하기 위해 Fluentd 구성 맵에 secure-forward.conf 섹션을 제공합니다.

<store>
@type secure_forward
self_hostname pod-${HOSTNAME}
shared_key thisisasharedkey
secure yes
enable_strict_verification yes
ca_cert_path /etc/fluent/keys/your_ca_cert
ca_private_key_path /etc/fluent/keys/your_private_key
ca_private_key_passphrase passphrase
<server>
  host ose1.example.com
  port 24284
</server>
<server>
  host ose2.example.com
  port 24284
  standby
</server>
<server>
  host ose3.example.com
  port 24284
  standby
</server>
</store>

이 작업은 oc edit 명령을 사용하여 업데이트할 수 있습니다.

$ oc edit configmap/logging-fluentd

secure-forward.conf 에서 사용할 인증서는 Fluentd Pod에 마운트된 기존 보안에 추가할 수 있습니다. your_ca_certyour_private_key 값은 configmap/logging-fluentdsecure-forward.conf 에 지정된 값과 일치해야 합니다.

$ oc patch secrets/logging-fluentd --type=json \
  --patch "[{'op':'add','path':'/data/your_ca_cert','value':'$(base64 -w 0 /path/to/your_ca_cert.pem)'}]"
$ oc patch secrets/logging-fluentd --type=json \
  --patch "[{'op':'add','path':'/data/your_private_key','value':'$(base64 -w 0 /path/to/your_private_key.pem)'}]"
참고

your_private_key 를 일반 이름으로 바꿉니다. 이것은 호스트 시스템의 경로가 아닌 JSON 경로에 대한 링크입니다.

외부 집계기를 구성할 때 Fluentd에서 메시지를 안전하게 수락할 수 있어야 합니다.

외부 집계기가 또 다른 Fluentd 서버인 경우 fluent-plugin-secure-forward 플러그인이 설치되어 있어야 하며 입력 플러그인을 사용해야 합니다.

<source>
  @type secure_forward

  self_hostname ${HOSTNAME}
  bind 0.0.0.0
  port 24284

  shared_key thisisasharedkey

  secure yes
  cert_path        /path/for/certificate/cert.pem
  private_key_path /path/for/certificate/key.pem
  private_key_passphrase secret_foo_bar_baz
</source>

fluent-plugin-secure-forward 리포지토리에서 fluent-plugin-secure-forward 플러그인을 설정하는 방법에 대한 추가 설명을 확인할 수 있습니다.

Fluentd에서 API 서버로 연결 수 감소

중요

MUX 는 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원하지 않으며, 기능상 완전하지 않을 수 있어 프로덕션에 사용하지 않는 것이 좋습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.

Red Hat 기술 프리뷰 기능 지원 범위에 대한 자세한 내용은 https://access.redhat.com/support/offerings/techpreview/를 참조하십시오.

MUX 는 Secure Forward listener 서비스입니다.

매개변수설명

openshift_logging_use_mux

기본값은 False 로 설정됩니다. True 로 설정하면 라는 서비스가 배포됩니다. 이 서비스는 클러스터에서 실행되는 노드 에이전트 Fluentd 데몬 세트의 Fluentd secure_forward 집계기 역할을 합니다. openshift_logging_use_mux 를 사용하여 OpenShift API 서버에 대한 연결 수를 줄이고 Fluentd의 각 노드를 구성하여 원시 로그를 보내고 Kubernetes 메타데이터 플러그인을 끕니다. 이를 위해서는 openshift_logging_mux_client_mode 를 사용해야 합니다.

openshift_logging_mux_client_mode

openshift_logging_mux_client_mode 의 값은 최소 이고 최대값 이며 기본값이 없습니다. openshift_logging_mux_client_mode 로 인해 Fluentd 노드 에이전트가 직접 Elasticsearch가 아닌 mux에 로그를 보냅니다. 최대값 Fluentd가 레코드를 전송하기 전에 노드에서 가능한 한 많은 처리를 수행함을 의미합니다. 사용 최대값이 권장 됩니다. 최소한의 값은 Fluentd가 전혀 처리되지 않음을 의미하며 처리를 위해 원시 로그를 보냅니다. 최소 값을 사용하지 않는 것이 좋습니다.

openshift_logging_mux_allow_external

기본값은 False 로 설정됩니다. True 로 설정되면 the mux 서비스가 배포되고 클러스터 외부에서 실행되는 Fluentd 클라이언트가 secure_forward 를 사용하여 로그를 보낼 수 있도록 구성됩니다. 이를 통해 OpenShift 로깅을 OpenShift 클러스터 또는 기타 OpenShift 클러스터 이외의 클라이언트의 중앙 로깅 서비스로 사용할 수 있습니다.

openshift_logging_mux_hostname

기본 is muxopenshift_master_default_subdomain. 이는 external_clients가 to mux 연결에 사용할 호스트 이름이며 TLS 서버 인증서 제목에서 사용됩니다.

openshift_logging_mux_port

24284

openshift_logging_mux_cpu_limit

500M

openshift_logging_mux_memory_limit

2Gi

openshift_logging_mux_default_namespaces

기본 is mux-undefined. 목록의 첫 번째 값은 정의되지 않은 프로젝트에 사용할 네임스페이스이며, 기본적으로 생성할 추가 네임스페이스입니다. 일반적으로 이 값을 설정할 필요가 없습니다.

openshift_logging_mux_namespaces

기본값은 비어 있으므로 추가 네임스페이스가 external mux 클라이언트가 로그와 연결할 수 있도록 만들 수 있습니다. 이 값을 설정해야 합니다.

Fluentd의 제한 로그

특히 상세한 프로젝트의 경우 관리자는 처리하기 전에 Fluentd에서 로그를 읽는 비율을 제한할 수 있습니다.

주의

제한은 구성된 프로젝트의 뒤처진 로그 집계에 기여할 수 있습니다. Fluentd가 발견되기 전에 Pod를 삭제하면 로그 항목이 손실될 수 있습니다.

참고

systemd 저널을 로그 소스로 사용할 때는 제한이 작동하지 않습니다. 제한 구현은 각 프로젝트의 개별 로그 파일 읽기를 제한하는 데 따라 다릅니다. 저널에서 읽을 때 하나의 로그 소스만 있고 로그 파일이 없으므로 파일 기반 제한은 사용할 수 없습니다. Fluentd 프로세스로 읽은 로그 항목을 제한하는 방법은 없습니다.

제한해야 하는 프로젝트를 Fluentd에 알리려면 배포 후 ConfigMap에서 스로틀 구성을 편집합니다.

$ oc edit configmap/logging-fluentd

throttle-config.yaml 키 형식은 프로젝트 이름과 각 노드에서 로그를 읽는 원하는 속도가 포함된 YAML 파일입니다. 기본값은 노드당 한 번에 1000행입니다. 예를 들면 다음과 같습니다.

  • 프로젝트
project-name:
  read_lines_limit: 50

second-project-name:
  read_lines_limit: 100
  • 로깅
logging:
  read_lines_limit: 500

test-project:
  read_lines_limit: 10

.operations:
  read_lines_limit: 100

Fluentd를 변경하려면 구성을 변경하고 Fluentd Pod를 다시 시작하여 변경 사항을 적용합니다. Elasticsearch를 변경하려면 먼저 Fluentd를 축소한 다음 Elasticsearch를 0으로 축소해야 합니다. 변경을 수행한 후 Elasticsearch를 먼저 스케일링한 다음 Fluentd를 원래 설정으로 다시 조정합니다.

Elasticsearch를 0으로 확장하려면 다음을 수행합니다.

$ oc scale --replicas=0 dc/<ELASTICSEARCH_DC>

daemonset 구성에서 nodeSelector를 0과 일치하도록 변경합니다.

Fluentd 노드 선택기를 가져옵니다.

$ oc get ds logging-fluentd -o yaml |grep -A 1 Selector
     nodeSelector:
       logging-infra-fluentd: "true"

oc patch 명령을 사용하여 daemonset nodeSelector를 수정합니다.

$ oc patch ds logging-fluentd -p '{"spec":{"template":{"spec":{"nodeSelector":{"nonexistlabel":"true"}}}}}'

Fluentd 노드 선택기를 가져옵니다.

$ oc get ds logging-fluentd -o yaml |grep -A 1 Selector
     nodeSelector:
       "nonexistlabel: "true"

Elasticsearch를 0에서 백업합니다.

$ oc scale --replicas=# dc/<ELASTICSEARCH_DC>

daemonset 구성의 nodeSelector를 logging-infra-fluentd: "true"로 다시 변경합니다.

oc patch 명령을 사용하여 daemonset nodeSelector를 수정합니다.

oc patch ds logging-fluentd -p '{"spec":{"template":{"spec":{"nodeSelector":{"logging-infra-fluentd":"true"}}}}}'

버퍼 Chunk 제한 튜닝

Fluentd 로거가 많은 로그를 유지할 수 없는 경우 메모리 사용량을 줄이고 데이터 손실을 방지하기 위해 파일 버퍼링으로 전환해야 합니다.

Fluentd buffer_chunk_limit 는 기본값 8m 이 있는 환경 변수 BUFFER_SIZE_LIMIT 로 결정됩니다. 출력당 파일 버퍼 크기는 기본값이 256Mi 인 환경 변수 FILE_BUFFER_LIMIT 로 결정됩니다. 영구 볼륨 크기는 FILE_BUFFER_LIMIT 보다 커야 합니다.

Fluentd 및 Mux Pod에서 영구 볼륨 /var/lib/fluentd 는 PVC 또는 hostmount에서 준비해야 합니다(예:). 그런 다음 해당 영역은 파일 버퍼에 사용됩니다.

buffer_typebuffer_path 는 다음과 같이 Fluentd 구성 파일에 구성됩니다.

$ egrep "buffer_type|buffer_path" *.conf
output-es-config.conf:
  buffer_type file
  buffer_path `/var/lib/fluentd/buffer-output-es-config`
output-es-ops-config.conf:
  buffer_type file
  buffer_path `/var/lib/fluentd/buffer-output-es-ops-config`
filter-pre-mux-client.conf:
  buffer_type file
  buffer_path `/var/lib/fluentd/buffer-mux-client`

Fluentd buffer_queue_limit 는 variable BUFFER_QUEUE_LIMIT 의 값입니다. 이 값은 기본적으로 32 입니다.

환경 변수 BUFFER_QUEUE_LIMIT(FILE_BUFFER_LIMIT / (number_of_outputs * BUFFER_SIZE_LIMIT) 로 계산됩니다.

BUFFER_QUE_LIMIT 변수에 기본 값 세트가 있는 경우:

  • FILE_BUFFER_LIMIT = 256Mi
  • number_of_outputs = 1
  • BUFFER_SIZE_LIMIT = 8Mi

buffer_queue_limit 값은 32 가 됩니다. buffer_queue_limit 를 변경하려면 FILE_BUFFER_LIMIT 값을 변경해야 합니다.

이 공식에서 number_of_outputs 는 모든 로그 단일 리소스에 전송되고 추가 리소스마다 1 씩 증가합니다. 예를 들어 number_of_outputs 값은 다음과 같습니다.

  • 1 - 모든 로그가 단일 ElasticSearch Pod로 전송되는 경우
  • 2 - 애플리케이션 로그가 ElasticSearch Pod로 전송되고 ops 로그가 다른 ElasticSearch Pod로 전송되는 경우
  • 4 - 애플리케이션 로그가 ElasticSearch Pod로 전송되면 ops 로그가 다른 ElasticSearch Pod로 전송되고 둘 다 다른 Fluentd 인스턴스로 전달됩니다.
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.