11.13. Loki로 로그 전달
내부 기본 OpenShift Container Platform Elasticsearch 인스턴스 대신 외부 Loki 로깅 시스템으로 로그를 전달할 수 있습니다.
Loki에 대한 로그 전달을 구성하려면 Loki에 대한 출력과 출력을 사용하는 파이프라인이 있는 ClusterLogForwarder
사용자 정의 리소스(CR)를 생성해야 합니다. Loki의 출력은 HTTP(비보안) 또는 HTTPS(보안 HTTP) 연결을 사용할 수 있습니다.
사전 요구 사항
-
CR의
url
필드로 지정하는 URL에서 Loki 로깅 시스템을 실행해야 합니다.
절차
ClusterLogForwarder
CR 오브젝트를 정의하는 YAML 파일을 생성하거나 편집합니다.apiVersion: "logging.openshift.io/v1" kind: ClusterLogForwarder metadata: name: instance 1 namespace: openshift-logging 2 spec: outputs: - name: loki-insecure 3 type: "loki" 4 url: http://loki.insecure.com:3100 5 loki: tenantKey: kubernetes.namespace_name labelKeys: kubernetes.labels.foo - name: loki-secure 6 type: "loki" url: https://loki.secure.com:3100 secret: name: loki-secret 7 loki: tenantKey: kubernetes.namespace_name 8 labelKeys: kubernetes.labels.foo 9 pipelines: - name: application-logs 10 inputRefs: 11 - application - audit outputRefs: 12 - loki-secure
- 1
ClusterLogForwarder
CR의 이름은instance
여야 합니다.- 2
ClusterLogForwarder
CR의 네임스페이스는openshift-logging
이어야 합니다.- 3
- 출력 이름을 지정합니다.
- 4
- 유형을
"loki"
로 지정합니다. - 5
- Loki 시스템의 URL 및 포트를 유효한 절대 URL로 지정합니다.
http
(비보안) 또는https
(보안 HTTP) 프로토콜을 사용할 수 있습니다. CIDR 주석을 사용하는 클러스터 전체 프록시가 활성화된 경우 출력은 IP 주소가 아닌 서버 이름 또는 FQDN이어야 합니다. Loki의 기본 HTTP(S) 통신 포트는 3100입니다. - 6
- 보안 연결의 경우
secret
을 지정하여 인증하는https
또는http
URL을 지정할 수 있습니다. - 7
https
접두사의 경우 TLS 통신의 엔드포인트에 필요한 보안 이름을 지정합니다. 시크릿은openshift-logging
프로젝트에 있어야 하며 해당하는 각 인증서를 가리키는 tls.crt,tls.key 및 ca-bundle.crt 키가 있어야 합니다. 그러지 않으면http
및https
접두사의 경우 사용자 이름과 암호가 포함된 시크릿을 지정할 수 있습니다. 자세한 내용은 다음 "사용자 이름 및 암호가 포함된 시크릿 설정 예"를 참조하십시오.- 8
- 선택 사항: meta-data 키 필드를 지정하여 Loki의
TenantID
필드 값을 생성합니다. 예를 들어tenantKey: kubernetes.namespace_name
을 설정하면 Kubernetes 네임스페이스의 이름이 Loki의 테넌트 ID 값으로 사용됩니다. 지정할 수 있는 다른 로그 레코드 필드를 보려면 다음 "추가 리소스" 섹션의 "로그 레코드 필드" 링크를 참조하십시오. - 9
- 선택 사항: 기본 Loki 레이블을 대체할 meta-data 필드 키 목록을 지정합니다. Loki 레이블 이름은 정규식
[a-zA-Z_:][a-zA-Z0-9_:]*
와 일치해야 합니다. 메타 데이터 키의 잘못된 문자는 레이블 이름을 형성하기 위해_
로 대체됩니다. 예를 들어kubernetes.labels.foo
메타 데이터 키는 Loki 레이블kubernetes_labels_foo
가 됩니다.labelKeys
를 설정하지 않으면 기본값은[log_type, kubernetes.namespace_name, kubernetes.pod_name, kubernetes_host]
입니다. Loki는 허용되는 레이블의 크기와 수를 제한하므로 레이블 세트를 작게 유지합니다. Configuring Loki, limits_config를 참조하십시오. 쿼리 필터를 사용하여 로그 레코드 필드를 기반으로 쿼리할 수 있습니다. - 10
- 선택사항: 파이프라인의 이름을 지정합니다.
- 11
- 파이프라인을 사용하여 전달할 로그 유형 (
application,
infrastructure
, 또는audit
)을 지정합니다. - 12
- 이 파이프라인으로 로그를 전달할 때 사용할 출력 이름을 지정합니다.
참고Loki는 타임스탬프에 의해 로그 스트림을 올바르게 정렬해야 하므로
labelKeys
에는 항상kubernetes_host
레이블 세트가 포함됩니다. 이렇게 하면 각 스트림이 단일 호스트에서 시작되도록 하여 서로 다른 호스트의 클록 차이로 인해 타임스탬프가 무질서해지는 것을 방지할 수 있습니다.CR 오브젝트를 생성합니다.
$ oc create -f <file-name>.yaml
11.13.1. Loki 속도 제한 오류 문제 해결
로그 전달자 API에서 속도 제한을 초과하는 대규모 메시지 블록을 Loki로 전달하면 Loki는 속도 제한(429
) 오류를 생성합니다.
이러한 오류는 정상적인 작동 중에 발생할 수 있습니다. 예를 들어 로깅 하위 시스템을 이미 일부 로그가 있는 클러스터에 추가할 때 로깅 하위 시스템이 모든 기존 로그 항목을 수집하는 동안 속도 제한 오류가 발생할 수 있습니다. 이 경우 새 로그 추가 속도가 총 속도 제한보다 작으면 기록 데이터가 결국 수집되고 사용자 개입 없이도 속도 제한 오류가 해결됩니다.
속도 제한 오류가 계속 발생하는 경우 LokiStack
CR(사용자 정의 리소스)을 수정하여 문제를 해결할 수 있습니다.
LokiStack
CR은 Grafana 호스팅 Loki에서 사용할 수 없습니다. 이는 Grafana 호스팅 Loki 서버에는 적용되지 않습니다.
조건
- Log Forwarder API는 로그를 Loki로 전달하도록 구성되어 있습니다.
시스템에서 2MB보다 큰 메시지 블록을 Loki로 보냅니다. 예를 들면 다음과 같습니다.
"values":[["1630410392689800468","{\"kind\":\"Event\",\"apiVersion\":\ ....... ...... ...... ...... \"received_at\":\"2021-08-31T11:46:32.800278+00:00\",\"version\":\"1.7.4 1.6.0\"}},\"@timestamp\":\"2021-08-31T11:46:32.799692+00:00\",\"viaq_index_name\":\"audit-write\",\"viaq_msg_id\":\"MzFjYjJkZjItNjY0MC00YWU4LWIwMTEtNGNmM2E5ZmViMGU4\",\"log_type\":\"audit\"}"]]}]}
oc logs -n openshift-logging -l component=collector
를 입력하면 클러스터의 수집기 로그에 다음 오류 메시지 중 하나가 포함된 행이 표시됩니다.429 Too Many Requests Ingestion rate limit exceeded
Vector 오류 메시지의 예
2023-08-25T16:08:49.301780Z WARN sink{component_kind="sink" component_id=default_loki_infra component_type=loki component_name=default_loki_infra}: vector::sinks::util::retries: Retrying after error. error=Server responded with an error: 429 Too Many Requests internal_log_rate_limit=true
Fluentd 오류 메시지의 예
2023-08-30 14:52:15 +0000 [warn]: [default_loki_infra] failed to flush the buffer. retry_times=2 next_retry_time=2023-08-30 14:52:19 +0000 chunk="604251225bf5378ed1567231a1c03b8b" error_class=Fluent::Plugin::LokiOutput::LogPostError error="429 Too Many Requests Ingestion rate limit exceeded for user infrastructure (limit: 4194304 bytes/sec) while attempting to ingest '4082' lines totaling '7820025' bytes, reduce log volume or contact your Loki administrator to see if the limit can be increased\n"
이 오류는 수신 끝점에도 표시됩니다. 예를 들어 LokiStack ingester Pod에서 다음을 수행합니다.
Loki ingester 오류 메시지의 예
level=warn ts=2023-08-30T14:57:34.155592243Z caller=grpc_logging.go:43 duration=1.434942ms method=/logproto.Pusher/Push err="rpc error: code = Code(429) desc = entry with timestamp 2023-08-30 14:57:32.012778399 +0000 UTC ignored, reason: 'Per stream rate limit exceeded (limit: 3MB/sec) while attempting to ingest for stream
절차
LokiStack
CR에서ingestionBurstSize
및ingestionRate
필드를 업데이트합니다.apiVersion: loki.grafana.com/v1 kind: LokiStack metadata: name: logging-loki namespace: openshift-logging spec: limits: global: ingestion: ingestionBurstSize: 16 1 ingestionRate: 8 2 # ...
- 1
ingestionBurstSize
필드는 배포자 복제본당 최대 로컬 속도 제한 샘플 크기를 MB로 정의합니다. 이 값은 하드 제한입니다. 이 값을 단일 푸시 요청에 예상되는 최대 로그 크기로 설정합니다.ingestionBurstSize
값보다 큰 단일 요청은 허용되지 않습니다.- 2
ingestionRate
필드는 초당 수집된 샘플의 최대 양(MB)에 대한 소프트 제한입니다. 로그 비율이 제한을 초과하는 경우 속도 제한 오류가 발생하지만 수집기는 로그를 다시 시도합니다. 총 평균이 제한보다 작으면 사용자 개입 없이 시스템을 복구하고 오류가 해결됩니다.
추가 리소스